HTTPクライアントを作る上での注意事項。

Perlではソケットを用いる事で、簡単にHTTPクライアントソフトウェアを作る事が出来ます。

ですが、一つ忘れてはいけない事があります。

念のため、備忘録として書いておきます。

HTTPクライアントを作る上での注意事項・目次。

HTTP/1.1でリクエストするなら、connection: close フィールドを忘れない事。

制作者の体験談。

当サイトがまだウェブ技術を扱っていなかった頃(つまり制作者にまだ技術が無かった頃)、もっと言えば当サイトを開設して間もない頃の事です。

あるiモードコンテンツ検索エンジンに登録しようとして、フォームからサイトのURIを打ち込みましたが、何度やってもエラーとなりました。

管理人にその事を問い合わせると、HTTP/1.1のリクエストに応答が無いため登録する事が出来ないので、サーヴァ管理者に問い合わせてくれと言う返事が来ました。

まだCGIのCの字も知らなかった頃ですので、当然「HTTP/1.1? 何だそれ? テメエがいい加減にプログラム書いた所為じゃ無いの?」と思っておりました。

その後、自分でCGI上で動作するウェブプログラムを組めるようになり、ソケットを使ってHTTPクライアントを作ってテストしておりましたが、一部のサーヴァで何時まで経ってもレスポンスが帰って来ない事に気付きました。

当時契約していたサーヴァにも同様にアクセスしてみましたが、やはり何時まで経ってもレスポンスが帰って来なかったのです。

これは初歩的なミスでしたが、リクエストヘッダにconnection: close の一行を入れ忘れたのが原因でした。

リクエストヘッダにconnection: close の一行を追加したところ、それまでレスポンスを返してくれなかったサーヴァでもきっちりレスポンスを返してくれるようになりました。

結論・connection: close フィールドは忘れずに。

HTTP/1.1では永続的接続をサポートするため、connection フィールドでその扱いを指定する必要があります。

このため、一部サーヴァでは connection フィールドを忘れると、接続が切れないため、何時まで経っても終了出来ないと言う事態になるのです。

connection フィールドの値には幾つかありますが、一回のリクエストで情報を得たい場合には必ず close 値を指定する必要があります。

面倒なトラブルを避けたいのなら、HTTP/1.0でリクエストしましょう。

HTTP/1.1では永続的接続の扱いを忘れないようにしなければなりませんが、そう言った本質的で無い点に気を配るのが面倒であるのなら、HTTP/1.0でリクエストするようにすれば良いでしょう。

そうすれば、HTTP/1.1で応答してくれないサーヴァでも正しくリクエストに応じてくれるようになります。

制作者の作品について。

平成19年 8月 2日現在、制作者がソケットを用いてHTTPで外部リソースを取得出来るようにしている Perl スクリプトは、しらぎくイメージチェンジャだけですが、これはHTTP/1.1でアクセスしているもののちゃんと connection: close フィールドを与えており、この点に関しての問題は起こらない筈です。


ページ外へのご案内。