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:
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();