From 13400f0797e7c77a8b308ef660b87258dd63b07c Mon Sep 17 00:00:00 2001 From: Anurag Soni Date: Thu, 13 May 2021 19:49:28 -0400 Subject: [PATCH] address review feedback --- src/Tiny_httpd.ml | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/Tiny_httpd.ml b/src/Tiny_httpd.ml index f1a47bed..0f18b7c8 100644 --- a/src/Tiny_httpd.ml +++ b/src/Tiny_httpd.ml @@ -321,27 +321,19 @@ module Headers = struct let pp_pair out (k,v) = Format.fprintf out "@[%s: %s@]" k v in Format.fprintf out "@[%a@]" (Format.pp_print_list pp_pair) l -(* token = 1*tchar - tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" / "_" - / "`" / "|" / "~" / DIGIT / ALPHA ; any VCHAR, except delimiters - Reference: https://datatracker.ietf.org/doc/html/rfc7230#section-3.2 *) -let is_tchar = function - | '0' .. '9' - | 'a' .. 'z' - | 'A' .. 'Z' - | '!' | '#' | '$' | '%' | '&' | '\'' | '*' | '+' | '-' | '.' | '^' | '_' | '`' - | '|' | '~' -> - true - | _ -> false + (* token = 1*tchar + tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / "^" / "_" + / "`" / "|" / "~" / DIGIT / ALPHA ; any VCHAR, except delimiters + Reference: https://datatracker.ietf.org/doc/html/rfc7230#section-3.2 *) + let is_tchar = function + | '0' .. '9' | 'a' .. 'z' | 'A' .. 'Z' + | '!' | '#' | '$' | '%' | '&' | '\'' | '*' | '+' | '-' | '.' | '^' + | '_' | '`' | '|' | '~' -> true + | _ -> false let for_all pred s = - let len = String.length s in - let rec loop idx = - if idx = len then true - else if pred (String.unsafe_get s idx) then loop (idx + 1) - else false - in - loop 0 + try String.iter (fun c->if not (pred c) then raise Exit) s; true + with Exit -> false let parse_ ~buf (bs:byte_stream) : t = let rec loop acc = @@ -354,10 +346,10 @@ let is_tchar = function try let i = String.index line ':' in let k = String.sub line 0 i in - if for_all is_tchar k then ( - let v = String.sub line (i+1) (String.length line-i-1) |> String.trim in - k,v) - else invalid_arg (Printf.sprintf "Invalid header key: %S" k) + if not (for_all is_tchar k) then ( + invalid_arg (Printf.sprintf "Invalid header key: %S" k)); + let v = String.sub line (i+1) (String.length line-i-1) |> String.trim in + k,v with _ -> bad_reqf 400 "invalid header line: %S" line in loop ((String.lowercase_ascii k,v)::acc)