From fdd97744e0339c03dba9dc5ed1db0a3e7c7cbf01 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 27 May 2020 22:16:36 -0400 Subject: [PATCH] feat: use chunked encoding for large string responses, too --- src/Tiny_httpd.ml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Tiny_httpd.ml b/src/Tiny_httpd.ml index 5843bf2a..a7a9967b 100644 --- a/src/Tiny_httpd.ml +++ b/src/Tiny_httpd.ml @@ -619,9 +619,12 @@ module Response = struct let output_ (oc:out_channel) (self:t) : unit = Printf.fprintf oc "HTTP/1.1 %d %s\r\n" self.code (Response_code.descr self.code); - let is_chunked = match self.body with - | `String _ -> false - | `Stream _ -> true + let body, is_chunked = match self.body with + | `String s when String.length s > 1024 * 300 -> + (* chunk-encode large bodies *) + `Stream (Byte_stream.of_string s), true + | `String _ as b -> b, false + | `Stream _ as b -> b, true in let headers = if is_chunked @@ -630,7 +633,7 @@ module Response = struct in List.iter (fun (k,v) -> Printf.fprintf oc "%s: %s\r\n" k v) headers; output_string oc "\r\n"; - begin match self.body with + begin match body with | `String "" -> () | `String s -> output_string oc s; | `Stream str -> output_stream_chunked_ oc str;