Frage

Ich habe in dem Aufbau einen kleinen, effizienten Web-Servers in C ein neues gefundenes Interesse habe und habe einige Probleme Parsen POST-Methoden aus dem HTTP-Header habe. Würde jemand einen Rat hat, wie die Namen / Wert-Paare aus der Handhabung Abrufen „geschrieben“ Daten?

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

Ich sehe keinen greifbaren Weg, um die untere Linie als Ganze zu holen und sicherzustellen, dass es jedes Mal funktioniert. Ich bin kein Fan von Hartcodierung in nichts.

War es hilfreich?

Lösung

Sie können die Name / Wert-Paare abrufen, indem Sie für Newline newline Suche oder genauer gesagt \ r \ n \ r \ n (danach wird der Körper der Nachricht beginnen).

Dann können Sie spalten die Liste einfach durch die &, und spaltete dann jede dieser zurück Strings zwischen den = für Name / Wert-Paaren.

Sehen Sie die HTTP 1.1 RFC .

Andere Tipps

Wenn Sie Content-Length im Header haben, wissen Sie, die Menge der gelesenen Bytes direkt nach dem Leerzeile werden. Wenn aus irgendeinem Grunde (GET oder POST) Content-Length ist nicht in der Kopfzeile, bedeutet das, es gibt nichts, nachdem die Leerzeile zu lesen (crlf).

Sie müssen halten den Stream als Header-Parsing, bis Sie die leere Zeile zu sehen. Der Rest ist die POST-Daten.

Sie benötigen einen kleinen Parser für die Post-Daten zu schreiben. Sie können C-Bibliotheksroutinen verwenden, um etwas schnell und schmutzig zu tun, wie Index, strtok und sscanf. Wenn Sie Platz für sie in der Definition von „kleinen“ haben, könnten Sie etwas aufwändigere mit einer regulären Ausdruck Bibliothek tun, oder sogar mit Flex und Bison.

Zumindest denke ich, diese Art von Antworten Ihre Frage.

IETF RFC ungeachtet, hier ist ein mehr auf den Punkt Antwort. Unter der Annahme, dass Sie erkennen, dass es nach der /r/n Zeile im Header immer ein extra Content-Length ist, sollten Sie in der Lage sein, die Arbeit zu tun, es in eine Variable mit dem Namen char* data zu isolieren. Dies ist, wo wir beginnen.

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);  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top