2008-09-17 4 views
18

У меня появился новый интерес к созданию небольшого, эффективного веб-сервера в C и возникли проблемы с анализом методов POST из HTTP-заголовка. Кто-нибудь будет советоваться о том, как обращаться с поиском пар имя/значение из «размещенных» данных?Анализ заголовков 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 

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

ответ

19

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

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

См. HTTP 1.1 RFC.

+0

А, спасибо. Я заметил, что перед строкой пар имя/значение было лишнее пространство, но не вставили два и два вместе. – 2008-09-17 03:56:21

2

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

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

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

4

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

0

Несмотря на то, что 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); 
Смежные вопросы