How to parse HTTP responses in C?
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.
精彩评论