Skip to content

Commit d83f8d7

Browse files
authored
Add test where connection shuts down before response completes (#468)
1 parent 542926c commit d83f8d7

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

tests/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ add_test_case(h1_client_response_close_header_with_pipelining)
121121
add_test_case(h1_client_respects_stream_window)
122122
add_test_case(h1_client_connection_window_with_buffer)
123123
add_test_case(h1_client_connection_window_with_small_buffer)
124-
add_test_case(h1_client_request_cancelled_by_channel_shutdown)
124+
add_test_case(h1_client_request_cancelled_by_channel_shutdown_before_response)
125+
add_test_case(h1_client_request_cancelled_by_channel_shutdown_mid_response)
125126
add_test_case(h1_client_multiple_requests_cancelled_by_channel_shutdown)
126127
add_test_case(h1_client_new_request_fails_if_channel_shut_down)
127128
add_test_case(h1_client_error_from_outgoing_body_callback_stops_decoder)

tests/test_h1_client.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3273,7 +3273,8 @@ H1_CLIENT_TEST_CASE(h1_client_request_chunks_cancelled_by_channel_shutdown) {
32733273
return AWS_OP_SUCCESS;
32743274
}
32753275

3276-
H1_CLIENT_TEST_CASE(h1_client_request_cancelled_by_channel_shutdown) {
3276+
/* If channel shuts down before any response is received, the request should complete with an error */
3277+
H1_CLIENT_TEST_CASE(h1_client_request_cancelled_by_channel_shutdown_before_response) {
32773278
(void)ctx;
32783279
struct tester tester;
32793280
ASSERT_SUCCESS(s_tester_init(&tester, allocator));
@@ -3311,6 +3312,45 @@ H1_CLIENT_TEST_CASE(h1_client_request_cancelled_by_channel_shutdown) {
33113312
return AWS_OP_SUCCESS;
33123313
}
33133314

3315+
/* If channel shuts down in the middle of a response, the request should complete with an error */
3316+
H1_CLIENT_TEST_CASE(h1_client_request_cancelled_by_channel_shutdown_mid_response) {
3317+
(void)ctx;
3318+
struct tester tester;
3319+
ASSERT_SUCCESS(s_tester_init(&tester, allocator));
3320+
3321+
/* send request */
3322+
struct aws_http_message *request = s_new_default_get_request(allocator);
3323+
3324+
struct client_stream_tester stream_tester;
3325+
ASSERT_SUCCESS(s_stream_tester_init(&stream_tester, &tester, request));
3326+
3327+
testing_channel_drain_queued_tasks(&tester.testing_channel);
3328+
3329+
/* Ensure the request can be destroyed after request is sent */
3330+
aws_http_message_destroy(request);
3331+
3332+
/* send response that is 1 byte short of being complete */
3333+
const char *response_str = "HTTP/1.1 200 OK\r\n"
3334+
"Content-Length: 4\r\n"
3335+
"\r\n"
3336+
"123";
3337+
ASSERT_SUCCESS(testing_channel_push_read_str(&tester.testing_channel, response_str));
3338+
3339+
/* shutdown channel while response is 1 byte short of being complete */
3340+
aws_channel_shutdown(tester.testing_channel.channel, AWS_ERROR_SUCCESS);
3341+
testing_channel_drain_queued_tasks(&tester.testing_channel);
3342+
3343+
/* the request should complete with error, having only received a partial response */
3344+
ASSERT_TRUE(stream_tester.complete);
3345+
ASSERT_INT_EQUALS(AWS_ERROR_HTTP_CONNECTION_CLOSED, stream_tester.on_complete_error_code);
3346+
ASSERT_UINT_EQUALS(3, stream_tester.response_body.len);
3347+
3348+
/* clean up */
3349+
client_stream_tester_clean_up(&stream_tester);
3350+
ASSERT_SUCCESS(s_tester_clean_up(&tester));
3351+
return AWS_OP_SUCCESS;
3352+
}
3353+
33143354
H1_CLIENT_TEST_CASE(h1_client_multiple_requests_cancelled_by_channel_shutdown) {
33153355
(void)ctx;
33163356
struct tester tester;

0 commit comments

Comments
 (0)