Can anyone help me out with this? In short, I'm doing a HTTP POST with a handler along the lines of: ``` fun ((resp : Cohttp_async.Response.t) , (body : Cohttp_async.Body.t)) : unit Or_error.t -> let r : string Async.Pipe.Reader.t = Cohttp_async.Body.to_pipe body in let _ = Async.Pipe.iter r ~continue_on_error:true ~f:(fun s -> Async.return (printf "%s" s)) in (Ok () : unit Or_error.t) ``` Each time I invoke the program I get, more or less output (very occasionally none) but never all of it. The response header says it's "fixed 2700816" and indeed, if I replace the code above with ``` fun ((resp : Cohttp_async.Response.t) , (body : Cohttp_async.Body.t)) : unit Or_error.t -> let r : string Async.Pipe.Reader.t = Cohttp_async.Body.to_pipe body in let n : int Deferred.t = Async.Pipe.fold r ~init:0 ~f:(fun acc s -> printf "acc : %d\n" acc; Async.return (acc + String.length s) ) in let _ : unit Deferred.t = n >>| fun n -> printf "Chars read : %d" n in (Ok () : unit Or_error.t) ``` then (for example), on the first run I might see ``` acc : 0 acc : 1118 acc : 7503 acc : 8780 ``` and then on the second run I might see ``` acc : 0 acc : 1118 acc : 4949 ``` but never have I seen "Chars read : 2700816". I've tried a bunch of different things: - `Pipe.read_all`: ``` let _ = Async.Pipe.read_all r >>| fun q -> Queue.iter q ~f:(fun s -> printf "%s" s) in ... ``` No output. - `Pipe.drain_and_count`: ``` let _ = Async.Pipe.drain_and_count r >>| fun n -> printf "Count %d\n" n in ... ``` No output. - `Pipe.to_list`: ``` let _ = Async.Pipe.to_list r >>| fun l -> printf "%s" (String.concat ~sep:"" l) in ... ``` No output. Also tried the obvious: - `Cohttp_async.Body.to_string`: ``` let s = Cohttp_async.Body.to_string body in let _ = s >>| fun s -> printf "%s" s in ... ``` No output. I'm new to this and obviously missing something fundamental :) Is there a kind soul out there who can give me a hint on how to proceed please? Thanks! -- Shayne Fletcher