From e1bfe709912a625d035f88a980f7daa84a5fe907 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Mon, 2 Dec 2024 14:19:06 -0500 Subject: [PATCH] feat headers: expose parsing helper --- src/core/headers.ml | 29 +++++++++++++++++++---------- src/core/headers.mli | 4 ++++ 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/core/headers.ml b/src/core/headers.ml index 1c1d8f87..19f06a3d 100644 --- a/src/core/headers.ml +++ b/src/core/headers.ml @@ -46,6 +46,21 @@ let for_all pred s = true with Exit -> false +let parse_line_ (line : string) : _ result = + try + let i = + try String.index line ':' + with Not_found -> failwith "invalid header, missing ':'" + in + let k = String.sub line 0 i in + if not (for_all is_tchar k) then + failwith (Printf.sprintf "Invalid header key: %S" k); + let v = + String.sub line (i + 1) (String.length line - i - 1) |> String.trim + in + Ok (k, v) + with Failure msg -> Error msg + let parse_ ~(buf : Buf.t) (bs : IO.Input.t) : t = let rec loop acc = match IO.Input.read_line_using_opt ~buf bs with @@ -56,16 +71,10 @@ let parse_ ~(buf : Buf.t) (bs : IO.Input.t) : t = bad_reqf 400 "bad header line, not ended in CRLF" | Some line -> let k, v = - try - let i = String.index line ':' in - let k = String.sub line 0 i in - 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 + match parse_line_ line with + | Ok r -> r + | Error msg -> + bad_reqf 400 "invalid header line: %s\nline is: %S" msg line in loop ((String.lowercase_ascii k, v) :: acc) in diff --git a/src/core/headers.mli b/src/core/headers.mli index b46b5d54..67feb9a8 100644 --- a/src/core/headers.mli +++ b/src/core/headers.mli @@ -33,3 +33,7 @@ val pp : Format.formatter -> t -> unit (** Pretty print the headers. *) val parse_ : buf:Buf.t -> IO.Input.t -> t +(**/*) + +val parse_line_ : string -> (string * string, string) result +(**/*)