Pregunta

He encontrado un nuevo interés en construir un servidor web pequeño y eficiente en C y he tenido algunos problemas para analizar los métodos POST desde el encabezado HTTP.¿Alguien tendría algún consejo sobre cómo manejar la recuperación de los pares nombre/valor de los datos "publicados"?

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

No veo ninguna forma tangible de recuperar el resultado final en su conjunto y garantizar que funcione en todo momento.No soy partidario de codificar nada.

¿Fue útil?

Solución

Puede recuperar los pares de nombre/valor buscando nueva línea nueva línea o más específicamente (después de esto, comenzará el cuerpo del mensaje).

Luego, simplemente puede dividir la lista por &, y luego dividir cada una de esas cadenas devueltas entre = para pares de nombre/valor.

Ver el RFC HTTP 1.1.

Otros consejos

Una vez que tenga Content-Length en el encabezado, sabrá la cantidad de bytes que se leerán justo después de la línea en blanco.Si, por algún motivo (GET o POST), Content-Length no está en el encabezado, significa que no hay nada que leer después de la línea en blanco (crlf).

Debe seguir analizando la transmisión como encabezados hasta que vea la línea en blanco.El resto son los datos POST.

Necesita escribir un pequeño analizador para los datos de la publicación.Puede utilizar rutinas de la biblioteca C para hacer algo rápido y sucio, como index, strtok y sscanf.Si tiene espacio para ello en su definición de "pequeño", podría hacer algo más elaborado con una biblioteca de expresiones regulares, o incluso con flex y bison.

Al menos, creo que esto responde a tu pregunta.

A pesar del IETF RFC, aquí hay una respuesta más concreta.Suponiendo que te das cuenta de que siempre hay un extra /r/n después de la Content-Length línea en el encabezado, debería poder hacer el trabajo para aislarlo en un char* variable nombrada data.Aquí es donde empezamos.

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);  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top