From b80c5f922f376ce171dbc0b841dbf900260feaee Mon Sep 17 00:00:00 2001 From: Sam Tombury Date: Thu, 7 Nov 2024 13:08:01 +0000 Subject: [PATCH] fix: make check for 'Connection: Upgrade' header case-insensitive Some clients send lowercase 'upgrade' as value (matching typical keep-alive behaviour) --- src/core/server.ml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/core/server.ml b/src/core/server.ml index 2ddfd50c..c19987df 100644 --- a/src/core/server.ml +++ b/src/core/server.ml @@ -311,9 +311,11 @@ let find_map f l = in aux f l -let string_as_list_contains_ (s : string) (sub : string) : bool = +let header_list_contains_ (s : string) (name : string) : bool = + let name' = String.lowercase_ascii name in let fragments = String.split_on_char ',' s in - List.exists (fun fragment -> String.trim fragment = sub) fragments + List.exists (fun fragment -> + String.lowercase_ascii (String.trim fragment) = name') fragments (* handle client on [ic] and [oc] *) let client_handle_for (self : t) ~client_addr ic oc : unit = @@ -379,7 +381,7 @@ let client_handle_for (self : t) ~client_addr ic oc : unit = (* check headers *) (match Request.get_header req "connection" with - | Some str when string_as_list_contains_ str "Upgrade" -> () + | Some str when header_list_contains_ str "Upgrade" -> () | _ -> bad_reqf 426 "connection header must contain 'Upgrade'"); (match Request.get_header req "upgrade" with | Some u when u = UP.name -> ()