http-parser.c

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

commit bbe128d997530b90311a5adcb6fd78e520225558
parent 915420342534a80e14fc8df91ba8fed4dcbc150d
Author: finwo <finwo@pm.me>
Date:   Sat,  8 Jul 2023 22:07:25 +0200

Added missing http_parser_header_del implementation

Diffstat:
Msrc/http-parser.c | 50+++++++++++++++++++++++++++++++++++++++-----------
Msrc/http-parser.h | 6+++---
2 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/src/http-parser.c b/src/http-parser.c @@ -56,19 +56,13 @@ void http_parser_header_free(struct http_parser_header *header) { } /** - * Searches for the given key in the list of headers - * Returns the header's value or NULL if not found + * Internal, returns the pointer to a header entry that matches the key */ -char *http_parser_header_get(struct http_parser_message *subject, char *key) { +struct http_parser_header * _http_parser_header_get(struct http_parser_message *subject, const char *key) { struct http_parser_header *header = subject->headers; - char *value; while(header) { - if (!strcasecmp(key, header->key)) { - value = header->value; - while(*(value) == ' ') { - value++; - } - return value; + if (!strcasecmp(header->key, key)) { + return header; } header = header->next; } @@ -76,9 +70,21 @@ char *http_parser_header_get(struct http_parser_message *subject, char *key) { } /** + * Searches for the given key in the list of headers + * Returns the header's value or NULL if not found + */ +char *http_parser_header_get(struct http_parser_message *subject, const char *key) { + struct http_parser_header *header = _http_parser_header_get(subject, key); + if (!header) return NULL; + char *value = header->value; + while(*value == ' ') value++; + return value; +} + +/** * Write a header into the subject's list of headers */ -void http_parser_header_set(struct http_parser_message *subject, char *key, char *value) { +void http_parser_header_set(struct http_parser_message *subject, const char *key, const char *value) { struct http_parser_header *header = malloc(sizeof(struct http_parser_header)); header->key = strdup(key); header->value = strdup(value); @@ -87,6 +93,28 @@ void http_parser_header_set(struct http_parser_message *subject, char *key, char } /** + * Write a header into the subject's list of headers + */ +void http_parser_header_del(struct http_parser_message *subject, const char *key) { + struct http_parser_header *header_prev = NULL; + struct http_parser_header *header_cur = subject->headers; + while(header_cur) { + if (strcmp(header_cur->key, key) == 0) { + if (header_prev) { + header_prev->next = header_cur->next; + } else { + subject->headers = header_cur->next; + } + header_cur->next = NULL; + http_parser_header_free(header_cur); + header_cur = header_prev; + } + header_prev = header_cur; + header_cur = header_cur->next; + } +} + +/** * Frees everything in a http_message that was malloc'd by http-parser */ void http_parser_message_free(struct http_parser_message *subject) { diff --git a/src/http-parser.h b/src/http-parser.h @@ -52,9 +52,9 @@ struct http_parser_pair { }; // Header management -char *http_parser_header_get(struct http_parser_message *subject, char *key); -void http_parser_header_set(struct http_parser_message *subject, char *key, char *value); -char *http_parser_header_del(struct http_parser_message *subject, char *key); +char *http_parser_header_get(struct http_parser_message *subject, const char *key); +void http_parser_header_set(struct http_parser_message *subject ,const char *key, char *value); +void http_parser_header_del(struct http_parser_message *subject, const char *key); struct http_parser_pair * http_parser_pair_init(void *udata); struct http_parser_message * http_parser_request_init();