Skip to content

Commit ed8b094

Browse files
authored
Merge pull request #174 from inhabitedtype/input-state
input-state: use a type to indicate Reqd input state
2 parents 9a2e158 + c57c2be commit ed8b094

File tree

2 files changed

+32
-14
lines changed

2 files changed

+32
-14
lines changed

lib/reqd.ml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ module Response_state = struct
4141
| Streaming of Response.t * [`write] Body.t
4242
end
4343

44+
module Input_state = struct
45+
type t =
46+
| Ready
47+
| Complete
48+
end
49+
4450
type error_handler =
4551
?request:Request.t -> error -> (Headers.t -> [`write] Body.t) -> unit
4652

@@ -224,8 +230,11 @@ let on_more_output_available t f =
224230
let persistent_connection t =
225231
t.persistent
226232

227-
let requires_input { request_body; _ } =
228-
not (Body.is_closed request_body)
233+
let input_state t : Input_state.t =
234+
if Body.is_closed t.request_body
235+
then Complete
236+
else Ready
237+
;;
229238

230239
let requires_output { response_state; _ } =
231240
match response_state with
@@ -236,7 +245,10 @@ let requires_output { response_state; _ } =
236245
| Waiting _ -> true
237246

238247
let is_complete t =
239-
not (requires_input t || requires_output t)
248+
match input_state t with
249+
| Complete -> not (requires_output t)
250+
| Ready -> false
251+
;;
240252

241253
let flush_request_body t =
242254
let request_body = request_body t in

lib/server_connection.ml

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -215,24 +215,30 @@ let advance_request_queue_if_necessary t =
215215
wakeup_writer t;
216216
if Reqd.is_complete reqd
217217
then shutdown t
218-
else if not (Reqd.requires_input reqd)
219-
then shutdown_reader t
218+
else
219+
match Reqd.input_state reqd with
220+
| Ready -> ()
221+
| Complete -> shutdown_reader t
220222
end
221223
end else if Reader.is_closed t.reader
222224
then shutdown t
223225

224226
let _next_read_operation t =
225227
advance_request_queue_if_necessary t;
226-
if is_active t then begin
228+
if is_active t
229+
then (
227230
let reqd = current_reqd_exn t in
228-
if Reqd.requires_input reqd then Reader.next t.reader
229-
else if Reqd.persistent_connection reqd then `Yield
230-
else begin
231-
shutdown_reader t;
232-
Reader.next t.reader
233-
end
234-
end else
235-
Reader.next t.reader
231+
match Reqd.input_state reqd with
232+
| Ready -> Reader.next t.reader
233+
| Complete ->
234+
if Reqd.persistent_connection reqd
235+
then `Yield
236+
else (
237+
shutdown_reader t;
238+
Reader.next t.reader)
239+
)
240+
else Reader.next t.reader
241+
;;
236242

237243
let next_read_operation t =
238244
match _next_read_operation t with

0 commit comments

Comments
 (0)