Skip to content

Commit 6ef532e

Browse files
committed
Fixes to allow bulk put requests with only empty folder objects.
Assume any 2xx status code is expected. Some requests, like bulk put, can return either 200 or 204 responses depending on the request. This change lets us tolerate that. In the future, we might want to have a way to specify multiple expected status codes. Fix ds3_bulk to tolerate responses with no body, which is the case when a user is bulk putting only empty folder objects (which results in a 204 response since there's nothing else for the user to do).
1 parent 90f1caa commit 6ef532e

File tree

1 file changed

+4
-17
lines changed

1 file changed

+4
-17
lines changed

src/ds3.c

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ struct _ds3_request{
3535
GHashTable* headers;
3636
GHashTable* query_params;
3737

38-
uint64_t expected_status_code;
39-
4038
//These next few elements are only for the bulk commands
4139
ds3_bulk_object_list* object_list;
4240
};
@@ -461,8 +459,7 @@ static ds3_error* _net_process_request(const ds3_client* client, const ds3_reque
461459
return error;
462460
}
463461

464-
fprintf(stderr, "Got status code of (%llu) expected (%llu)\n", response_data.status_code, request->expected_status_code);
465-
if(request->expected_status_code != response_data.status_code) {
462+
if(response_data.status_code < 200 || response_data.status_code >= 300) {
466463
ds3_error* error = _ds3_create_error(DS3_ERROR_BAD_STATUS_CODE, "Got an unexpected status code.");
467464
error->error = g_new0(ds3_error_response, 1);
468465
error->error->status_code = response_data.status_code;
@@ -567,7 +564,6 @@ static struct _ds3_request* _common_request_init(void){
567564

568565
ds3_request* ds3_init_get_service(void) {
569566
struct _ds3_request* request = _common_request_init();
570-
request->expected_status_code = 200;
571567
request->verb = HTTP_GET;
572568
request->path = g_new0(char, 2);
573569
request->path [0] = '/';
@@ -576,31 +572,27 @@ ds3_request* ds3_init_get_service(void) {
576572

577573
ds3_request* ds3_init_get_bucket(const char* bucket_name) {
578574
struct _ds3_request* request = _common_request_init();
579-
request->expected_status_code = 200;
580575
request->verb = HTTP_GET;
581576
request->path = g_strconcat("/", bucket_name, NULL);
582577
return (ds3_request*) request;
583578
}
584579

585580
ds3_request* ds3_init_get_object(const char* bucket_name, const char* object_name) {
586581
struct _ds3_request* request = _common_request_init();
587-
request->expected_status_code = 200;
588582
request->verb = HTTP_GET;
589583
request->path = g_strconcat("/", bucket_name, "/", object_name, NULL);
590584
return (ds3_request*) request;
591585
}
592586

593587
ds3_request* ds3_init_delete_object(const char* bucket_name, const char* object_name) {
594588
struct _ds3_request* request = _common_request_init();
595-
request->expected_status_code = 204;
596589
request->verb = HTTP_DELETE;
597590
request->path = g_strconcat("/", bucket_name, "/", object_name, NULL);
598591
return (ds3_request*) request;
599592
}
600593

601594
ds3_request* ds3_init_put_object(const char* bucket_name, const char* object_name, uint64_t length) {
602595
struct _ds3_request* request = _common_request_init();
603-
request->expected_status_code = 200;
604596
request->verb = HTTP_PUT;
605597
request->path = g_strconcat("/", bucket_name, "/", object_name, NULL);
606598
request->length = length;
@@ -609,23 +601,20 @@ ds3_request* ds3_init_put_object(const char* bucket_name, const char* object_nam
609601

610602
ds3_request* ds3_init_put_bucket(const char* bucket_name) {
611603
struct _ds3_request* request = _common_request_init();
612-
request->expected_status_code = 200;
613604
request->verb = HTTP_PUT;
614605
request->path = g_strconcat("/", bucket_name, NULL);
615606
return (ds3_request*) request;
616607
}
617608

618609
ds3_request* ds3_init_delete_bucket(const char* bucket_name) {
619610
struct _ds3_request* request = _common_request_init();
620-
request->expected_status_code = 204;
621611
request->verb = HTTP_DELETE;
622612
request->path = g_strconcat("/", bucket_name, NULL);
623613
return (ds3_request*) request;
624614
}
625615

626616
ds3_request* ds3_init_get_bulk(const char* bucket_name, ds3_bulk_object_list* object_list) {
627617
struct _ds3_request* request = _common_request_init();
628-
request->expected_status_code = 200;
629618
request->verb = HTTP_PUT;
630619
request->path = g_strconcat("/_rest_/bucket/", bucket_name, NULL);
631620
_set_query_param((ds3_request*) request, "operation", "start_bulk_get");
@@ -635,7 +624,6 @@ ds3_request* ds3_init_get_bulk(const char* bucket_name, ds3_bulk_object_list* ob
635624

636625
ds3_request* ds3_init_put_bulk(const char* bucket_name, ds3_bulk_object_list* object_list) {
637626
struct _ds3_request* request = _common_request_init();
638-
request->expected_status_code = 200;
639627
request->verb = HTTP_PUT;
640628
request->path = g_strconcat("/_rest_/bucket/", bucket_name, NULL);
641629
_set_query_param((ds3_request*) request, "operation", "start_bulk_put");
@@ -1291,11 +1279,10 @@ ds3_error* ds3_bulk(const ds3_client* client, const ds3_request* _request, ds3_b
12911279
// Start processing the data that was received back.
12921280
doc = xmlParseMemory((const char*) xml_blob->data, xml_blob->len);
12931281
if(doc == NULL) {
1294-
char* message = g_strconcat("Failed to parse response document. The actual response is: ", xml_blob->data, NULL);
1282+
// Bulk put with just empty folder objects will return a 204 and thus
1283+
// not have a body.
12951284
g_byte_array_free(xml_blob, TRUE);
1296-
ds3_error* error = _ds3_create_error(DS3_ERROR_INVALID_XML, message);
1297-
g_free(message);
1298-
return error;
1285+
return NULL;
12991286
}
13001287

13011288
error_response = _parse_master_object_list(doc, response);

0 commit comments

Comments
 (0)