@@ -1284,7 +1284,8 @@ static bool s_header_value_from_list(
12841284 return false;
12851285}
12861286
1287- static void s_get_part_response_headers_checksum_helper (
1287+ /* Return if we found the checksum from headers or not. */
1288+ static bool s_get_part_response_headers_checksum_helper (
12881289 struct aws_s3_connection * connection ,
12891290 struct aws_s3_meta_request * meta_request ,
12901291 const struct aws_http_header * headers ,
@@ -1308,9 +1309,10 @@ static void s_get_part_response_headers_checksum_helper(
13081309 aws_checksum_new (meta_request -> allocator , algorithm );
13091310 AWS_ASSERT (connection -> request -> request_level_running_response_sum != NULL );
13101311 }
1311- break ;
1312+ return true ;
13121313 }
13131314 }
1315+ return false;
13141316}
13151317
13161318static int s_s3_meta_request_incoming_headers (
@@ -1355,10 +1357,27 @@ static int s_s3_meta_request_incoming_headers(
13551357
13561358 if (successful_response && meta_request -> checksum_config .validate_response_checksum &&
13571359 request -> request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT ) {
1358- /* We have `struct aws_http_header *` array instead of `struct aws_http_headers *` :) */
1360+ /* We have `struct aws_http_header *` array instead of `struct aws_http_headers *` */
13591361 s_get_part_response_headers_checksum_helper (connection , meta_request , headers , headers_count );
13601362 }
13611363
1364+ #if DEBUG_BUILD
1365+ /* Only perform this validation during debug build, since it's a programming bug and "expensive" for each response
1366+ * received */
1367+ if (successful_response && request -> request_type == AWS_S3_REQUEST_TYPE_GET_OBJECT ) {
1368+ uint64_t object_size = 0 ;
1369+ uint64_t object_range_start = 0 ;
1370+ uint64_t object_range_end = 0 ;
1371+ if (aws_s3_parse_content_range_response_header (
1372+ meta_request -> allocator , headers , & object_range_start , & object_range_end , & object_size ) ==
1373+ AWS_OP_SUCCESS ) {
1374+ /* Validate that the content-range response matches the request. */
1375+ AWS_ASSERT (request -> part_range_start == object_range_start );
1376+ AWS_ASSERT (request -> part_range_end == object_range_end );
1377+ }
1378+ }
1379+ #endif /* DEBUG_BUILD */
1380+
13621381 /* Only record headers if an error has taken place, or if the request_desc has asked for them. */
13631382 bool should_record_headers = !successful_response || request -> record_response_headers ;
13641383
@@ -1963,6 +1982,9 @@ static void s_s3_meta_request_event_delivery_task(struct aws_task *task, void *a
19631982 struct aws_byte_cursor response_body = aws_byte_cursor_from_buf (& request -> send_data .response_body );
19641983
19651984 AWS_ASSERT (request -> part_number >= 1 );
1985+ /* Make sure the response body is delivered in the sequential order */
1986+ AWS_FATAL_ASSERT (request -> part_range_start == meta_request -> io_threaded_data .next_deliver_range_start );
1987+ meta_request -> io_threaded_data .next_deliver_range_start += response_body .len ;
19661988
19671989 if (error_code == AWS_ERROR_SUCCESS && response_body .len > 0 ) {
19681990 if (meta_request -> meta_request_level_running_response_sum ) {
0 commit comments