An OCaml webserver, but the allocating version (vs httpz which doesnt)
at main 50 lines 1.2 kB view raw
1(* header.ml - HTTP header type and operations *) 2 3open Base 4 5module Name = Header_name 6 7type t = 8 { name : Name.t 9 ; name_span : Span.t 10 ; value : Span.t 11 } 12 13let rec find headers name = 14 match headers with 15 | [] -> None 16 | hdr :: rest -> 17 let matches = 18 match name, hdr.name with 19 | Name.Other, _ | _, Name.Other -> false 20 | n1, n2 -> Poly.( = ) n1 n2 21 in 22 if matches then Some hdr else find rest name 23;; 24 25let rec find_string buf headers name = 26 match headers with 27 | [] -> None 28 | hdr :: rest -> 29 let matches = 30 match hdr.name with 31 | Name.Other -> Span.equal_caseless buf hdr.name_span name 32 | known -> 33 let canonical = Name.lowercase known in 34 String.( = ) (String.lowercase name) canonical 35 in 36 if matches then Some hdr else find_string buf rest name 37;; 38 39let pp_with_buf buf fmt t = 40 Stdlib.Format.fprintf fmt "%s: %s" 41 (Name.to_string buf t.name) 42 (Span.to_string buf t.value) 43;; 44 45let pp fmt t = 46 Stdlib.Format.fprintf fmt "{ name = %a; name_span = { off = %d; len = %d }; value = { off = %d; len = %d } }" 47 Name.pp t.name 48 (Span.off t.name_span) (Span.len t.name_span) 49 (Span.off t.value) (Span.len t.value) 50;;