A batteries included HTTP/1.1 client in OCaml
at main 57 lines 1.8 kB view raw
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