Skip to content

Commit a10b708

Browse files
committed
Pulled the path manipulation code into it's own function to cleanup the common_request_init function. Also added a new #define for the size for the buffer that stores the string representation of the content length field
1 parent e14899e commit a10b708

File tree

1 file changed

+40
-25
lines changed

1 file changed

+40
-25
lines changed

src/ds3.c

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@
2929
//---------- Define opaque struct ----------//
3030
struct _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

606619
ds3_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

610623
ds3_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

614627
ds3_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

618631
ds3_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

622635
ds3_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

628641
ds3_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

632645
ds3_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

636649
ds3_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

643656
ds3_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+
12161231
static 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

13281343
void 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

Comments
 (0)