forked from
anil.recoil.org/ocaml-requests
A batteries included HTTP/1.1 client in OCaml
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy <anil@recoil.org>. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6(** Response limits for HTTP protocol handling
7
8 Configurable limits for response body size, header count, and header length
9 to prevent DoS attacks. *)
10
11type t = {
12 max_response_body_size : int64;
13 max_header_size : int;
14 max_header_count : int;
15 max_decompressed_size : int64;
16 max_compression_ratio : float;
17}
18
19let default =
20 {
21 max_response_body_size = 104_857_600L;
22 (* 100MB *)
23 max_header_size = 16_384;
24 (* 16KB *)
25 max_header_count = 100;
26 max_decompressed_size = 104_857_600L;
27 (* 100MB *)
28 max_compression_ratio = 100.0;
29 (* 100:1 *)
30 }
31
32let v ?(max_response_body_size = 104_857_600L) ?(max_header_size = 16_384)
33 ?(max_header_count = 100) ?(max_decompressed_size = 104_857_600L)
34 ?(max_compression_ratio = 100.0) () =
35 {
36 max_response_body_size;
37 max_header_size;
38 max_header_count;
39 max_decompressed_size;
40 max_compression_ratio;
41 }
42
43let max_response_body_size t = t.max_response_body_size
44let max_header_size t = t.max_header_size
45let max_header_count t = t.max_header_count
46let max_decompressed_size t = t.max_decompressed_size
47let max_compression_ratio t = t.max_compression_ratio
48
49let pp fmt t =
50 Fmt.pf fmt
51 "@[<v 2>Response_limits {@ max_response_body_size: %Ld bytes@ \
52 max_header_size: %d bytes@ max_header_count: %d@ max_decompressed_size: \
53 %Ld bytes@ max_compression_ratio: %.1f:1@ }@]"
54 t.max_response_body_size t.max_header_size t.max_header_count
55 t.max_decompressed_size t.max_compression_ratio
56
57let to_string t = Fmt.str "%a" pp t