98 lines
2.8 KiB
C
98 lines
2.8 KiB
C
|
#ifndef HTTP_PARSER_H
|
||
|
#define HTTP_PARSER_H
|
||
|
|
||
|
#include "llhttp.h"
|
||
|
|
||
|
typedef struct HTTP_REQUEST_DATA_T_ {
|
||
|
char protocol[8];
|
||
|
char method[8];
|
||
|
char url[128];
|
||
|
char body[128];
|
||
|
} HTTP_REQUEST_DATA_T;
|
||
|
|
||
|
typedef struct HTTP_REQUEST_PARSER_WRAPPER_T_ {
|
||
|
llhttp_t parser;
|
||
|
llhttp_settings_t settings;
|
||
|
} HTTP_REQUEST_PARSER_WRAPPER_T;
|
||
|
|
||
|
int request_parser_on_url(llhttp_t * parser, const char * start, size_t length) {
|
||
|
HTTP_REQUEST_DATA_T * http_request = parser->data;
|
||
|
strncat(http_request->url, start, length);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int request_parser_on_body(llhttp_t * parser, const char * start, size_t length) {
|
||
|
HTTP_REQUEST_DATA_T * http_request = parser->data;
|
||
|
strncat(http_request->body, start, length);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int parse_http_request (HTTP_REQUEST_PARSER_WRAPPER_T * wrapper, char * content, size_t len) {
|
||
|
llhttp_t parser = wrapper->parser;
|
||
|
|
||
|
llhttp_errno_t err = llhttp_execute(&parser, content, len);
|
||
|
HTTP_REQUEST_DATA_T * http_request = parser.data;
|
||
|
|
||
|
uint8_t protocol_major = llhttp_get_http_major(&parser);
|
||
|
uint8_t protocol_minor = llhttp_get_http_minor(&parser);
|
||
|
sprintf(http_request->protocol, "%d.%d", protocol_major, protocol_minor);
|
||
|
|
||
|
uint8_t method = llhttp_get_method(&parser);
|
||
|
const char * method_name = llhttp_method_name(method);
|
||
|
strcpy(http_request->method, method_name);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
char * get_protocol (HTTP_REQUEST_PARSER_WRAPPER_T * wrapper) {
|
||
|
HTTP_REQUEST_DATA_T * http_request = wrapper->parser.data;
|
||
|
return http_request->protocol;
|
||
|
}
|
||
|
|
||
|
char * get_method (HTTP_REQUEST_PARSER_WRAPPER_T * wrapper) {
|
||
|
HTTP_REQUEST_DATA_T * http_request = wrapper->parser.data;
|
||
|
return http_request->method;
|
||
|
}
|
||
|
|
||
|
char * get_url (HTTP_REQUEST_PARSER_WRAPPER_T * wrapper) {
|
||
|
HTTP_REQUEST_DATA_T * http_request = wrapper->parser.data;
|
||
|
return http_request->url;
|
||
|
}
|
||
|
|
||
|
char * get_body (HTTP_REQUEST_PARSER_WRAPPER_T * wrapper) {
|
||
|
HTTP_REQUEST_DATA_T * http_request = wrapper->parser.data;
|
||
|
return http_request->body;
|
||
|
}
|
||
|
|
||
|
HTTP_REQUEST_PARSER_WRAPPER_T * new_request_parser () {
|
||
|
HTTP_REQUEST_PARSER_WRAPPER_T * wrapper = calloc(1, sizeof(HTTP_REQUEST_PARSER_WRAPPER_T));
|
||
|
|
||
|
// create a new request data struct
|
||
|
HTTP_REQUEST_DATA_T * http_request = calloc(1, sizeof(HTTP_REQUEST_DATA_T));
|
||
|
|
||
|
// init http parser settings
|
||
|
llhttp_settings_init(&wrapper->settings);
|
||
|
wrapper->settings.on_url = &request_parser_on_url;
|
||
|
wrapper->settings.on_body = &request_parser_on_body;
|
||
|
|
||
|
// init http request parser parser
|
||
|
llhttp_init(&wrapper->parser, HTTP_REQUEST, &wrapper->settings);
|
||
|
wrapper->parser.data = http_request;
|
||
|
|
||
|
return wrapper;
|
||
|
}
|
||
|
|
||
|
void delete_request_parser (HTTP_REQUEST_PARSER_WRAPPER_T * wrapper) {
|
||
|
free(wrapper->parser.data);
|
||
|
free(wrapper);
|
||
|
}
|
||
|
|
||
|
int http_parser_init () {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int http_parser_deinit () {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#endif
|