From 71f5648aa48db5cad9e816d6b84a34b2abf35a18 Mon Sep 17 00:00:00 2001 From: Jan-Erik Rediger Date: Mon, 3 Jun 2024 20:54:47 +0200 Subject: [PATCH] case-insensitive header name check and allow empty values --- net/http/header.ha | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/net/http/header.ha b/net/http/header.ha index c615484..62510d4 100644 --- a/net/http/header.ha +++ b/net/http/header.ha @@ -1,3 +1,4 @@ +use ascii; use bufio; use encoding::utf8; use fmt; @@ -12,7 +13,8 @@ export type header = [](str, str); // be canonicalized by the caller. export fn header_add(head: *header, name: str, val: str) void = { assert(len(name) >= 1 && len(val) >= 1); - append(head, (strings::dup(name), strings::dup(val))); + let name = ascii::strlower(name); + append(head, (name, strings::dup(val))); }; // Sets the value of a given HTTP header, removing any previous values. The name @@ -26,7 +28,7 @@ export fn header_set(head: *header, name: str, val: str) void = { // the given name, all matching headers are removed. export fn header_del(head: *header, name: str) void = { for (let i = 0z; i < len(head); i += 1) { - if (head[i].0 == name) { + if (ascii::strcasecmp(head[i].0, name) == 0) { free(head[i].0); free(head[i].1); delete(head[i]); @@ -40,7 +42,7 @@ export fn header_del(head: *header, name: str) void = { export fn header_get(head: *header, name: str) str = { for (let i = 0z; i < len(head); i += 1) { const (key, val) = head[i]; - if (key == name) { + if (ascii::strcasecmp(key, name) == 0) { return val; }; }; @@ -96,7 +98,7 @@ fn read_header(head: *header, scan: *bufio::scanner) (void | io::error | protoer let (name, val) = strings::cut(item, ":"); val = strings::trim(val); if (val == "") { - return protoerr; + continue; }; // TODO: validate field-name