Skip to content

Commit

Permalink
Merge pull request #194 from inhabitedtype/fail-0-done
Browse files Browse the repository at this point in the history
ignore parse failures at checkpoints
  • Loading branch information
seliopou authored Mar 31, 2021
2 parents f50b87d + cfb253f commit 66f3e7a
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 10 deletions.
3 changes: 1 addition & 2 deletions lib/parse.ml
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,7 @@ module Reader = struct

let transition t state =
match state with
| AU.Done(consumed, Ok ())
| AU.Fail(0 as consumed, _, _) ->
| AU.Done(consumed, Ok ()) ->
t.parse_state <- Done;
consumed
| AU.Done(consumed, Error error) ->
Expand Down
36 changes: 28 additions & 8 deletions lib_test/test_server_connection.ml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ let reader_yielded t =
`Yield (next_read_operation t);
;;

let reader_closed t =
Alcotest.check read_operation "Reader is closed"
`Close (next_read_operation t);
;;

let write_string ?(msg="output written") t str =
let len = String.length str in
Alcotest.(check (option string)) msg
Expand Down Expand Up @@ -72,8 +77,7 @@ let writer_closed ?(unread = 0) t =
;;

let connection_is_shutdown t =
Alcotest.check read_operation "Reader is closed"
`Close (next_read_operation t);
reader_closed t;
writer_closed t;
;;

Expand Down Expand Up @@ -575,8 +579,7 @@ Accept: application/json, text/plain, */*\r\n\
Accept-Language: en-US,en;q=0.5\r\n\r\n";
Alcotest.(check bool) "Writer not woken up"
false !writer_woken_up;
Alcotest.check read_operation "reader closed"
`Close (next_read_operation t);
reader_closed t;
!continue_response ();
Alcotest.(check bool) "Writer woken up"
true !writer_woken_up;
Expand Down Expand Up @@ -605,8 +608,7 @@ let test_failed_request_parse () =
Alcotest.(check int) "partial read" 24 len;
Alcotest.(check bool) "Writer not woken up"
false !writer_woken_up;
Alcotest.check read_operation "reader closed"
`Close (next_read_operation t);
reader_closed t;
Alcotest.(check bool) "Error handler fired"
true !error_handler_fired;
Alcotest.(check bool) "Writer woken up"
Expand Down Expand Up @@ -640,8 +642,7 @@ let test_bad_request () =
read_request t request;
Alcotest.(check bool) "Writer not woken up"
false !writer_woken_up;
Alcotest.check read_operation "reader closed"
`Close (next_read_operation t);
reader_closed t;
Alcotest.(check bool) "Error handler fired"
true !error_handler_fired;
Alcotest.(check bool) "Writer woken up"
Expand Down Expand Up @@ -691,6 +692,24 @@ let test_multiple_async_requests_in_single_read () =
reader_ready t;
;;

let test_parse_failure_after_checkpoint () =
let error_queue = ref None in
let error_handler ?request:_ error _start_response =
Alcotest.(check (option reject)) "Error queue is empty" !error_queue None;
error_queue := Some error
in
let request_handler _reqd = assert false in
let t = create ~error_handler request_handler in
reader_ready t;
read_string t "GET index.html HTTP/1.1\r\n";
let result = feed_string t " index.html HTTP/1.1\r\n\r\n" in
Alcotest.(check int) "Bad header not consumed" result 0;
reader_closed t;
match !error_queue with
| None -> Alcotest.fail "Expected error"
| Some error -> Alcotest.(check request_error) "Error" error `Bad_request
;;

let tests =
[ "initial reader state" , `Quick, test_initial_reader_state
; "shutdown reader closed", `Quick, test_reader_is_closed_after_eof
Expand All @@ -716,4 +735,5 @@ let tests =
; "bad request", `Quick, test_bad_request
; "multiple requests in single read", `Quick, test_multiple_requests_in_single_read
; "multiple async requests in single read", `Quick, test_multiple_async_requests_in_single_read
; "parse failure after checkpoint", `Quick, test_parse_failure_after_checkpoint
]

0 comments on commit 66f3e7a

Please sign in to comment.