Perlではソケットを用いる事で、簡単にHTTPクライアントソフトウェアを作る事が出来ます。
ですが、一つ忘れてはいけない事があります。
念のため、備忘録として書いておきます。
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
値を指定する必要があります。
connection: close
フィールドを与えていなかったため一回のアクセスで応答を得る事が出来なかったのでしょう(だとすれば、当時の制作者が思った通りあちらがいい加減だったと言う事になります)。HTTP/1.1では永続的接続の扱いを忘れないようにしなければなりませんが、そう言った本質的で無い点に気を配るのが面倒であるのなら、HTTP/1.0でリクエストするようにすれば良いでしょう。
そうすれば、HTTP/1.1で応答してくれないサーヴァでも正しくリクエストに応じてくれるようになります。
平成19年 8月 2日現在、制作者がソケットを用いてHTTPで外部リソースを取得出来るようにしている Perl スクリプトは、しらぎくイメージチェンジャだけですが、これはHTTP/1.1でアクセスしているもののちゃんと connection: close
フィールドを与えており、この点に関しての問題は起こらない筈です。