Domanda

Ho avuto un nuovo interesse nella creazione di un server Web piccolo ed efficiente in C e ho avuto alcuni problemi nell'analisi dei metodi POST dall'intestazione HTTP.Qualcuno avrebbe qualche consiglio su come gestire il recupero delle coppie nome/valore dai dati "pubblicati"?

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

Non vedo alcun modo tangibile per recuperare i profitti nel loro complesso e garantire che funzioni ogni volta.Non sono un fan dell'hard-coding in nulla.

È stato utile?

Soluzione

Puoi recuperare le coppie nome/valore cercando newline newline o più specificamente (dopodiché inizierà il corpo del messaggio).

Quindi puoi semplicemente dividere l'elenco con &, quindi dividere ciascuna di quelle stringhe restituite tra = per le coppie nome/valore.

Vedi il RFC HTTP 1.1.

Altri suggerimenti

Una volta che hai Content-Length nell'intestazione, conosci la quantità di byte da leggere subito dopo la riga vuota.Se per qualsiasi motivo (GET o POST) Content-Length non è nell'intestazione, significa che non c'è niente da leggere dopo la riga vuota (crlf).

Devi continuare ad analizzare il flusso come intestazioni finché non vedi la riga vuota.Il resto sono i dati POST.

Devi scrivere un piccolo parser per i dati del post.Puoi usare le routine della libreria C per fare qualcosa di veloce e sporco, come index, strtok e sscanf.Se c'è spazio per questo nella tua definizione di "piccolo", potresti fare qualcosa di più elaborato con una libreria di espressioni regolari, o anche con flex e bison.

Almeno, penso che questo risponda alla tua domanda.

Nonostante l'IETF RFC, ecco una risposta più precisa.Ammesso che ti rendi conto che c'è sempre un extra /r/n dopo il Content-Length nell'intestazione, dovresti essere in grado di fare il lavoro per isolarlo in a char* variabile denominata data.È qui che iniziamo.

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);  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top