2017年6月20日火曜日

CGI に対応した HTTP リクエストによるファイル保存

CGI に対応した HTTP リクエストによるファイル保存の例題です。

ソケット通信を用いて HTTP リクエストを行う場合、レスポンスヘッダに含まれる Content-Length が 0 となり正しく本文が取得できない場合があります(libcurl 等を用いるとその辺の処理は自動的に行ってくれます)。
Apache サーバーに index.html 等のファイルを直接要求した場合にはそのようなことはありませんが、リクエストしたページが CGI で構成されている場合にそういう状況が発生します。
CGI はファイルの読み出しやページの生成の都合に応じて、逐次転送を行いますので、Content-Length の代わりにこれから送信するバイト数を16進数字にて送信しその本文を送信した後、転送が終われば 0 の文字列を送信します。

CGIによるファイル送信の流れ
レスポンスヘッダ
9bd9
[9bd9バイト分のデータ]
e000
[e000バイト分のデータ]
0
例題では、HTTP リクエストを送信後 Content-Length が含まれるかどうかで CGI かどうかを判定し、受信処理により取得された本文をファイルとして保存しています。 実行結果

0 件のコメント:

コメントを投稿