質問

私は 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

全体としての収益を取得し、それが毎回確実に機能することを確認する具体的な方法は見つかりません。私はハードコーディングが好きではありません。

役に立ちましたか?

解決

名前と値のペアを取得するには、改行 改行、具体的には を検索します (この後、メッセージの本文が始まります)。

その後、リストを & で分割し、返された各文字列を名前と値のペアの = の間で分割するだけです。

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

他のヒント

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

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

投稿データ用の小さなパーサーを作成する必要があります。C ライブラリ ルーチンを使用すると、index、strtok、sscanf などの簡単で汚い処理を行うことができます。「小さい」の定義に余裕がある場合は、正規表現ライブラリを使用したり、flex や bison を使用したりして、より複雑なことを行うこともできます。

少なくとも、これであなたの質問に対する答えは得られると思います。

IETF RFC にもかかわらず、より核心をついた答えがここにあります。常に余分なものがあることに気づいていると仮定すると、 /r/n 後に Content-Length ヘッダー内の行を分離する作業を実行できるはずです。 char* 名前付き変数 data. 。ここからが始まりです。

char *data = "f1=asfd&f2=a3f3f3";
char f1[100], 
char f2[100];
sscanf(data, "%s&%s", &f1, &f2); // get the field tuples

char f1_name[50];
char f1_data[50];
sscanf(f1, "%s=%s", f1_name, f1_data);  

char f2_name[50];
char f2_data[50];
sscanf(f2, "%s=%s", f2_name, f2_data);  
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top