golangでUPnPのポートフォワーディングをしてみる3−不定形のXMLをどうにかしたい [プログラミング]
前回、とりあえずXMLをパースする方針ができました。できたのですが、ルーターのXMLには数々の問題があり一筋縄にはいきません。問題を挙げておきます。
1. XMLが定型ではなく、ルーターによって構造がまちまち。
2. XMLがUTF-8でない場合があって読み込み時にエラーが出る。
というかなりクソッタレな状況になっていて、まともにUPnPを使ってポートフォワーディングができる状況ではありません。各メーカーが決まりを守っていれば問題ないのですが、やりたい放題でまともに動く状況になってはいません。
自分の状況を述べますと、無線LANルーターを二つ見ました。NECのAtermとIOデータのWN-G300Rです。AtermはXMLの構造がどうにも深くて、Golangでは構造体を規定してのデータ取り込みが困難でした。このネスト構造が本当にXMLのフォーマットとして規定されているものなのか疑問に思い、他のルーターを見てみました。
WN-G300Rを見てみると、ネストもそんなに深くなくシンプルだったので、Atermの深さがちょっと異常というのが何となく分かりました。その後のパースを比較的シンプルなXMLだったWN-G300Rに変えて検証してみていると、UTF-8以外のコードが含まれており、やり方によってはGolangで以下のようなエラーが出てしまうのでした。
そもそもXMLのURLをブラウザでアクセスしても、パーシングでエラーが出ていたのでおかしいなとは思ってはいたのです。
IOデータの作った技術者が日本語エディタかなんかで編集してUTF-8の設定にしていなかったんですね、たぶん。そうじゃないとUTF-8外のデータが入り込むということは考えにくい。技術者だったら日本語の取り扱いぐらいは慎重にしておくべきですよね。ちょっと恥ずかしい。
XMLの形がちょっと独自すぎたり、そもそもXMLの体をなしていなかったりするので、正直言ってUPnPをポートフォワーディングで使うのは厳しい。問題を乗り越えるのにすべきことはいくつかあり、それを全部乗り越えるには正規の手続きではやりにくいと思われます。やれることとしては
・XMLにUTF-8以外のキャラクターが出てきても無視できるようにする。
・XMLの構造はあてにできないので、タグを一つ一つクロールして該当の部分だけ抜き出す。
ぐらいのものでしょうか。ポートフォワードが可能でなくても、決め打ちでメッセージを発行できるところはあるものの、ルーターごとに違う設定になっている部分はやっぱりXMLから抽出しないとできないので、パーシングは必要不可欠なのです。というか、完全に開発者のXMLの理解不足がアダとなっているなこりゃ。
そんなわけで、UPnPが可能としているルーターでも、UPnPをイネイブルにしたところでちっとも反応しないという状況が眼に浮かぶわけで。だから、あるソフトを使ってUPnPを有効にしたルーターで上手くいかないとしても何の疑いもなく動かないということはあり得るということをみなさんにも知っていただきたい。
とりあえずAtermのXMLはUTF-8ではあるので、それで動くかどうか確かめてみましょう。というか、こんな適当すぎる杜撰な仕様のソフトは一般的なんでしょうかね。まぁUPnPの成り立ちが微妙なのは否めませんけど。
1. XMLが定型ではなく、ルーターによって構造がまちまち。
2. XMLがUTF-8でない場合があって読み込み時にエラーが出る。
というかなりクソッタレな状況になっていて、まともにUPnPを使ってポートフォワーディングができる状況ではありません。各メーカーが決まりを守っていれば問題ないのですが、やりたい放題でまともに動く状況になってはいません。
自分の状況を述べますと、無線LANルーターを二つ見ました。NECのAtermとIOデータのWN-G300Rです。AtermはXMLの構造がどうにも深くて、Golangでは構造体を規定してのデータ取り込みが困難でした。このネスト構造が本当にXMLのフォーマットとして規定されているものなのか疑問に思い、他のルーターを見てみました。
WN-G300Rを見てみると、ネストもそんなに深くなくシンプルだったので、Atermの深さがちょっと異常というのが何となく分かりました。その後のパースを比較的シンプルなXMLだったWN-G300Rに変えて検証してみていると、UTF-8以外のコードが含まれており、やり方によってはGolangで以下のようなエラーが出てしまうのでした。
panic: XML syntax error on line 15: illegal character code U+0018
そもそもXMLのURLをブラウザでアクセスしても、パーシングでエラーが出ていたのでおかしいなとは思ってはいたのです。
XML パースエラー: 整形式になっていません。 URL: http://192.168.1.202:49152/wps_device.xml 行番号: 11, 列番号: 18:bLy -----------------^
IOデータの作った技術者が日本語エディタかなんかで編集してUTF-8の設定にしていなかったんですね、たぶん。そうじゃないとUTF-8外のデータが入り込むということは考えにくい。技術者だったら日本語の取り扱いぐらいは慎重にしておくべきですよね。ちょっと恥ずかしい。
XMLの形がちょっと独自すぎたり、そもそもXMLの体をなしていなかったりするので、正直言ってUPnPをポートフォワーディングで使うのは厳しい。問題を乗り越えるのにすべきことはいくつかあり、それを全部乗り越えるには正規の手続きではやりにくいと思われます。やれることとしては
・XMLにUTF-8以外のキャラクターが出てきても無視できるようにする。
・XMLの構造はあてにできないので、タグを一つ一つクロールして該当の部分だけ抜き出す。
ぐらいのものでしょうか。ポートフォワードが可能でなくても、決め打ちでメッセージを発行できるところはあるものの、ルーターごとに違う設定になっている部分はやっぱりXMLから抽出しないとできないので、パーシングは必要不可欠なのです。というか、完全に開発者のXMLの理解不足がアダとなっているなこりゃ。
そんなわけで、UPnPが可能としているルーターでも、UPnPをイネイブルにしたところでちっとも反応しないという状況が眼に浮かぶわけで。だから、あるソフトを使ってUPnPを有効にしたルーターで上手くいかないとしても何の疑いもなく動かないということはあり得るということをみなさんにも知っていただきたい。
とりあえずAtermのXMLはUTF-8ではあるので、それで動くかどうか確かめてみましょう。というか、こんな適当すぎる杜撰な仕様のソフトは一般的なんでしょうかね。まぁUPnPの成り立ちが微妙なのは否めませんけど。
タグ:Golang
Twitterまとめ投稿 2019/07/21 [Twitter]
carbonhydrat『golangでUPnPのポートフォワーディングをしてみる2−不定形のXMLをどうにかしようとする』名前を変えようと思ったがいい案がなかった..|https://t.co/mLzwAtKtmX07/20 10:51 carbonhydratRT @Beriozka1917: 北海道での安倍首相街宣に際して、判例上も問題のない肉声で「安倍はやめろ」「増税反対」と唱えた男女を、警察が法的根拠なく強制排除した件が問題なっているが、HTBの報道により「年金100年安心プランどうなった?」というプラカを無言で掲げた女性も排…07/20 16:56 carbonhydratRT @iwakamiyasumi: このご指摘は、まったく正しい。国民にとっての関心事と、安倍総理の関心事は見事にすれ違っている、ということ。しかも、理解し難いことに、彼は愛国者気取りで、「日本を取り戻す」などとのたまってきたが、米国から主権を取り戻すことに一切関心がない。属…07/20 16:56 carbonhydratデーブ・スペクター氏 宮迫と契約解消の吉本興業に「なんで金曜日のこの時間に…」― スポニチ Sponichi Annex 芸能 https://t.co/6t3v6WPa9f やっぱ吉本は企業としてクソだし、宮迫は人間としてクソだ… https://t.co/XMvI1X2Xcm07/20 21:17
2019-07-21 05:01
コメント(0)