CGI (EXE) で HTTP POST データを読み込む

CGI でポストされたデータを受け取ることができると、HTML フォームからのデータ送信、 ファイルのアップロードなどが出来る Web アプリケーションを作成することが可能になります。

標準入力から読み込む
~ データ長は環境変数 CONTENT_LENGTH から取得

IIS が CGI (EXE) にデータを渡す場合は、標準入力から渡されます。 C 言語で言えば stdin からデータを取得可能です。

また、標準入力から読み取るデータ長は、環境変数 CONTENT_LENGTH から取得可能です。 環境変数 CONTENT_LENGTH は HTTP ヘッダの Content-Length を元に設定され、それが CGI から読み取れます。

例えば、次のような HTTP POST リクエストを考えます。

POST /foo.cgi HTTP/1.1
Host: www.foobar.com
Content-Length: 5
Content-Type: text/plain

Hello

この場合は、環境変数 CONTENT_LEGNTH に "5" という文字が設定され、stdin から 5 バイト読み取れます。

ここで、あくまで環境変数 CONTENT_LENGTH は文字列で取得できることに注意してください。 ですから、atol 関数などを用いて数字に変換します。

また、Content-Length に無意味に大きな数字を設定することにより、 サーバーのリソースを無駄に消費させることが無いように、適切な数字を上限に設定することが大切です。

バイナリモードに設定

stdin は標準ではテキストモードです。ですから、stdin から指定したバイト数を読み取る場合は、 バイナリモードに設定してください。

stdin をバイナリモードに設定するには次のコードが使えます。

_setmode (_fileno(stdin), _O_BINARY);

改行コードが変換されたりして問題が発生するので、テキストデータを受け取るときも含めて、 常にバイナリモードに設定すると良いでしょう。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説