WinHTTP (Windows HTTP Services) 覚書 by kanegon 2003.05.05 create - 概要 WinHTTP は HTTP の高レベルインタフェースを提供する。WinHTTP は主にサーバ間の HTTP 通信のために設計されたが、サーバに限らず、クライアントでも使用可能なもの となっている。 従来の技術である WinINet では主に HTTP クライアント機能を持つ対話的なデスクトッ プアプリケーションをターゲットして設計され、ユーザ認証などいくつかの操作で使 用される GUI を内包していた。 WinHTTP では GUI を想定せず、これらの操作をすべてプログラムで処理する。 WinHTTP は WinINet に比べて、より安全で強固であり、HTTP クライアントサービス を必要とするサーバアプリケーションは WinINet の代わりに WinHTTP を使うべきで ある、と Microsoft は主張している。 WinHTTP はサーバに限らず、システムサービスや HTTP ベースのクライアントアプリ ケーションでの使用も想定している。 しかし、WinHTTP は WinINet の上位互換というわけではなく、独立に設計されたもの で、インタフェースやサポートする機能範囲も同じではない。 Microsoft は、単一ユーザのアプリケーションで、かつ、以下の機能が必要な場合に は依然として WinINet の使用を検討すべき、とも言っている。 - FTP、gopher - cookie の持続 - キャッシュ管理 - 自動認証ダイアログ - IE との互換性 - 旧 Platform のサポート ※ コネクションの接続数について、要確認 WinINet は同時接続が2つまで(RFCの規定のはず)に制限されている。 WinHTTP は同じ制限があるのか(?) - WinHTTP バージョン [WinHTTP 5.1] 最新バージョンである。 WinHTTP 5.1 は以下のシステムの OS コンポーネントとして提供されている。 Win2000 SP3 以降 (Datacenter Server を除く) WinXP SP1 以降 Windows Server 2003 family 上記システム以外の WinHTTP 5.1 の再配布はサポートされていない。 WinHTTP 5.1 は NT4 では動作しない。 [WinHTTP 5.0] WinHTTP 5.0 は再配布可能である。(winhttp5.dll) WinHTTP 5.0 は Win2000 以降、IE5.01 以降を搭載した NT4 で動作する。 コンポーネント(SDK)が Microsoft のサイトからダウンロード可能である。 WinHTTP 5.1 のリリースに伴って WinHTTP 5.0 は収束の方向にある。 Microsoft は WinHTTP 5.0 のコードを書き直すことを強く推奨しており、 WinHTTP 5.0 のサポートは 2004年10月1日をもって打ち切られる予定である。 - 機能 サポートする機能には以下のものがある。 - HTTP/1.0 (keep-alive含む) - HTTP/1.1 (HTTP レスポンスの chunked transfer サポート含む) - Keep-alive pooling (匿名接続の場合、またセッションに依存しない) - SSL (クライアント認証含む) SSL2.0, SSL3.0, TLS1.0 に対応 - サーバ認証、Proxy認証サポート (Microsoft Passport 含む) - 自動リダイレクト (抑止も可能) - API とスクリプトの両インタフェースに対応 - 問題解決に役立つトレースの容易さ WinHTTP 5.1 では以下が追加されている。 - IPv6 - AutoProxy 可能 - インタフェース C/C++ API と COM の2つのインタフェースがある。 API の方が、より細かな制御ができるが、COM はより簡単に使用可能である。 この COM インタフェースのサポートにより、スクリプトから容易に HTTP アクセスを 行えるようになった。 - 関連ツール 詳細不明、調査中。 ProxyCfg.exe は WinXP では標準添付してるらしい。 Microsoft からもダウンロードできるはずだが、物が見つからない。 WinHttpCfg.exe ProxyCfg.exe WinHttpTraceCfg どうも、Win2K では SP4 で WinHttp コンポーネントは使えるようになったが、周辺 ツールは提供されていないみたい。 Microsoft のページにダウンロードできるとの記述もあったが、それもどうやら WinHttp 5 用とか別のもので、WinHttp5.1 用のものは公開されていないようである。 - 使い方 ----- a.js ----------------------------------------------------- var webreq = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); try { webreq.Open("GET", "http://www.example.com/"); webreq.Send(); WScript.Echo("--- status -------------"); WScript.Echo(webreq.Status); WScript.Echo("--- headers ------------"); WScript.Echo(webreq.GetAllResponseHeaders); WScript.Echo("--- body ---------------"); WScript.Echo(webreq.ResponseText); } catch(e) { WScript.Echo("[ERROR] " + (e.number & 0xffff) + ": " + e.description); } ---------------------------------------------------------------- ダウンロードするときは文字コードに注意のこと。 この例ではテキストで取り出しているため、Shift_JIS 以外は受け付けない。 Web コンテンツを保存するだけならバイナリを使う方が確実である。