http-parser.c

Small C library to parse HTTP requests
Log | Files | Refs | README | LICENSE

commit d5f1f49d52bc3a5c22a6352309f0dc476d9c43a3
parent b0b2beb907b69bf3d98c7789e3d2113bdf7e2683
Author: finwo <finwo@pm.me>
Date:   Sun, 10 Nov 2019 17:47:34 +0100

Let readme reflect the recent changes

Diffstat:
MREADME.md | 23+++++++++++++----------
Msrc/http-parser.c | 19+++++++++----------
Msrc/http-parser.h | 1+
3 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/README.md b/README.md @@ -12,7 +12,7 @@ static void onRequest(struct http_parser_event *ev) { // Fetching the request // Has been wrapped in http_parser_event to support more features in the future - struct http_parser_request *request = ev->request; + struct http_parser_message *request = ev->request; // Basic http request data printf("Method: %s\n", request->method); @@ -20,18 +20,21 @@ static void onRequest(struct http_parser_event *ev) { // Reading headers are case-insensitive due to non-compliant clients/servers printf("Host: %s\n", http_parser_header_get(request, "host")); - // Once you're done with the request, you'll have to free it - http_parser_request_free(request); + // Once you're done with the request, you'll have to free it yourself + http_parser_message_free(request); + + // Or you can free the whole pair + http_parser_pair_free(ev->pair); } -// Initialize a request -struct http_parser_request *request = http_parser_init(); +// Initialize a request/response pair +struct http_parser_pair *reqres = http_parser_pair_init(); -// Assign userdata into the request -// Use it to track whatever you need -request->udata = (void*)...; +// Userdata to be included can be assigned +reqres->udata = (void*)...; -// Attach a function +// Trigger function 'onRequest' when the request is ready +reqres->onRequest = onRequest; // Stored http message char *message = @@ -41,5 +44,5 @@ char *message = ; // Passing network data into it -http_parser_request_data(request, message, strlen(message)); +http_parser_pair_request_data(reqseq, message, strlen(message)); ``` diff --git a/src/http-parser.c b/src/http-parser.c @@ -215,16 +215,15 @@ static int http_parser_message_read_header(struct http_parser_message *message) void http_parser_pair_request_data(struct http_parser_pair *pair, char *data, int size) { struct http_parser_event *ev; http_parser_request_data(pair->request, data, size); - if (pair->request->_state == HTTP_PARSER_STATE_DONE) { - if (pair->onRequest) { - ev = calloc(1,sizeof(struct http_parser_event)); - ev->request = pair->request; - ev->response = pair->response; - ev->udata = pair->udata; - pair->onRequest(ev); - free(ev); - pair->onRequest = NULL; - } + if (pair->request->ready && pair->onRequest) { + ev = calloc(1,sizeof(struct http_parser_event)); + ev->request = pair->request; + ev->response = pair->response; + ev->pair = pair; + ev->udata = pair->udata; + pair->onRequest(ev); + free(ev); + pair->onRequest = NULL; } } diff --git a/src/http-parser.h b/src/http-parser.h @@ -21,6 +21,7 @@ struct http_parser_header { struct http_parser_event { struct http_parser_message *request; struct http_parser_message *response; + struct http_parser_pair *pair; void *udata; };