Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Respect checksum header over setting #474

Merged
merged 82 commits into from
Dec 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
8045073
rewrite some checksum related code
TingDaoK Jun 21, 2024
51185c6
it's just getting worse
TingDaoK Jun 21, 2024
6231c60
format
TingDaoK Jun 21, 2024
aca9b76
check for error
TingDaoK Jun 24, 2024
ce75d8c
add a log
TingDaoK Jun 24, 2024
7311370
Merge branch 'checksum-callback' of github.com:awslabs/aws-c-s3 into …
TingDaoK Jun 24, 2024
b18dc5e
pointer to pointer..
TingDaoK Jun 24, 2024
ccb46ee
use one function instead of two
TingDaoK Jun 24, 2024
6698fc9
Merge branch 'main' into checksum-callback
TingDaoK Jul 31, 2024
bb3c9b4
Add crc64
TingDaoK Oct 3, 2024
f5362e5
add support for header checksum
TingDaoK Oct 7, 2024
9b84eb6
add test instead of modify the old one
TingDaoK Oct 7, 2024
2247165
Add crc64
TingDaoK Oct 3, 2024
ec0979f
Merge branch 'crc64' of github.com:awslabs/aws-c-s3-staging into crc64
TingDaoK Oct 9, 2024
41df82f
support the full object checksum from header
TingDaoK Oct 14, 2024
09a9aca
With test
TingDaoK Oct 16, 2024
425d190
we need type for both create and complete
TingDaoK Oct 16, 2024
58082bc
CI stuff
TingDaoK Oct 16, 2024
5318f1f
manually cherry pick :)
TingDaoK Oct 16, 2024
40512ab
use east-2 bucket as the motorcate only availble from east-2
TingDaoK Oct 16, 2024
f9a1f41
the new header was added
TingDaoK Oct 17, 2024
24ccf1d
fix test and disable the sse-c test, which I believe it's an s3 bug
TingDaoK Oct 17, 2024
5ca2e91
fine windows.
TingDaoK Oct 17, 2024
740eb8e
get CI
TingDaoK Oct 17, 2024
51ef605
add support for header checksum
TingDaoK Oct 7, 2024
7a87f03
add test instead of modify the old one
TingDaoK Oct 7, 2024
1eed0f6
Add crc64
TingDaoK Oct 3, 2024
62fee3e
add crc64
TingDaoK Oct 17, 2024
15e8354
permission
TingDaoK Oct 17, 2024
7771f8b
Merge branch 'latest-CI' into crc64
TingDaoK Oct 17, 2024
ec5ea6f
Merge branch 'crc64' into CI-staging
TingDaoK Oct 17, 2024
02d401e
update the endpoint as motorcade only available from east-2
TingDaoK Oct 17, 2024
b9ba039
skip the sse-c test and fix the region
TingDaoK Oct 17, 2024
c34cb18
Merge branch 'latest-CI' into crc64
TingDaoK Oct 17, 2024
b972ba0
Merge branch 'latest-CI' into CI-staging
TingDaoK Oct 17, 2024
edcceac
hmmmm
TingDaoK Oct 17, 2024
146a203
hmmmm
TingDaoK Oct 17, 2024
56e921e
hmmmm
TingDaoK Oct 17, 2024
52ef09c
merge conflict
TingDaoK Oct 17, 2024
6e8e773
pick up the fix
TingDaoK Oct 18, 2024
2cdc0ce
use two different path for full object checksum
TingDaoK Oct 18, 2024
02c2afc
rename
TingDaoK Oct 18, 2024
258dd5d
don't need to force the config now
TingDaoK Oct 21, 2024
ffb17a0
add checksum callback
TingDaoK Oct 22, 2024
89ac6f8
WIP
TingDaoK Oct 22, 2024
14299cb
address comments
TingDaoK Oct 22, 2024
3a27771
Apply suggestions from code review
TingDaoK Oct 22, 2024
59286c0
remove truncated to
TingDaoK Oct 22, 2024
69841e3
need to update the pointer to clean up as well
TingDaoK Oct 22, 2024
e9247f5
merge
TingDaoK Oct 22, 2024
ef90727
handle error from hash_fn
TingDaoK Oct 22, 2024
3efcc3f
use a hard coded list instead and keep the enum value
TingDaoK Oct 23, 2024
b48a329
ooops
TingDaoK Oct 23, 2024
a477b16
array size
TingDaoK Oct 23, 2024
529e02d
Apply suggestions from code review
TingDaoK Oct 28, 2024
5d51e34
Merge branch 'crc64' into support-full-object-checksum
TingDaoK Oct 28, 2024
c5a109c
fix the assert
TingDaoK Oct 28, 2024
2468855
fix assert
TingDaoK Oct 28, 2024
90166d5
merge fix
TingDaoK Oct 28, 2024
343835d
Merge branch 'crc64' into support-full-object-checksum
TingDaoK Oct 28, 2024
7792547
address comments
TingDaoK Oct 28, 2024
106464c
Merge branch 'support-full-object-checksum' into checksum-callback
TingDaoK Oct 30, 2024
1264ba2
adapt change
TingDaoK Oct 30, 2024
26749ce
add more documentations
TingDaoK Oct 30, 2024
63db63d
trivial formatting
TingDaoK Oct 30, 2024
2af2697
add the same warning
TingDaoK Oct 30, 2024
e79d201
bring back the sse-c test
TingDaoK Nov 4, 2024
3ab370a
revert the temp change
TingDaoK Dec 2, 2024
b1b1fc1
Merge branch 'main' into support-full-object-checksum
TingDaoK Dec 2, 2024
4df9989
revert ci change
TingDaoK Dec 2, 2024
623e204
Merge branch 'support-full-object-checksum' into checksum-callback
TingDaoK Dec 2, 2024
1330da1
address comments
TingDaoK Dec 3, 2024
de0f416
make sure callbacks will not overlap
TingDaoK Dec 4, 2024
24f0bb0
handles it differently
TingDaoK Dec 4, 2024
7e0c652
raise an error in case of both header and callback are set
TingDaoK Dec 4, 2024
ea58704
Apply suggestions from code review
TingDaoK Dec 10, 2024
63c7120
respect checksum header over config setting
TingDaoK Dec 10, 2024
1df7388
Merge branch 'checksum-callback' of github.com:awslabs/aws-c-s3 into …
TingDaoK Dec 10, 2024
7d22a49
Merge branch 'main' into checksum-callback
TingDaoK Dec 10, 2024
c3f1c3e
Merge branch 'checksum-callback' into respect-checksum-header-over-se…
TingDaoK Dec 10, 2024
7f7a2a9
move to config init
TingDaoK Dec 10, 2024
40a2b56
add tests
TingDaoK Dec 10, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions include/aws/s3/private/s3_checksums.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,10 +166,12 @@ AWS_S3_API
int aws_checksum_finalize(struct aws_s3_checksum *checksum, struct aws_byte_buf *output);

AWS_S3_API
void aws_checksum_config_storage_init(
int aws_checksum_config_storage_init(
struct aws_allocator *allocator,
struct checksum_config_storage *internal_config,
const struct aws_s3_checksum_config *config);
const struct aws_s3_checksum_config *config,
const struct aws_http_message *message,
const void *log_id);

AWS_S3_API
void aws_checksum_config_storage_cleanup(struct checksum_config_storage *internal_config);
Expand Down
3 changes: 3 additions & 0 deletions include/aws/s3/s3_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,9 @@ struct aws_s3_meta_request_options {
/**
* Optional.
* if set, the flexible checksum will be performed by client based on the config.
*
* Notes: checksum can also be added through the http message provided.
* The checksum in http header will override corresponding the checksum config.
*/
const struct aws_s3_checksum_config *checksum_config;

Expand Down
79 changes: 4 additions & 75 deletions source/s3_auto_ranged_put.c
Original file line number Diff line number Diff line change
Expand Up @@ -313,78 +313,6 @@ static struct aws_s3_meta_request_vtable s_s3_auto_ranged_put_vtable = {
.pause = s_s3_auto_ranged_put_pause,
};

static int s_init_and_verify_checksum_config_from_headers(
struct checksum_config_storage *checksum_config,
const struct aws_http_message *message,
const void *log_id) {
/* Check if the checksum header was set from the message */
struct aws_http_headers *headers = aws_http_message_get_headers(message);
enum aws_s3_checksum_algorithm header_algo = AWS_SCA_NONE;
struct aws_byte_cursor header_value;
AWS_ZERO_STRUCT(header_value);

for (size_t i = 0; i < AWS_ARRAY_SIZE(s_checksum_algo_priority_list); i++) {
enum aws_s3_checksum_algorithm algorithm = s_checksum_algo_priority_list[i];
const struct aws_byte_cursor algorithm_header_name =
aws_get_http_header_name_from_checksum_algorithm(algorithm);
if (aws_http_headers_get(headers, algorithm_header_name, &header_value) == AWS_OP_SUCCESS) {
if (header_algo == AWS_SCA_NONE) {
header_algo = algorithm;
} else {
/* If there are multiple checksum headers set, it's malformed request */
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p Could not create auto-ranged-put meta request; multiple checksum headers has been set",
log_id);
return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
}
}
}
if (header_algo == AWS_SCA_NONE) {
/* No checksum header found, done */
return AWS_OP_SUCCESS;
}

/* Found the full object checksum from the header, check if it matches the explicit setting from config */
if (checksum_config->checksum_algorithm != AWS_SCA_NONE && checksum_config->checksum_algorithm != header_algo) {
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p: Could not create auto-ranged-put meta request; checksum config mismatch the checksum from header.",
log_id);
return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
}
if (checksum_config->has_full_object_checksum) {
/* If the full object checksum has been set, it's malformed request */
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p: Could not create auto-ranged-put meta request; full object checksum is set from multiple ways.",
log_id);
return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
}

AWS_LOGF_DEBUG(
AWS_LS_S3_META_REQUEST,
"id=%p: Setting the full-object checksum from header; algorithm: " PRInSTR ", value: " PRInSTR ".",
log_id,
AWS_BYTE_CURSOR_PRI(aws_get_checksum_algorithm_name(header_algo)),
AWS_BYTE_CURSOR_PRI(header_value));
/* Set algo */
checksum_config->checksum_algorithm = header_algo;
if (checksum_config->location == AWS_SCL_NONE) {
/* Set the checksum location to trailer for the parts, complete MPU will still have the checksum in the header.
* But to keep the data integrity for the parts, we need to set the checksum location to trailer to send the
* parts level checksums.
*/
checksum_config->location = AWS_SCL_TRAILER;
}

/* Set full object checksum from the header value. */
aws_byte_buf_init_copy_from_cursor(
&checksum_config->full_object_checksum, checksum_config->allocator, header_value);
checksum_config->has_full_object_checksum = true;
return AWS_OP_SUCCESS;
}

/* Allocate a new auto-ranged put meta request */
struct aws_s3_meta_request *aws_s3_meta_request_auto_ranged_put_new(
struct aws_allocator *allocator,
Expand Down Expand Up @@ -442,9 +370,10 @@ struct aws_s3_meta_request *aws_s3_meta_request_auto_ranged_put_new(
goto error_clean_up;
}

if (s_init_and_verify_checksum_config_from_headers(
&auto_ranged_put->base.checksum_config, options->message, (void *)&auto_ranged_put->base)) {
goto error_clean_up;
if (auto_ranged_put->base.checksum_config.full_object_checksum.len > 0) {
/* The full object checksum was set, make sure the parts level checksum will be calculated and sent via client.
*/
auto_ranged_put->base.checksum_config.location = AWS_SCL_TRAILER;
}

AWS_LOGF_DEBUG(
Expand Down
107 changes: 104 additions & 3 deletions source/s3_checksums.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "aws/s3/private/s3_util.h"
#include <aws/cal/hash.h>
#include <aws/checksums/crc.h>
#include <aws/http/request_response.h>

#define AWS_CRC32_LEN sizeof(uint32_t)
#define AWS_CRC32C_LEN sizeof(uint32_t)
Expand Down Expand Up @@ -330,17 +331,109 @@ int aws_checksum_compute(
}
}

void aws_checksum_config_storage_init(
static int s_init_and_verify_checksum_config_from_headers(
struct checksum_config_storage *checksum_config,
const struct aws_http_message *message,
const void *log_id) {
/* Check if the checksum header was set from the message */
struct aws_http_headers *headers = aws_http_message_get_headers(message);
enum aws_s3_checksum_algorithm header_algo = AWS_SCA_NONE;
struct aws_byte_cursor header_value;
AWS_ZERO_STRUCT(header_value);

for (size_t i = 0; i < AWS_ARRAY_SIZE(s_checksum_algo_priority_list); i++) {
enum aws_s3_checksum_algorithm algorithm = s_checksum_algo_priority_list[i];
const struct aws_byte_cursor algorithm_header_name =
aws_get_http_header_name_from_checksum_algorithm(algorithm);
if (aws_http_headers_get(headers, algorithm_header_name, &header_value) == AWS_OP_SUCCESS) {
if (header_algo == AWS_SCA_NONE) {
header_algo = algorithm;
} else {
/* If there are multiple checksum headers set, it's malformed request */
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p Could not create auto-ranged-put meta request; multiple checksum headers has been set",
log_id);
return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
}
}
}
if (header_algo == AWS_SCA_NONE) {
/* No checksum header found, done */
return AWS_OP_SUCCESS;
}

if (checksum_config->has_full_object_checksum) {
/* If the full object checksum has been set, it's malformed request */
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p: Could not create auto-ranged-put meta request; full object checksum is set from multiple ways.",
log_id);
return aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
}

AWS_LOGF_DEBUG(
AWS_LS_S3_META_REQUEST,
"id=%p Setting the full-object checksum from header; algorithm: " PRInSTR ", value: " PRInSTR ".",
log_id,
AWS_BYTE_CURSOR_PRI(aws_get_checksum_algorithm_name(header_algo)),
AWS_BYTE_CURSOR_PRI(header_value));
/* Set algo */
checksum_config->checksum_algorithm = header_algo;
/**
* Set the location to NONE to avoid adding extra checksums from client.
*
* Notes: The multipart upload will set the location to trailer to add parts level checksums.
**/
checksum_config->location = AWS_SCL_NONE;

/* Set full object checksum from the header value. */
aws_byte_buf_init_copy_from_cursor(
&checksum_config->full_object_checksum, checksum_config->allocator, header_value);
checksum_config->has_full_object_checksum = true;
return AWS_OP_SUCCESS;
}

int aws_checksum_config_storage_init(
struct aws_allocator *allocator,
struct checksum_config_storage *internal_config,
const struct aws_s3_checksum_config *config) {
const struct aws_s3_checksum_config *config,
const struct aws_http_message *message,
const void *log_id) {
AWS_ZERO_STRUCT(*internal_config);
/* Zero out the struct and set the allocator regardless. */
internal_config->allocator = allocator;

if (!config) {
return;
return AWS_OP_SUCCESS;
}

struct aws_http_headers *headers = aws_http_message_get_headers(message);
if (config->location == AWS_SCL_TRAILER) {
struct aws_byte_cursor existing_encoding;
AWS_ZERO_STRUCT(existing_encoding);
if (aws_http_headers_get(headers, g_content_encoding_header_name, &existing_encoding) == AWS_OP_SUCCESS) {
if (aws_byte_cursor_find_exact(&existing_encoding, &g_content_encoding_header_aws_chunked, NULL) ==
AWS_OP_SUCCESS) {
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p Cannot create meta s3 request; for trailer checksum, the original request cannot be "
"aws-chunked encoding. The client will encode the request instead.",
(void *)log_id);
aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
return AWS_OP_ERR;
}
}
}
if (config->location != AWS_SCL_NONE && config->checksum_algorithm == AWS_SCA_NONE) {
AWS_LOGF_ERROR(
AWS_LS_S3_META_REQUEST,
"id=%p Cannot create meta s3 request; checksum location is set, but no checksum algorithm selected.",
(void *)log_id);
aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
return AWS_OP_ERR;
}

internal_config->checksum_algorithm = config->checksum_algorithm;
internal_config->location = config->location;
internal_config->validate_response_checksum = config->validate_response_checksum;
Expand Down Expand Up @@ -385,6 +478,14 @@ void aws_checksum_config_storage_init(
internal_config->response_checksum_algorithms.sha1 = true;
internal_config->response_checksum_algorithms.sha256 = true;
}

/* After applying settings from config, check the message header to override the corresponding settings. */
if (s_init_and_verify_checksum_config_from_headers(internal_config, message, log_id)) {
return AWS_OP_ERR;
}
/* Anything fail afterward will need to cleanup the storage. */

return AWS_OP_SUCCESS;
}

void aws_checksum_config_storage_cleanup(struct checksum_config_storage *internal_config) {
Expand Down
30 changes: 0 additions & 30 deletions source/s3_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -945,36 +945,6 @@ struct aws_s3_meta_request *aws_s3_client_make_meta_request(
return NULL;
}

if (options->checksum_config) {
if (options->checksum_config->location == AWS_SCL_TRAILER) {
struct aws_http_headers *headers = aws_http_message_get_headers(options->message);
struct aws_byte_cursor existing_encoding;
AWS_ZERO_STRUCT(existing_encoding);
if (aws_http_headers_get(headers, g_content_encoding_header_name, &existing_encoding) == AWS_OP_SUCCESS) {
if (aws_byte_cursor_find_exact(&existing_encoding, &g_content_encoding_header_aws_chunked, NULL) ==
AWS_OP_SUCCESS) {
AWS_LOGF_ERROR(
AWS_LS_S3_CLIENT,
"id=%p Cannot create meta s3 request; for trailer checksum, the original request cannot be "
"aws-chunked encoding. The client will encode the request instead.",
(void *)client);
aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
return NULL;
}
}
}

if (options->checksum_config->location != AWS_SCL_NONE &&
options->checksum_config->checksum_algorithm == AWS_SCA_NONE) {
AWS_LOGF_ERROR(
AWS_LS_S3_CLIENT,
"id=%p Cannot create meta s3 request; checksum location is set, but no checksum algorithm selected.",
(void *)client);
aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
return NULL;
}
}

if (s_apply_endpoint_override(client, message_headers, options->endpoint)) {
return NULL;
}
Expand Down
9 changes: 8 additions & 1 deletion source/s3_meta_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,14 @@ int aws_s3_meta_request_init_base(

*((size_t *)&meta_request->part_size) = part_size;
*((bool *)&meta_request->should_compute_content_md5) = should_compute_content_md5;
aws_checksum_config_storage_init(meta_request->allocator, &meta_request->checksum_config, options->checksum_config);
if (aws_checksum_config_storage_init(
meta_request->allocator,
&meta_request->checksum_config,
options->checksum_config,
options->message,
(void *)meta_request)) {
goto error;
}

if (options->signing_config) {
meta_request->cached_signing_config = aws_cached_signing_config_new(client, options->signing_config);
Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ add_net_test_case(test_s3_round_trip_with_filepath)
add_net_test_case(test_s3_round_trip_mpu_with_filepath)
add_net_test_case(test_s3_round_trip_with_filepath_no_content_length)
add_net_test_case(test_s3_round_trip_mpu_with_filepath_no_content_length)
add_net_test_case(test_s3_round_trip_default_get_full_object_checksum_fc)
add_net_test_case(test_s3_round_trip_mpu_multipart_get_full_object_checksum_fc)
add_net_test_case(test_s3_round_trip_mpu_multipart_get_full_object_checksum_fc_header)
add_net_test_case(test_s3_round_trip_mpu_multipart_get_full_object_checksum_via_callback)
Expand Down
22 changes: 19 additions & 3 deletions tests/s3_data_plane_tests.c
Original file line number Diff line number Diff line change
Expand Up @@ -3918,7 +3918,11 @@ void s_s3_test_no_validate_checksum(
}

/* TODO: maybe refactor the fc -> flexible checksum tests to be less copy/paste */
static int s_test_s3_round_trip_default_get_fc_helper(struct aws_allocator *allocator, void *ctx, bool via_header) {
static int s_test_s3_round_trip_default_get_fc_helper(
struct aws_allocator *allocator,
void *ctx,
bool via_header,
enum aws_s3_tester_full_object_checksum full_object_checksum) {
(void)ctx;

struct aws_s3_tester tester;
Expand Down Expand Up @@ -3960,6 +3964,10 @@ static int s_test_s3_round_trip_default_get_fc_helper(struct aws_allocator *allo
.object_path_override = object_path,
},
};
if (algorithm != AWS_SCA_SHA1 && algorithm != AWS_SCA_SHA256) {
/* Full object checksums doesn't support SHA. */
put_options.put_options.full_object_checksum = full_object_checksum;
}

ASSERT_SUCCESS(aws_s3_tester_send_meta_request_with_options(&tester, &put_options, NULL));

Expand Down Expand Up @@ -3992,12 +4000,18 @@ static int s_test_s3_round_trip_default_get_fc_helper(struct aws_allocator *allo

AWS_TEST_CASE(test_s3_round_trip_default_get_fc, s_test_s3_round_trip_default_get_fc)
static int s_test_s3_round_trip_default_get_fc(struct aws_allocator *allocator, void *ctx) {
return s_test_s3_round_trip_default_get_fc_helper(allocator, ctx, false);
return s_test_s3_round_trip_default_get_fc_helper(allocator, ctx, false, AWS_TEST_FOC_NONE);
}

AWS_TEST_CASE(test_s3_round_trip_default_get_fc_header, s_test_s3_round_trip_default_get_fc_header)
static int s_test_s3_round_trip_default_get_fc_header(struct aws_allocator *allocator, void *ctx) {
return s_test_s3_round_trip_default_get_fc_helper(allocator, ctx, true);
return s_test_s3_round_trip_default_get_fc_helper(allocator, ctx, true, AWS_TEST_FOC_NONE);
}
AWS_TEST_CASE(
test_s3_round_trip_default_get_full_object_checksum_fc,
s_test_s3_round_trip_default_get_full_object_checksum_fc)
static int s_test_s3_round_trip_default_get_full_object_checksum_fc(struct aws_allocator *allocator, void *ctx) {
return s_test_s3_round_trip_default_get_fc_helper(allocator, ctx, false, AWS_TEST_FOC_HEADER);
}

static int s_test_s3_round_trip_multipart_get_fc_helper(struct aws_allocator *allocator, void *ctx, bool via_header) {
Expand Down Expand Up @@ -4066,6 +4080,7 @@ AWS_TEST_CASE(test_s3_round_trip_multipart_get_fc, s_test_s3_round_trip_multipar
static int s_test_s3_round_trip_multipart_get_fc(struct aws_allocator *allocator, void *ctx) {
return s_test_s3_round_trip_multipart_get_fc_helper(allocator, ctx, false);
}

AWS_TEST_CASE(test_s3_round_trip_multipart_get_fc_header, s_test_s3_round_trip_multipart_get_fc_header)
static int s_test_s3_round_trip_multipart_get_fc_header(struct aws_allocator *allocator, void *ctx) {
return s_test_s3_round_trip_multipart_get_fc_helper(allocator, ctx, true);
Expand Down Expand Up @@ -4166,6 +4181,7 @@ AWS_TEST_CASE(
static int s_test_s3_round_trip_mpu_multipart_get_full_object_checksum_fc(struct aws_allocator *allocator, void *ctx) {
return s_test_s3_round_trip_mpu_multipart_get_fc_helper(allocator, ctx, false, AWS_TEST_FOC_HEADER);
}

AWS_TEST_CASE(
test_s3_round_trip_mpu_multipart_get_full_object_checksum_fc_header,
s_test_s3_round_trip_mpu_multipart_get_full_object_checksum_fc_header)
Expand Down
Loading