如何在C中解析HTTP响应?

时间:2010-03-07 04:40:10

标签: c http parsing

我正在编写一个小项目,它使用HTTP 1.1 GET和POST与一组服务器进行交互。服务器在一些标题行之后给出了响应,所以我使用strtok()函数使用\n作为分隔符,但每当我尝试这样做时都会发生崩溃。

有没有简单的方法来解析C中的HTTP响应?我不想为此使用第三方库,但如果它真的是必要的,我将不会有任何问题。

非常感谢您的一切。

编辑:这是一些示例代码,只是尝试打印行:

char *response = "HTTP/1.1 200 OK\nServer: Apache-Coyote/1.1\nPragma: no-cache"

char *token = NULL;
token = strtok(response, "\n");
while (token) {
    printf("Current token: %s.\n", token);
    token = strtok(NULL, "\n");
}

2 个答案:

答案 0 :(得分:5)

http-parser是一个简单且超快的HTTP解析器,用C语言编写,用于Node.js项目

它只有2个C文件,没有任何外部依赖。

答案 1 :(得分:4)

您发布的代码中的问题非常简单:strtok通过修改传递给它的字符串来工作。修改字符串文字会产生未定义的行为。对代码进行真正微小的更改可以使它工作(我还引导了相应的标题,并将可执行部分移动到函数中:

#include <string.h>
#include <stdio.h>

char response[] = "HTTP/1.1 200 OK\nServer: Apache-Coyote/1.1\nPragma: no-cache";

int main() { 
    char *token = NULL;
    token = strtok(response, "\n");
    while (token) {
        printf("Current token: %s.\n", token);
        token = strtok(NULL, "\n");
    }
    return 0;
}

在实际使用中,无论如何,您都会将HTTP响应读入缓冲区;您遇到的问题只会出现在像您生成的简单测试案例中。与此同时,它确实指出strtok是一个设计非常糟糕的功能,你几乎肯定会用其他东西做得更好。