Skip to content

Commit ad92acb

Browse files
committed
bugfixes in streams
1 parent 5aa29fb commit ad92acb

File tree

1 file changed

+40
-34
lines changed

1 file changed

+40
-34
lines changed

src/Tiny_httpd_stream.ml

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ let make ?(bs=Bytes.create @@ 16 * 1024) ?(close=ignore) ~consume ~fill () : t =
3232
off=0;
3333
len=0;
3434
close=(fun () -> close self);
35-
fill_buf=(fun () -> fill self);
35+
fill_buf=(fun () ->
36+
if self.len = 0 then fill self);
3637
consume=
3738
(fun n ->
3839
assert (n <= self.len);
@@ -46,7 +47,9 @@ let of_chan_ ?(buf_size=16 * 1024) ~close ic : t =
4647
make
4748
~bs:(Bytes.create buf_size)
4849
~close:(fun _ -> close ic)
49-
~consume:(fun buf n -> buf.off <- buf.off + n)
50+
~consume:(fun self n ->
51+
self.off <- self.off + n;
52+
self.len <- self.len - n)
5053
~fill:(fun self ->
5154
if self.off >= self.len then (
5255
self.off <- 0;
@@ -164,69 +167,71 @@ let read_line_into (self:t) ~buf : unit =
164167
(* new stream with maximum size [max_size].
165168
@param close_rec if true, closing this will also close the input stream
166169
@param too_big called with read size if the max size is reached *)
167-
let limit_size_to ~close_rec ~max_size ~too_big (self:t) : t =
170+
let limit_size_to ~close_rec ~max_size ~too_big (arg:t) : t =
168171
let size = ref 0 in
169172
let continue = ref true in
170173
make
171174
~bs:Bytes.empty
172175
~close:(fun _ ->
173-
if close_rec then self.close ())
174-
~fill:(fun buf ->
175-
if buf.len = 0 && !continue then (
176-
self.fill_buf();
177-
buf.bs <- self.bs;
178-
buf.off <- self.off;
179-
buf.len <- self.len;
176+
if close_rec then arg.close ())
177+
~fill:(fun res ->
178+
if res.len = 0 && !continue then (
179+
arg.fill_buf();
180+
res.bs <- arg.bs;
181+
res.off <- arg.off;
182+
res.len <- arg.len;
180183
) else (
181-
self.bs <- Bytes.empty;
182-
self.off <- 0;
183-
self.len <- 0;
184+
arg.bs <- Bytes.empty;
185+
arg.off <- 0;
186+
arg.len <- 0;
184187
)
185188
)
186-
~consume:(fun buf n ->
189+
~consume:(fun res n ->
187190
size := !size + n;
188191
if !size > max_size then (
189192
continue := false;
190193
too_big !size
191194
) else (
192-
self.consume n;
193-
buf.len <- buf.len - n;
195+
arg.consume n;
196+
res.off <- res.off + n;
197+
res.len <- res.len - n;
194198
))
195199
()
196200

197201
(* read exactly [size] bytes from the stream *)
198-
let read_exactly ~close_rec ~size ~too_short (self:t) : t =
202+
let read_exactly ~close_rec ~size ~too_short (arg:t) : t =
199203
if size=0 then (
200204
empty
201205
) else (
202206
let size = ref size in
203207
make ~bs:Bytes.empty
204-
~fill:(fun buf ->
205-
(* must not block on [self] if we're done *)
208+
~fill:(fun res ->
209+
(* must not block on [arg] if we're done *)
206210
if !size = 0 then (
207-
buf.bs <- Bytes.empty;
208-
buf.off <- 0;
209-
buf.len <- 0;
211+
res.bs <- Bytes.empty;
212+
res.off <- 0;
213+
res.len <- 0;
210214
) else (
211-
self.fill_buf();
212-
buf.bs <- self.bs;
213-
buf.off <- self.off;
214-
let len = min self.len !size in
215+
arg.fill_buf();
216+
res.bs <- arg.bs;
217+
res.off <- arg.off;
218+
let len = min arg.len !size in
215219
if len = 0 && !size > 0 then (
216220
too_short !size;
217221
);
218-
buf.len <- len;
222+
res.len <- len;
219223
))
220-
~close:(fun _buf ->
224+
~close:(fun _res ->
221225
(* close underlying stream if [close_rec] *)
222-
if close_rec then self.close();
226+
if close_rec then arg.close();
223227
size := 0
224228
)
225-
~consume:(fun buf n ->
229+
~consume:(fun res n ->
226230
let n = min n !size in
227231
size := !size - n;
228-
buf.len <- buf.len - n;
229-
self.consume n
232+
arg.consume n;
233+
res.off <- res.off + n;
234+
res.len <- res.len - n;
230235
)
231236
()
232237
)
@@ -263,7 +268,6 @@ let read_chunked ?(buf=Buf.create()) ~fail (bs:t) : t=
263268
if self.off >= self.len then (
264269
if !chunk_size = 0 && !refill then (
265270
chunk_size := read_next_chunk_len();
266-
(* _debug (fun k->k"read next chunk of size %d" !chunk_size); *)
267271
);
268272
self.off <- 0;
269273
self.len <- 0;
@@ -280,7 +284,9 @@ let read_chunked ?(buf=Buf.create()) ~fail (bs:t) : t=
280284
)
281285
);
282286
)
283-
~consume:(fun self n -> self.off <- self.off + n)
287+
~consume:(fun self n ->
288+
self.off <- self.off + n;
289+
self.len <- self.len - n)
284290
~close:(fun self ->
285291
(* close this overlay, do not close underlying stream *)
286292
self.len <- 0;

0 commit comments

Comments
 (0)