如何解析C中的HTTP响应?
我正在写一个小项目,它使用HTTP 1.1 GET和POST与一组服务器进行交互。服务器给了我一些标题行之后的响应,所以我尽管使用strtok()
函数使用\n
作为分隔符,但每当我尝试这样做时就会崩溃。如何解析C中的HTTP响应?
有没有简单的方法来解析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");
}
http-parser是用C语言编写的Node.js的项目
这是一个简单和超快速HTTP解析器只有2个C文件,没有任何外部依赖。
它是用回调式编写的,以支持“轮询”循环。也许作者对阻塞解析器感兴趣,比如'golang'的[ReadRequest](http://golang.org/pkg/net/http/#ReadRequest) – 2015-02-16 09:55:50
有没有一个客户端用C语言编写的解析器?存储库附带的示例对于像我这样的新手来说似乎不够。 – Bharat 2017-02-20 20:14:21
您发布的代码中的问题非常简单: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
是一个功能设计很差的事实,你几乎肯定会用其他的东西。
不确定为什么你认为这个问题反映了strtok上的poorl。真正的问题是,字符串文字被认为是“char *”而不是“const char *”,并且该问题可能会影响修改字符串输入的任何代码。 – 2010-03-07 06:27:06
它反映了'strtok'糟糕,因为它不必要地限制了它的输入范围,不仅仅是可以修改的数据,而且你不介意在使用过程中基本破坏。 – 2010-03-07 07:06:54
请发布您的代码 – 2010-03-07 04:41:47
当在一个线程或多进程程序中使用时,可能需要使用'strtok_r()'来保证安全,如果可用的话,请考虑使用它 – mctylr 2010-03-07 05:07:41
试图修改来自'“...”'字符串文字的字符数组的任何元素都是**未定义的行为**;请参阅http://c0x.coding-guidelines.com/6.4.5.html和http://www.catb.org/jargon/html/N/nasal-demons.html。 – ephemient 2010-03-07 05:47:02