Question

J'ai récemment découvert un intérêt pour la construction d'un serveur Web efficace et de petite taille en C et j'ai eu du mal à analyser les méthodes POST à ??partir de l'en-tête HTTP. Quelqu'un aurait-il un conseil sur la manière de récupérer les paires nom / valeur à partir du message "posté"? données?

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

Je ne vois aucun moyen concret de récupérer le résultat final dans son ensemble et de veiller à ce qu'il fonctionne à chaque fois. Je ne suis pas fan de codage en dur dans quoi que ce soit.

Était-ce utile?

La solution

Vous pouvez récupérer les paires nom / valeur en recherchant une nouvelle ligne ou plus précisément \ r \ n \ r \ n (après cela, le corps du message commencera).

Ensuite, vous pouvez simplement scinder la liste par le & amp;, puis scinder chacune des chaînes renvoyées entre les paires = pour le nom / la valeur.

Voir le HTTP 1.1 RFC .

Autres conseils

Une fois que vous avez Content-Length dans l'en-tête, vous connaissez le nombre d'octets à lire juste après la ligne vide. Si, pour une raison quelconque (GET ou POST) Content-Length n'est pas dans l'en-tête, cela signifie qu'il n'y a rien à lire après la ligne vierge (crlf).

Vous devez continuer à analyser le flux sous la forme d'en-têtes jusqu'à ce que la ligne vierge apparaisse. Le reste correspond aux données POST.

Vous devez écrire un petit analyseur pour les données de publication. Vous pouvez utiliser les routines de la bibliothèque C pour faire quelque chose de rapide et sale, comme index, strtok et sscanf. Si vous avez de la place dans votre définition de "petit", vous pouvez faire quelque chose de plus élaboré avec une bibliothèque d’expressions régulières, ou même avec flex et bison.

Au moins, je pense que ce type de réponse à votre question.

Nonobstant les RFC de l’IETF, voici une réponse plus pertinente. En supposant que vous réalisiez qu'il y a toujours un / r / n supplémentaire après la ligne Content-Length dans l'en-tête, vous devriez pouvoir effectuer le travail pour l'isoler. une variable char * nommée data . C’est par là que nous commençons.

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);  
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top