WinInet経由でHTTP GETする

moshrecipeをやる重要な目的はmoshを実際に使ってみて、僕が日常的に必要としているライブラリを標準配布に入れて貰う(ために仕様を検討する)ことにあるので、その仕様検討の場としてgitレポジトリext-libを作ってみた。
ext-libリポジトリは git clone http://delegate.uec.ac.jp:8081/club/mma/~oku/repos/ext-lib.git でcloneできて、今後moshrecipeにあることを試すには、毎回のエントリにある

のようなURLの15c7984a966e9dde3c9ca20cd7e55d550a711f50をcheckoutすれば良いという感じで。
本来的にはext-libを統合したmosh配布を準備すべきなんだろうけど、すぐには無理そう。SPONは設計上Windowsで動かないので、自前のパッケージシステムが必要。

wininet

で、Wininet。WindowsにはIEが統合されていて、IEのもつHTTP機能がOS標準のHTTP機能として広く使われている。これの重要なメリットは、proxyの設定などをOS-wideに行うことが出来る点。特にSSLのような機能ではアプリケーション毎に証明書を管理するのは難易度が高い仕事なのでかなり有り難い。同様の仕組みはMac OS Xにはあるが(keychain)、Linux/UNIXには良い標準が無いように思える。
提供しているAPIもかなり高レベルなので、2,3の関数を呼ぶだけでHTTPリクエストを発行して内容を取得することができる。

テストコードは次のような感じ。

3値を返すのはGaucherfc.httpに合わせているが、HTTPヘッダは返さず、レスポンスコードは正確数で、bodyのかわりにportを返す。
bodyではなくportを返すのは、将来的にseekなどの動作に対応するため。
当然、wininetが無いWindows以外のOSでは、(mosh socket)なりなんなりで実装されたHTTPクライアント実装が同様の手続きを提供することが期待されるが、今のところmoshには、

  • ユーザ固有の設定を管理する仕組み(信頼しているSSL鍵やCookieなどを管理できる必要がある)
  • ライブラリをユーザ/動作環境が選択する仕組み(proxyの設定などを書けるようにする必要がある)

が無いので難しい。
まぁmoshはシェルでもあるので、UNIXMac OS Xではwgetコマンドを使い、WindowsではWininetを使うというのが良いバランスに思える。