WNI のサーバーの仕様に困る

緊急地震速報の電文コードを受信するコードを試作しています。言語は Python 2.x を使おう。
最初に悩んだのは、Keep-Alive のコードをどう書くか、です。Python 2.x の urllib2 では、Keep-Alive は対応してないみたいです。いろいろ調べると、urlgrabber というのが使えそうです。urlgrabber 3.9.0 は pycurl をインストールしてないと使えないので、3.1.0 にしました。この辺が参考になります。

次にブチ当たったのは、先日の日記で引用した方も書いていらっしゃいましたが、WNI のサーバーが特殊仕様で、X- で始まるヘッダのキーの文字列が大文字小文字を区別する (case sensitive) なのです。これは RFC 違反のようですが、そうなっているものは、しょうがないです。しかし、そのことに最初に気付いた人は偉いなあ。私だったら、たぶん認証エラーの原因追究でドツボにはまってしまったことでしょう。
さて。urllib2.py のコードを覗き、どこでヘッダーのキーを正規化しているのか調べます。Request クラスの add_header() を見ると、key.capitalize() というコードが怪しいです。そこで、add_header_as_is() というメソッドを独自に追加してみました(← 非推奨)。これで、無事に WNI の認証を通るようになりました。
明日は、Keep-Alive の実験です。

後記

urllib2 を使わずに、直接ソケットを操作するという方法も考えたのですが、これだと HTTP プロキシ対応にするのが大変なので、挫折しました。

後記 2

httplib のほうが良さそう。case sensitive の問題は解決しないといけませんが。