feat: use chunked encoding for large string responses, too

This commit is contained in:
Simon Cruanes 2020-05-27 22:16:36 -04:00
parent 020dd056ac
commit fdd97744e0

View file

@ -619,9 +619,12 @@ module Response = struct
let output_ (oc:out_channel) (self:t) : unit = 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); Printf.fprintf oc "HTTP/1.1 %d %s\r\n" self.code (Response_code.descr self.code);
let is_chunked = match self.body with let body, is_chunked = match self.body with
| `String _ -> false | `String s when String.length s > 1024 * 300 ->
| `Stream _ -> true (* chunk-encode large bodies *)
`Stream (Byte_stream.of_string s), true
| `String _ as b -> b, false
| `Stream _ as b -> b, true
in in
let headers = let headers =
if is_chunked if is_chunked
@ -630,7 +633,7 @@ module Response = struct
in in
List.iter (fun (k,v) -> Printf.fprintf oc "%s: %s\r\n" k v) headers; List.iter (fun (k,v) -> Printf.fprintf oc "%s: %s\r\n" k v) headers;
output_string oc "\r\n"; output_string oc "\r\n";
begin match self.body with begin match body with
| `String "" -> () | `String "" -> ()
| `String s -> output_string oc s; | `String s -> output_string oc s;
| `Stream str -> output_stream_chunked_ oc str; | `Stream str -> output_stream_chunked_ oc str;