(* header.ml - HTTP header type and operations *) open Base module Name = Header_name type t = { name : Name.t ; name_span : Span.t ; value : Span.t } let rec find headers name = match headers with | [] -> None | hdr :: rest -> let matches = match name, hdr.name with | Name.Other, _ | _, Name.Other -> false | n1, n2 -> Poly.( = ) n1 n2 in if matches then Some hdr else find rest name ;; let rec find_string buf headers name = match headers with | [] -> None | hdr :: rest -> let matches = match hdr.name with | Name.Other -> Span.equal_caseless buf hdr.name_span name | known -> let canonical = Name.lowercase known in String.( = ) (String.lowercase name) canonical in if matches then Some hdr else find_string buf rest name ;; let pp_with_buf buf fmt t = Stdlib.Format.fprintf fmt "%s: %s" (Name.to_string buf t.name) (Span.to_string buf t.value) ;; let pp fmt t = Stdlib.Format.fprintf fmt "{ name = %a; name_span = { off = %d; len = %d }; value = { off = %d; len = %d } }" Name.pp t.name (Span.off t.name_span) (Span.len t.name_span) (Span.off t.value) (Span.len t.value) ;;