どさにっきLTE 〜2013年6月下旬〜

by やまや
<< = >>

2013年6月28日(金)

$HTTP_CONTENT_LENGTH

_ URLやらヘッダやらを見て挙動を変える、ってのは apache の設定だけでけっこう何とかなるけど、リクエストボディによってどうにかする、ってのはスクリプトを自作しないことにはどうしようもない。ちうことで、POST されたデータを読んでてきとーにごにょごにょして別のサーバにリクエストを投げて、その応答をさらにいじってクライアントに返す、というスクリプトを書いてたんだけど、これがどうにも動かない。ドはまり。

_ Hoge-Fuga というリクエストヘッダは HTTP_HOGE_FUGA という環境変数にセットされて CGI やら何やらの外部スクリプトが呼ばれる。はず。が、Content-Length と Content-Type が環境変数にエクスポートされてなかった。$HTTP_HOGE_FUGA を機械的に Hoge-Fuga: ヘッダに変換してよそに投げるだけのコードを書いたせいで、よそに POST するのに Content-Length: が存在しないリクエストを投げるもんだからデータをうまく渡せずにコケる。POST された値を書き換えてサイズが変わるのであれば自前で Content-Length を付け直すようにしただろうけど、値を読むだけでデータの書き換えはしないからそのへんの処理をサボったんだよね。半日悩んだ。おかしなものが存在してるのはすぐわかるんだけど、あるべきものが欠けてるのは意外と気がつかない。

_ Authroization はそのまま渡すと セキュリティ的にヤバいのでそういう扱いをしてるのは知ってたけど、Content-Length/-Type も特別扱いされてるとは知らなかった。$HTTP_CONTENT_LENGTH、$HTTP_CONTENT_TYPE がなくても $CONTENT_LENGTH、$CONTENT_TYPE に入ってるからそれを見ればいいんだけどさ、わざわざ特別扱いせずに両方に設定してくれたっていいじゃないか。

_ httpd-2.x.x/server/util_script.c より。

        /* A few headers are special cased --- Authorization to prevent
         * rogue scripts from capturing passwords; content-type and -length
         * for no particular reason.
         */
「とくに理由はない」ってなんだよ。無駄に悩んだ時間返してくれ…。


<< = >>
やまや