Pergunta

Eu descobri um novo interesse em construir um servidor web pequeno e eficiente em C e tive alguns problemas ao analisar os métodos POST do cabeçalho HTTP.Alguém teria algum conselho sobre como lidar com a recuperação dos pares nome/valor dos dados "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

Não vejo nenhuma maneira tangível de recuperar os resultados financeiros como um todo e garantir que funcione sempre.Não sou fã de codificação em nada.

Foi útil?

Solução

Você pode recuperar os pares nome/valor procurando por nova linha ou mais especificamente (depois disso, o corpo da mensagem será iniciado).

Em seguida, você pode simplesmente dividir a lista por & e, em seguida, dividir cada uma das strings retornadas entre = para pares nome/valor.

Veja o HTTP 1.1 RFC.

Outras dicas

Depois de ter Content-Length no cabeçalho, você sabe a quantidade de bytes a serem lidos logo após a linha em branco.Se, por algum motivo (GET ou POST) Content-Length não estiver no cabeçalho, significa que não há nada para ler após a linha em branco (crlf).

Você precisa continuar analisando o fluxo como cabeçalhos até ver a linha em branco.O resto são os dados POST.

Você precisa escrever um pequeno analisador para os dados da postagem.Você pode usar rotinas da biblioteca C para fazer algo rápido e sujo, como index, strtok e sscanf.Se você tiver espaço para isso na sua definição de "pequeno", poderá fazer algo mais elaborado com uma biblioteca de expressões regulares, ou mesmo com flex e bison.

Pelo menos, acho que isso responde à sua pergunta.

Apesar da RFC da IETF, aqui está uma resposta mais direta.Supondo que você perceba que sempre há um extra /r/n depois de Content-Length linha no cabeçalho, você poderá fazer o trabalho para isolá-lo em um char* variável nomeada data.É aqui que começamos.

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top