18

C で小さくて効率的な Web サーバーを構築することに新たな関心があり、HTTP ヘッダーから POST メソッドを解析する際に問題が発生しました。「投稿された」データから名前/値のペアを取得する方法について、誰かアドバイスはありますか?

POST /test HTTP/1.1
Host: test-domain.com:7017
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://test-domain.com:7017/index.html
Cookie: __utma=43166241.217413299.1220726314.1221171690.1221200181.16; __utmz=43166241.1220726314.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

field1=asfd&field2=a3f3f3
// ^-this

全体として最終的な結果を取得し、それが常に機能することを保証する具体的な方法はないと思います。私は何かをハードコーディングするのが好きではありません。

4

4 に答える 4

20

改行改行、またはより具体的には \r\n\r\n を検索することで、名前と値のペアを取得できます (この後、メッセージの本文が開始されます)。

次に、リストを & で単純に分割し、返された各文字列を名前と値のペアの = で分割します。

HTTP 1.1 RFCを参照してください。

于 2008-09-17T03:55:14.800 に答える
4

ヘッダーに Content-Length があると、空白行の直後に読み取られるバイト数がわかります。何らかの理由 (GET または POST) で Content-Length がヘッダーにない場合は、空白行 (crlf) の後に読み取るものが何もないことを意味します。

于 2008-12-22T12:07:38.900 に答える
2

空白行が表示されるまで、ストリームをヘッダーとして解析し続ける必要があります。残りはPOSTデータです。

投稿データ用に小さなパーサーを作成する必要があります。Cライブラリルーチンを使用して、index、strtok、sscanfなどの迅速で汚いことを行うことができます。「小さい」の定義にその余地がある場合は、正規表現ライブラリを使用して、またはフレックスとバイソンを使用して、より複雑なことを行うことができます。

少なくとも、この種の質問に答えると思います。

于 2008-09-17T04:00:27.017 に答える