Skip to content

Commit 997e25c

Browse files
committed
Working on capturing the error code and error body. The status code is now reported back to the user. The error body will require reworking some of the callback handling code.
1 parent 7f90ee3 commit 997e25c

File tree

3 files changed

+78
-12
lines changed

3 files changed

+78
-12
lines changed

sample/main.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ int main (int args, char * argv[]) {
1111
uint64_t i,n;
1212

1313
ds3_creds * creds = ds3_create_creds("cnlhbg==","MrR3K4Bi");
14-
ds3_client * client = ds3_create_client("http://192.168.56.102:8080", creds);
14+
ds3_client * client = ds3_create_client("http://192.168.56.101:8080", creds);
1515

1616
ds3_client_proxy(client, "192.168.56.1:8888");
1717

@@ -20,17 +20,29 @@ int main (int args, char * argv[]) {
2020
ds3_free_request(request);
2121

2222
if(error != NULL) {
23-
printf("Got an error: %s\n", error->message);
23+
if(error->error != NULL) {
24+
printf("Got an error (%lu): %s\n", error->error->status_code, error->message);
25+
}
26+
else {
27+
printf("Got a runtime error: %s\n", error->message);
28+
}
29+
ds3_free_error(error);
30+
ds3_free_creds(creds);
31+
ds3_free_client(client);
2432
return 1;
2533
}
2634

2735
if (response == NULL) {
2836
printf("Response was null\n");
37+
ds3_free_creds(creds);
38+
ds3_free_client(client);
2939
return 1;
3040
}
3141

3242
if(response->num_buckets == NULL) {
3343
printf("Num buckets is null\n");
44+
ds3_free_creds(creds);
45+
ds3_free_client(client);
3446
return 1;
3547
}
3648

src/ds3.c

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ struct _ds3_request{
3434
GHashTable* headers;
3535
GHashTable* query_params;
3636

37+
uint64_t expected_status_code;
38+
3739
//These next few elements are only for the bulk commands
3840
ds3_bulk_object_list* object_list;
3941
};
@@ -50,6 +52,9 @@ typedef struct {
5052
size_t status_message_size;
5153
size_t header_count;
5254
GHashTable* headers;
55+
GByteArray* body; // this will only be used when getting errors
56+
57+
void* user_data;
5358
}ds3_response_data;
5459

5560
typedef struct {
@@ -69,7 +74,6 @@ static void _ds3_free_response_header(gpointer data) {
6974
g_free(header->key);
7075
g_free(header->value);
7176
g_free(data);
72-
7377
}
7478

7579
static ds3_error* _ds3_create_error(ds3_error_code code, const char * message) {
@@ -398,18 +402,30 @@ static ds3_error* _net_process_request(const ds3_client* client, const ds3_reque
398402

399403
res = curl_easy_perform(handle);
400404

405+
401406
g_free(url);
402407
g_free(date);
403408
g_free(date_header);
404409
g_free(signature);
405410
g_free(auth_header);
406-
g_free(response_data.status_message);
407411
g_hash_table_destroy(response_headers);
408412
curl_slist_free_all(headers);
409413
curl_easy_cleanup(handle);
414+
//process the response
415+
if(request->expected_status_code != response_data.status_code) {
416+
ds3_error* error = _ds3_create_error(DS3_ERROR_BAD_STATUS_CODE, "Got an unexpected status code.");
417+
error->error = g_new0(ds3_error_response, 1);
418+
error->error->status_code = response_data.status_code;
419+
error->error->status_message = g_strdup(response_data.status_message);
420+
error->error->status_message_size = strlen(error->error->status_message);
421+
422+
g_free(response_data.status_message);
423+
return error;
424+
}
425+
g_free(response_data.status_message);
410426
if(res != CURLE_OK) {
411427
char * message = g_strconcat("Request failed: ", curl_easy_strerror(res), NULL);
412-
ds3_error* error = _ds3_create_error(DS3_ERROR_FAILED_REQUEST, message);
428+
ds3_error* error = _ds3_create_error(DS3_ERROR_REQUEST_FAILED, message);
413429
g_free(message);
414430
return error;
415431
}
@@ -479,7 +495,8 @@ static struct _ds3_request* _common_request_init(void){
479495
}
480496

481497
ds3_request* ds3_init_get_service(void) {
482-
struct _ds3_request* request = _common_request_init();
498+
struct _ds3_request* request = _common_request_init();
499+
request->expected_status_code = 200;
483500
request->verb = HTTP_GET;
484501
request->path = g_new0(char, 2);
485502
request->path [0] = '/';
@@ -488,27 +505,31 @@ ds3_request* ds3_init_get_service(void) {
488505

489506
ds3_request* ds3_init_get_bucket(const char* bucket_name) {
490507
struct _ds3_request* request = _common_request_init();
508+
request->expected_status_code = 200;
491509
request->verb = HTTP_GET;
492510
request->path = g_strconcat("/", bucket_name, NULL);
493511
return (ds3_request*) request;
494512
}
495513

496514
ds3_request* ds3_init_get_object(const char* bucket_name, const char* object_name) {
497515
struct _ds3_request* request = _common_request_init();
516+
request->expected_status_code = 200;
498517
request->verb = HTTP_GET;
499518
request->path = g_strconcat("/", bucket_name, "/", object_name, NULL);
500519
return (ds3_request*) request;
501520
}
502521

503522
ds3_request* ds3_init_delete_object(const char* bucket_name, const char* object_name) {
504523
struct _ds3_request* request = _common_request_init();
524+
request->expected_status_code = 204;
505525
request->verb = HTTP_DELETE;
506526
request->path = g_strconcat("/", bucket_name, "/", object_name, NULL);
507527
return (ds3_request*) request;
508528
}
509529

510530
ds3_request* ds3_init_put_object(const char* bucket_name, const char* object_name, uint64_t length) {
511531
struct _ds3_request* request = _common_request_init();
532+
request->expected_status_code = 200;
512533
request->verb = HTTP_PUT;
513534
request->path = g_strconcat("/", bucket_name, "/", object_name, NULL);
514535
request->length = length;
@@ -517,20 +538,23 @@ ds3_request* ds3_init_put_object(const char* bucket_name, const char* object_nam
517538

518539
ds3_request* ds3_init_put_bucket(const char* bucket_name) {
519540
struct _ds3_request* request = _common_request_init();
541+
request->expected_status_code = 200;
520542
request->verb = HTTP_PUT;
521543
request->path = g_strconcat("/", bucket_name, NULL);
522544
return (ds3_request*) request;
523545
}
524546

525547
ds3_request* ds3_init_delete_bucket(const char* bucket_name) {
526548
struct _ds3_request* request = _common_request_init();
549+
request->expected_status_code = 204;
527550
request->verb = HTTP_DELETE;
528551
request->path = g_strconcat("/", bucket_name, NULL);
529552
return (ds3_request*) request;
530553
}
531554

532555
ds3_request* ds3_init_get_bulk(const char* bucket_name, ds3_bulk_object_list* object_list) {
533556
struct _ds3_request* request = _common_request_init();
557+
request->expected_status_code = 200;
534558
request->verb = HTTP_PUT;
535559
request->path = g_strconcat("/_rest_/bucket/", bucket_name, NULL);
536560
g_hash_table_insert(request->query_params, "operation", "start_bulk_get");
@@ -540,6 +564,7 @@ ds3_request* ds3_init_get_bulk(const char* bucket_name, ds3_bulk_object_list* ob
540564

541565
ds3_request* ds3_init_put_bulk(const char* bucket_name, ds3_bulk_object_list* object_list) {
542566
struct _ds3_request* request = _common_request_init();
567+
request->expected_status_code = 200;
543568
request->verb = HTTP_PUT;
544569
request->path = g_strconcat("/_rest_/bucket/", bucket_name, NULL);
545570
g_hash_table_insert(request->query_params, "operation", "start_bulk_put");
@@ -628,10 +653,16 @@ ds3_error* ds3_get_service(const ds3_client* client, const ds3_request* request,
628653
xmlDocPtr doc;
629654
xmlNodePtr root;
630655
xmlNodePtr child_node;
656+
ds3_error* error;
631657
GByteArray* xml_blob = g_byte_array_new();
632658

633-
_internal_request_dispatcher(client, request, xml_blob, load_xml_buff, NULL, NULL);
634-
659+
error = _internal_request_dispatcher(client, request, xml_blob, load_xml_buff, NULL, NULL);
660+
661+
if(error != NULL) {
662+
g_byte_array_free(xml_blob, TRUE);
663+
return error;
664+
}
665+
635666
doc = xmlParseMemory((const char*) xml_blob->data, xml_blob->len);
636667

637668
if(doc == NULL) {
@@ -1276,6 +1307,20 @@ void ds3_free_error(ds3_error* error) {
12761307
g_free(error->message);
12771308
}
12781309

1310+
if(error->error != NULL) {
1311+
ds3_error_response* error_response = error->error;
1312+
1313+
if(error_response->status_message != NULL) {
1314+
g_free(error_response->status_message);
1315+
}
1316+
1317+
if(error_response->error_body != NULL) {
1318+
g_free(error_response->error_body);
1319+
}
1320+
1321+
g_free(error_response);
1322+
}
1323+
12791324
g_free(error);
12801325
}
12811326

src/ds3.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,22 @@ typedef struct {
133133
}ds3_bulk_response;
134134

135135
typedef enum {
136-
DS3_ERROR_INVALID_XML, DS3_ERROR_CURL_HANDLE, DS3_ERROR_FAILED_REQUEST, DS3_ERROR_MISSING_ARGS
136+
DS3_ERROR_INVALID_XML, DS3_ERROR_CURL_HANDLE, DS3_ERROR_REQUEST_FAILED, DS3_ERROR_MISSING_ARGS, DS3_ERROR_BAD_STATUS_CODE
137137
}ds3_error_code;
138138

139139
typedef struct {
140-
ds3_error_code code;
141-
char* message;
142-
size_t message_size;
140+
uint64_t status_code;
141+
char* status_message;
142+
size_t status_message_size;
143+
char* error_body;
144+
size_t error_body_size;
145+
}ds3_error_response;
146+
147+
typedef struct {
148+
ds3_error_code code;
149+
char* message;
150+
size_t message_size;
151+
ds3_error_response* error;
143152
}ds3_error;
144153

145154
LIBRARY_API ds3_creds* ds3_create_creds(const char* access_id, const char* secret_key);

0 commit comments

Comments
 (0)