An OCaml webserver, but the allocating version (vs httpz which doesnt)
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;;