Вопрос

У меня появился новый интерес к созданию небольшого эффективного веб-сервера на C, и у меня возникли некоторые проблемы с анализом методов POST из заголовка HTTP.Может ли кто-нибудь дать совет относительно того, как обрабатывать получение пар имя/значение из «опубликованных» данных?

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

Я не вижу реального способа получить чистую прибыль в целом и гарантировать, что она работает каждый раз.Я не сторонник жесткого кодирования чего-либо.

Это было полезно?

Решение

Вы можете получить пары имя/значение, выполнив поиск по строке новой строки или, точнее, (после этого начнется тело сообщения).

Затем вы можете просто разделить список по символу &, а затем разделить каждую из возвращаемых строк между парами = для пар имя/значение.

См. HTTP 1.1 RFC.

Другие советы

Если у вас есть Content-Length в заголовке, вы знаете количество байтов, которые нужно прочитать сразу после пустой строки.Если по какой-либо причине (GET или POST) Content-Length отсутствует в заголовке, это означает, что после пустой строки (crlf) читать нечего.

Вам нужно продолжать анализировать поток как заголовки, пока не увидите пустую строку.Остальное — данные POST.

Вам нужно написать небольшой парсер для данных публикации.Вы можете использовать процедуры библиотеки C, чтобы сделать что-то быстрое и грязное, например index, strtok и sscanf.Если в вашем определении «маленького» есть место для этого, вы можете сделать что-то более сложное с помощью библиотеки регулярных выражений или даже с помощью flex и bison.

По крайней мере, я думаю, что это ответ на ваш вопрос.

Несмотря на IETF RFC, вот более точный ответ.Предполагая, что вы понимаете, что всегда есть лишние /r/n после Content-Length строку в заголовке, вы сможете изолировать ее в char* переменная с именем data.С этого мы и начнем.

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);  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top