【问题标题】:How can I most effectively parse this HTTP request in C?如何在 C 中最有效地解析这个 HTTP 请求?
【发布时间】:2013-02-15 11:56:22
【问题描述】:

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

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;
}

【问题讨论】:

  • 我想说你正在寻找一个正则表达式,正则表达式。查找一些教程,这应该不是一个大问题:)
  • @dutt 如果他尝试使用正则表达式,那么他将遇到 2 个问题。
  • 解析来自 Internet 的数据的合理解决方案包括检查缓冲区溢出和各种其他验证。
  • @AlexeyFrunze:任何问题的理智解决方案包括检查缓冲区溢出和各种其他验证。 :)
  • 在重新发明轮子之前,您可能想阅读这里:gnu.org/software/libmicrohttpd

标签: c string http parsing


【解决方案1】:

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

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

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

其次,您将查找“主机:”并跳过该部分,直到您到达 0xD,0xA,以便您获得主机地址。

请参阅strstr 以获取 strstr 上的联机帮助页。

【讨论】:

  • 你可以很容易地用 strstr 得到一个缓冲区溢出 - 为了理智,你应该使用 strnstr 实现(或滚动你自己的)
【解决方案2】:

您不必担心效率低下,毕竟它是联网的,并且总是比您的 CPU、缓存、RAM 慢很多数量级。

如果您正在编写一个 http-server,那么您唯一应该关心的是内存安全以及如果客户端发送了意外的内容,您的代码会做什么。

一些例子: 如果:

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

【讨论】:

  • 我知道是因为我刚刚完成了自己的异步网络服务器。
  • -1 我过去也写过网络服务器,不担心 CPU 和/或 RAM 是一个非常糟糕的主意。如果您不担心这些,只需使用 Apache 或其他一些慢速服务器,不要自行开发。
猜你喜欢
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 2011-08-03
  • 1970-01-01
  • 2014-02-27
相关资源
最近更新 更多