pico-bmc/http_parser.h

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