@@ -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
5560typedef 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
7579static 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
481497ds3_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
489506ds3_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
496514ds3_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
503522ds3_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
510530ds3_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
518539ds3_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
525547ds3_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
532555ds3_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
541565ds3_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
0 commit comments