From 88b9f1e411b9644da43db7945f2a9f77c81548a1 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Wed, 21 Feb 2024 22:07:49 -0500 Subject: [PATCH] fix stream: fix a bug, use a loop in another place --- src/Tiny_httpd_stream.ml | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/src/Tiny_httpd_stream.ml b/src/Tiny_httpd_stream.ml index 5f8cf0a7..ce1002eb 100644 --- a/src/Tiny_httpd_stream.ml +++ b/src/Tiny_httpd_stream.ml @@ -50,10 +50,11 @@ let of_input ?(buf_size = 16 * 1024) (ic : IO.Input.t) : t = make ~bs:(Bytes.create buf_size) ~close:(fun _ -> IO.Input.close ic) ~consume:(fun self n -> + assert (self.len >= n); self.off <- self.off + n; self.len <- self.len - n) ~fill:(fun self -> - if self.off >= self.len then ( + if self.len = 0 then ( self.off <- 0; self.len <- IO.Input.input ic self.bs 0 (Bytes.length self.bs) )) @@ -73,15 +74,18 @@ let of_fd_ ?buf_size ~close_noerr ic : t = let of_fd ?buf_size fd : t = of_fd_ ?buf_size ~close_noerr:false fd let of_fd_close_noerr ?buf_size fd : t = of_fd_ ?buf_size ~close_noerr:true fd -let rec iter f (self : t) : unit = - self.fill_buf (); - if self.len = 0 then - self.close () - else ( - f self.bs self.off self.len; - self.consume self.len; - (iter [@tailcall]) f self - ) +let iter f (self : t) : unit = + let continue = ref true in + while !continue do + self.fill_buf (); + if self.len = 0 then ( + continue := false; + self.close () + ) else ( + f self.bs self.off self.len; + self.consume self.len + ) + done let to_chan (oc : out_channel) (self : t) = iter (output oc) self let to_chan' (oc : IO.Output.t) (self : t) = iter (IO.Output.output oc) self @@ -127,12 +131,13 @@ let read_all ?(buf = Buf.create ()) (self : t) : string = let continue = ref true in while !continue do self.fill_buf (); - if self.len > 0 then ( + if self.len = 0 then + continue := false + else ( + assert (self.len > 0); Buf.add_bytes buf self.bs self.off self.len; self.consume self.len - ); - assert (self.len >= 0); - if self.len = 0 then continue := false + ) done; Buf.contents_and_clear buf @@ -165,10 +170,10 @@ let read_line_into (self : t) ~buf : unit = done; if !j - self.off < self.len then ( assert (Bytes.get self.bs !j = '\n'); + (* line without '\n' *) Buf.add_bytes buf self.bs self.off (!j - self.off); - (* without \n *) + (* consume line + '\n' *) self.consume (!j - self.off + 1); - (* remove \n *) continue := false ) else ( Buf.add_bytes buf self.bs self.off self.len; @@ -273,7 +278,7 @@ let read_chunked ?(buf = Buf.create ()) ~fail (bs : t) : t = ~bs:(Bytes.create (16 * 4096)) ~fill:(fun self -> (* do we need to refill? *) - if self.off >= self.len then ( + if self.len = 0 then ( if !chunk_size = 0 && !refill then chunk_size := read_next_chunk_len (); self.off <- 0; self.len <- 0;