2929//---------- Define opaque struct ----------//
3030struct _ds3_request {
3131 http_verb verb ;
32- char * path ;
33- size_t path_size ;
32+ ds3_str * path ;
3433 uint64_t length ;
3534 GHashTable * headers ;
3635 GHashTable * query_params ;
@@ -377,10 +376,10 @@ static ds3_error* _net_process_request(const ds3_client* client, const ds3_reque
377376 response_data .body = g_byte_array_new ();
378377
379378 if (query_params == NULL ) {
380- url = g_strconcat (client -> endpoint -> value , request -> path , NULL );
379+ url = g_strconcat (client -> endpoint -> value , request -> path -> value , NULL );
381380 }
382381 else {
383- url = g_strconcat (client -> endpoint -> value , request -> path ,"?" ,query_params , NULL );
382+ url = g_strconcat (client -> endpoint -> value , request -> path -> value ,"?" ,query_params , NULL );
384383 g_free (query_params );
385384 }
386385 curl_easy_setopt (handle , CURLOPT_URL , url );
@@ -449,7 +448,7 @@ static ds3_error* _net_process_request(const ds3_client* client, const ds3_reque
449448
450449 date = _generate_date_string ();
451450 date_header = g_strconcat ("Date: " , date , NULL );
452- signature = _net_compute_signature (client -> creds , request -> verb , request -> path , date , "" , "" , "" );
451+ signature = _net_compute_signature (client -> creds , request -> verb , request -> path -> value , date , "" , "" , "" );
453452 headers = NULL ;
454453 auth_header = g_strconcat ("Authorization: AWS " , client -> creds -> access_id -> value , ":" , signature , NULL );
455454
@@ -577,71 +576,85 @@ void ds3_request_set_max_keys(ds3_request* _request, uint32_t max_keys) {
577576 _set_query_param (_request , "max-keys" , max_keys_s );
578577}
579578
580- static struct _ds3_request * _common_request_init (http_verb verb , const char * path_prefix , const char * bucket_name , const char * object_name ) {
579+ static struct _ds3_request * _common_request_init (http_verb verb , ds3_str * path ) {
581580 struct _ds3_request * request = g_new0 (struct _ds3_request , 1 );
582- char * escaped_bucket_name = NULL ;
583- char * escaped_object_name = NULL ;
584- char * joined_path = NULL ;
585581 request -> headers = _create_hash_table ();
586582 request -> query_params = _create_hash_table ();
587583 request -> verb = verb ;
584+ request -> path = path ;
585+ return request ;
586+ }
587+
588+ static ds3_str * _build_path (const char * path_prefix , const char * bucket_name , const char * object_name ) {
589+ ds3_str * path = NULL ;
590+ char * escaped_bucket_name = NULL ;
591+ char * escaped_object_name = NULL ;
592+ char * joined_path = NULL ;
593+ char * full_path = NULL ;
594+
588595 if (bucket_name != NULL ) {
589596 escaped_bucket_name = _escape_url (bucket_name );
590597 }
591598 if (object_name != NULL ) {
592599 escaped_object_name = _escape_url_object_name (object_name );
593600 }
601+
594602 joined_path = g_strjoin ("/" , escaped_bucket_name , escaped_object_name , NULL );
595- request -> path = g_strconcat (path_prefix , joined_path , NULL );
603+ full_path = g_strconcat (path_prefix , joined_path , NULL );
604+
605+ path = ds3_str_init (full_path );
606+
607+ g_free (full_path );
596608 g_free (joined_path );
609+
597610 if (escaped_bucket_name != NULL ) {
598611 g_free (escaped_bucket_name );
599612 }
600613 if (escaped_object_name != NULL ) {
601614 g_free (escaped_object_name );
602615 }
603- return request ;
616+ return path ;
604617}
605618
606619ds3_request * ds3_init_get_service (void ) {
607- return (ds3_request * ) _common_request_init (HTTP_GET , "/" , NULL , NULL );
620+ return (ds3_request * ) _common_request_init (HTTP_GET , _build_path ( "/" , NULL , NULL ) );
608621}
609622
610623ds3_request * ds3_init_get_bucket (const char * bucket_name ) {
611- return (ds3_request * ) _common_request_init (HTTP_GET , "/" , bucket_name , NULL );
624+ return (ds3_request * ) _common_request_init (HTTP_GET , _build_path ( "/" , bucket_name , NULL ) );
612625}
613626
614627ds3_request * ds3_init_get_object (const char * bucket_name , const char * object_name ) {
615- return (ds3_request * ) _common_request_init (HTTP_GET , "/" , bucket_name , object_name );
628+ return (ds3_request * ) _common_request_init (HTTP_GET , _build_path ( "/" , bucket_name , object_name ) );
616629}
617630
618631ds3_request * ds3_init_delete_object (const char * bucket_name , const char * object_name ) {
619- return (ds3_request * ) _common_request_init (HTTP_DELETE , "/" , bucket_name , object_name );
632+ return (ds3_request * ) _common_request_init (HTTP_DELETE , _build_path ( "/" , bucket_name , object_name ) );
620633}
621634
622635ds3_request * ds3_init_put_object (const char * bucket_name , const char * object_name , uint64_t length ) {
623- struct _ds3_request * request = _common_request_init (HTTP_PUT , "/" , bucket_name , object_name );
636+ struct _ds3_request * request = _common_request_init (HTTP_PUT , _build_path ( "/" , bucket_name , object_name ) );
624637 request -> length = length ;
625638 return (ds3_request * ) request ;
626639}
627640
628641ds3_request * ds3_init_put_bucket (const char * bucket_name ) {
629- return (ds3_request * ) _common_request_init (HTTP_PUT , "/" , bucket_name , NULL );
642+ return (ds3_request * ) _common_request_init (HTTP_PUT , _build_path ( "/" , bucket_name , NULL ) );
630643}
631644
632645ds3_request * ds3_init_delete_bucket (const char * bucket_name ) {
633- return (ds3_request * ) _common_request_init (HTTP_DELETE , "/" , bucket_name , NULL );
646+ return (ds3_request * ) _common_request_init (HTTP_DELETE , _build_path ( "/" , bucket_name , NULL ) );
634647}
635648
636649ds3_request * ds3_init_get_bulk (const char * bucket_name , ds3_bulk_object_list * object_list ) {
637- struct _ds3_request * request = _common_request_init (HTTP_PUT , "/_rest_/bucket/" , bucket_name , NULL );
650+ struct _ds3_request * request = _common_request_init (HTTP_PUT , _build_path ( "/_rest_/bucket/" , bucket_name , NULL ) );
638651 _set_query_param ((ds3_request * ) request , "operation" , "start_bulk_get" );
639652 request -> object_list = object_list ;
640653 return (ds3_request * ) request ;
641654}
642655
643656ds3_request * ds3_init_put_bulk (const char * bucket_name , ds3_bulk_object_list * object_list ) {
644- struct _ds3_request * request = _common_request_init (HTTP_PUT , "/_rest_/bucket/" , bucket_name , NULL );
657+ struct _ds3_request * request = _common_request_init (HTTP_PUT , _build_path ( "/_rest_/bucket/" , bucket_name , NULL ) );
645658 _set_query_param ((ds3_request * ) request , "operation" , "start_bulk_put" );
646659 request -> object_list = object_list ;
647660 return (ds3_request * ) request ;
@@ -1213,8 +1226,10 @@ static ds3_error* _parse_master_object_list(xmlDocPtr doc, ds3_bulk_response** _
12131226 return NULL ;
12141227}
12151228
1229+ #define LENGTH_BUFF_SIZE 21
1230+
12161231static xmlDocPtr _generate_xml_objects_list (const ds3_bulk_object_list * obj_list ) {
1217- char size_buff [21 ]; //The max size of an uint64_t should be 20 characters
1232+ char size_buff [LENGTH_BUFF_SIZE ]; //The max size of an uint64_t should be 20 characters
12181233 xmlDocPtr doc ;
12191234 ds3_bulk_object obj ;
12201235 xmlNodePtr objects_node , object_node ;
@@ -1226,10 +1241,10 @@ static xmlDocPtr _generate_xml_objects_list(const ds3_bulk_object_list* obj_list
12261241
12271242 for (i = 0 ; i < obj_list -> size ; i ++ ) {
12281243 memset (& obj , 0 , sizeof (ds3_bulk_object ));
1229- memset (size_buff , 0 , sizeof (char ) * 21 );
1244+ memset (size_buff , 0 , sizeof (char ) * LENGTH_BUFF_SIZE );
12301245
12311246 obj = obj_list -> list [i ];
1232- g_snprintf (size_buff , sizeof (char ) * 21 , "%llu" , obj .length );
1247+ g_snprintf (size_buff , sizeof (char ) * LENGTH_BUFF_SIZE , "%llu" , obj .length );
12331248
12341249 object_node = xmlNewNode (NULL , (xmlChar * ) "Object" );
12351250 xmlAddChild (objects_node , object_node );
@@ -1322,7 +1337,7 @@ void ds3_print_request(const ds3_request* _request) {
13221337 }
13231338 request = (struct _ds3_request * )_request ;
13241339 printf ("Verb: %s\n" , _net_get_verb (request -> verb ));
1325- printf ("Path: %s\n" , request -> path );
1340+ printf ("Path: %s\n" , request -> path -> value );
13261341}
13271342
13281343void ds3_free_bucket_response (ds3_get_bucket_response * response ){
@@ -1468,7 +1483,7 @@ void ds3_free_request(ds3_request* _request) {
14681483 }
14691484 request = (struct _ds3_request * ) _request ;
14701485 if (request -> path != NULL ) {
1471- g_free (request -> path );
1486+ ds3_str_free (request -> path );
14721487 }
14731488 if (request -> headers != NULL ) {
14741489 g_hash_table_destroy (request -> headers );
0 commit comments