如何在C中最有效地解析此HTTP请求?

时间:2013-02-15 11:56:22

标签: c string http parsing

我真正需要提取的信息是:

a)是否是GET请求

b)文件地址(例如index.html)

c)主机信息(例如localhost:8081)

我现在有代码执行此操作(请参阅我的帖子底部),但它似乎效率低下,非常静态,并且不会提取主机信息。

所以我希望有一个理智的解决方案来解析C语言中的HTTP请求!

HTTP请求

GET /index.html HTTP/1.1
Host: localhost:8081
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.70 Safari/537.17
DNT: 1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,en-GB;q=0.6
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

当前代码

int parsehttp(char *inputstring, int *type, char *getaddress) {
    if((strncmp(inputstring, "GET", 3)) == 0) {
        *type = 1;
    } else {
        *type = 0;
    }
    char firstline[BUFLEN] = "";
    int charoffset = getlineend(inputstring); //this function returns the int offset of '\r\n'
    strncpy(firstline, inputstring, charoffset-2);
    firstline[charoffset-1] = '\0';
    sscanf(firstline,"%*s %s %*s",getaddress);
    inputstring = (inputstring + charoffset);
    return 1;
}

2 个答案:

答案 0 :(得分:3)

可能对你有帮助的是strstr-function。它尝试在您提供的字符串中查找给定的字符串。由于HTTP请求包含以0xD结尾的行,0xA可以拆分行。 通常,使用空格分隔文本行上的信息。 所以要找到“GET”或“POST”,你可以使用

char* getpost = strstr("GET /index.html HTTP/1.1", "GET");

如果getpost是!= NULL,你将拥有你的字符串,并且可以在GET或POST之后剪切它。

其次你会寻找“主持人:”并跳过那部分,直到你达到0xD,0xA,这样你就得到了你的主机地址。

有关strstr。

的联机帮助页,请参阅strstr

答案 1 :(得分:0)

你不应该担心这种效率低下,毕竟它是网络连接,并且总是比CPU,缓存,RAM慢很多。

如果您正在编写一个http服务器,那么您应该关心的唯一事情就是内存安全以及客户端发送意外情况时您的代码所做的事情。

一些例子: 你的代码(及其后面的代码/取决于它的解析)是做什么的:

  • 客户端发送> 10 MB的数据,都是格式错误的,例如根本没有换行符。
  • 客户端发送错误的小数(即ip / port / content-length)
  • 客户端发送正确的数据,但速度很慢,例如每秒1个字节。
  • ......更多。