diff --git a/src/gleam/http.gleam b/src/gleam/http.gleam index 1301272..136e97e 100644 --- a/src/gleam/http.gleam +++ b/src/gleam/http.gleam @@ -270,8 +270,7 @@ fn parse_headers_after_prelude( // compiler support this. use <- bool.guard( - when: dsize - < required_size, + when: dsize < required_size, return: more_please_headers(parse_headers_after_prelude(_, boundary), data), ) diff --git a/src/gleam/http/cookie.gleam b/src/gleam/http/cookie.gleam index 50d58a6..688e3b3 100644 --- a/src/gleam/http/cookie.gleam +++ b/src/gleam/http/cookie.gleam @@ -43,8 +43,7 @@ pub fn defaults(scheme: Scheme) { max_age: option.None, domain: option.None, path: option.Some("/"), - secure: scheme - == http.Https, + secure: scheme == http.Https, http_only: True, same_site: Some(Lax), ) diff --git a/src/gleam/http/request.gleam b/src/gleam/http/request.gleam index dd4fa51..78f0351 100644 --- a/src/gleam/http/request.gleam +++ b/src/gleam/http/request.gleam @@ -67,7 +67,13 @@ pub fn from_uri(uri: Uri) -> Result(Request(String), Nil) { /// If the request does not have that header then `Error(Nil)` is returned. /// pub fn get_header(request: Request(body), key: String) -> Result(String, Nil) { - list.key_find(request.headers, string.lowercase(key)) + let lowercased_key = string.lowercase(key) + use #(_, value) <- result.try( + list.find(request.headers, fn(header) { + string.lowercase(header.0) == lowercased_key + }), + ) + Ok(value) } /// Set the header with the given value under the given header key. diff --git a/test/gleam/http/request_test.gleam b/test/gleam/http/request_test.gleam index fe77807..7743ce5 100644 --- a/test/gleam/http/request_test.gleam +++ b/test/gleam/http/request_test.gleam @@ -178,6 +178,69 @@ pub fn get_req_header_test() { |> should.equal(Error(Nil)) } +pub fn get_req_case_insensitive_header_test() { + let make_request = fn(headers) { + Request( + method: http.Get, + headers: headers, + body: Nil, + scheme: http.Https, + host: "example.com", + port: None, + path: "/", + query: None, + ) + } + + // Test lowercase key -> uppercase header + let header_key = "gleam" + let request = make_request([#("GLEAM", "awesome")]) + + request + |> request.get_header(header_key) + |> should.equal(Ok("awesome")) + + // Test uppercase key -> uppercase header + let header_key = "GLEAM" + let request = make_request([#("GLEAM", "awesome")]) + + request + |> request.get_header(header_key) + |> should.equal(Ok("awesome")) + + // Test uppercase key -> lowercase header + let header_key = "GLEAM" + let request = make_request([#("gleam", "awesome")]) + + request + |> request.get_header(header_key) + |> should.equal(Ok("awesome")) + + // Test random cased key -> lowercase header + let header_key = "GlEaM" + let request = make_request([#("gleam", "awesome")]) + + request + |> request.get_header(header_key) + |> should.equal(Ok("awesome")) + + // Test uppercase key -> random cased header + let header_key = "GLEAM" + let request = make_request([#("gLeAm", "awesome")]) + + request + |> request.get_header(header_key) + |> should.equal(Ok("awesome")) + + // Test random cased key -> random cased header + let header_key = "GlEaM" + let request = make_request([#("gLeAm", "awesome")]) + + request + |> request.get_header(header_key) + |> should.equal(Ok("awesome")) +} + pub fn set_req_body_test() { let body = "