开发者

How to parse HTTP responses in C?

开发者 https://www.devze.com 2022-12-21 23:32 出处:网络
I\'m writing a little project which interacts with a set of servers using HTTP 1.1 GET and POST. The server gives me the response after some header lines, so I though on using strtok() function using

I'm writing a little project which interacts with a set of servers using HTTP 1.1 GET and POST. The server gives me the response after some header lines, so I though on using strtok() function using \n as the delimiter but there is a crash whenever I try to do so.

Is there a开发者_JAVA技巧ny simple way to parse a HTTP response in C? I would like not to use 3rd party libraries for this but if it was really necesary I won't have any problem.

Thank you very much for everything.

EDIT: Here is some example code, just trying to print the lines:

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 is a simple and super-fast HTTP parser written in C for the Node.js project

It's only 2 C files, without any external dependencies.


The problem in the code you've posted is pretty simple: strtok works by modifying the string you pass to it. Modifying a string literal gives undefined behavior. A truly minuscule change to your code lets it work (I've also headed the appropriate headers, and moved the executable part into a function:

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

In real use, you'll be reading the HTTP response into a buffer anyway; the problem you encountered only arises in a trivial test case like you generated. At the same time, it does point to the fact that strtok is a pretty poorly designed function, and you'd almost certainly be better off with something else.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号