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