Skip to content

Commit 623a5fa

Browse files
author
DenverM80
committed
fix parsing of CommonPrefixes in GetBucketRequest()
1 parent b7f477e commit 623a5fa

File tree

6 files changed

+74
-8
lines changed

6 files changed

+74
-8
lines changed

src/ds3.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13235,6 +13235,7 @@ static ds3_error* _parse_top_level_ds3_list_bucket_result_response(const ds3_cli
1323513235
ds3_list_bucket_result_response* response;
1323613236
ds3_error* error = NULL;
1323713237
GPtrArray* objects_array = g_ptr_array_new();
13238+
GPtrArray* common_prefixes_array = g_ptr_array_new();
1323813239

1323913240
error = _get_request_xml_nodes(xml_blob, &doc, &root, "ListBucketResult");
1324013241
if (error != NULL) {
@@ -13246,15 +13247,11 @@ static ds3_error* _parse_top_level_ds3_list_bucket_result_response(const ds3_cli
1324613247
for (child_node = root->xmlChildrenNode; child_node != NULL; child_node = child_node->next) {
1324713248
if (element_equal(child_node, "CommonPrefixes")) {
1324813249
xmlNodePtr loop_node;
13249-
GPtrArray* common_prefixes_array = g_ptr_array_new();
1325013250
int num_nodes = 0;
1325113251
for (loop_node = child_node->xmlChildrenNode; loop_node != NULL; loop_node = loop_node->next, num_nodes++) {
1325213252
ds3_str* common_prefixes = xml_get_string(doc, loop_node);
1325313253
g_ptr_array_add(common_prefixes_array, common_prefixes);
1325413254
}
13255-
response->common_prefixes = (ds3_str**)common_prefixes_array->pdata;
13256-
response->num_common_prefixes = common_prefixes_array->len;
13257-
g_ptr_array_free(common_prefixes_array, FALSE);
1325813255
} else if (element_equal(child_node, "CreationDate")) {
1325913256
response->creation_date = xml_get_string(doc, child_node);
1326013257
} else if (element_equal(child_node, "Delimiter")) {
@@ -13290,6 +13287,10 @@ static ds3_error* _parse_top_level_ds3_list_bucket_result_response(const ds3_cli
1329013287
response->num_objects = objects_array->len;
1329113288
g_ptr_array_free(objects_array, FALSE);
1329213289

13290+
response->common_prefixes = (ds3_str**)common_prefixes_array->pdata;
13291+
response->num_common_prefixes = common_prefixes_array->len;
13292+
g_ptr_array_free(common_prefixes_array, FALSE);
13293+
1329313294
xmlFreeDoc(doc);
1329413295

1329513296
if (error == NULL) {

test/bucket_tests.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,44 @@ BOOST_AUTO_TEST_CASE( delimiter ) {
111111
free_client(client);
112112
}
113113

114+
BOOST_AUTO_TEST_CASE( common_prefixes ) {
115+
printf("-----Testing CommonPrefixes-------\n");
116+
117+
ds3_request* request;
118+
ds3_error* error;
119+
ds3_list_bucket_result_response* response;
120+
ds3_client* client = get_client();
121+
const char* bucket_name = "test_common_prefixes_bucket";
122+
ds3_bool found_resources = False;
123+
ds3_bool found_resources_2 = False;
124+
size_t common_prefix_index;
125+
126+
populate_with_multi_dir_objects(client, bucket_name);
127+
128+
request = ds3_init_get_bucket_request(bucket_name);
129+
ds3_request_set_delimiter(request, "/");
130+
ds3_request_set_prefix(request, "resources");
131+
error = ds3_get_bucket_request(client, request, &response);
132+
ds3_request_free(request);
133+
handle_error(error);
134+
135+
BOOST_CHECK_EQUAL(response->num_objects, 0);
136+
BOOST_CHECK_EQUAL(response->num_common_prefixes, 2);
137+
for(common_prefix_index = 0; common_prefix_index < response->num_common_prefixes; common_prefix_index++) {
138+
if(strcmp(response->common_prefixes[common_prefix_index]->value, "resources/") == 0) {
139+
found_resources = True;
140+
} else if (strcmp(response->common_prefixes[common_prefix_index]->value, "resources_2/") == 0) {
141+
found_resources_2 = True;
142+
}
143+
}
144+
BOOST_CHECK_EQUAL(found_resources, True);
145+
BOOST_CHECK_EQUAL(found_resources_2, True);
146+
147+
ds3_list_bucket_result_response_free(response);
148+
clear_bucket(client, bucket_name);
149+
free_client(client);
150+
}
151+
114152
BOOST_AUTO_TEST_CASE(marker) {
115153
printf("-----Testing Marker-------\n");
116154

test/resources_2/bar.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This is bar.

test/resources_2/foo.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This is foo.

test/test.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,27 @@ void populate_with_objects(const ds3_client* client, const char* bucket_name) {
200200
ds3_str_free(job_id);
201201
}
202202

203+
void populate_with_multi_dir_objects(const ds3_client* client, const char* bucket_name) {
204+
ds3_str* job_id = populate_with_object_list_return_job(client, bucket_name, multi_dirs_object_list());
205+
ds3_str_free(job_id);
206+
}
207+
203208
ds3_bulk_object_list_response* default_object_list() {
204209
const char* books[5] = {"resources/beowulf.txt", "resources/sherlock_holmes.txt", "resources/tale_of_two_cities.txt", "resources/ulysses.txt", "resources/ulysses_large.txt"};
205210
return ds3_convert_file_list(books, 5);
206211
}
207212

213+
ds3_bulk_object_list_response* multi_dirs_object_list() {
214+
const char* books[6] = {
215+
"resources/beowulf.txt",
216+
"resources/sherlock_holmes.txt",
217+
"resources/tale_of_two_cities.txt",
218+
"resources/ulysses.txt",
219+
"resources_2/foo.txt",
220+
"resources_2/bar.txt"};
221+
return ds3_convert_file_list(books, 6);
222+
}
223+
208224
ds3_request* populate_bulk_return_request(const ds3_client* client, const char* bucket_name, ds3_bulk_object_list_response* obj_list) {
209225
ds3_error* error = create_bucket_with_data_policy(client, bucket_name, ids.data_policy_id->value);
210226
ds3_error_free(error);
@@ -289,19 +305,23 @@ void populate_with_objects_from_bulk(const ds3_client* client, const char* bucke
289305
ds3_master_object_list_response_free(chunk_response);
290306
}
291307

292-
ds3_str* populate_with_objects_return_job(const ds3_client* client, const char* bucket_name) {
293-
ds3_bulk_object_list_response* bulk_object_list_response = default_object_list();
294-
ds3_request* request = populate_bulk_return_request(client, bucket_name, bulk_object_list_response);
308+
ds3_str* populate_with_object_list_return_job( const ds3_client* client,
309+
const char* bucket_name,
310+
ds3_bulk_object_list_response* object_list) {
311+
ds3_request* request = populate_bulk_return_request(client, bucket_name, object_list);
295312
ds3_master_object_list_response* master_object_list_response = populate_bulk_return_response(client, request);
296313

297314
ds3_str* job_id = ds3_str_dup(master_object_list_response->job_id);
298315
populate_with_objects_from_bulk(client, bucket_name, master_object_list_response);
299316

300-
ds3_bulk_object_list_response_free(bulk_object_list_response);
301317
ds3_master_object_list_response_free(master_object_list_response);
302318
return job_id;
303319
}
304320

321+
ds3_str* populate_with_objects_return_job(const ds3_client* client, const char* bucket_name) {
322+
return populate_with_object_list_return_job(client, bucket_name, default_object_list());
323+
}
324+
305325
bool contains_object(ds3_list_bucket_result_response* bucket_list, const char* key) {
306326
uint64_t object_index;
307327
for (object_index = 0; object_index < bucket_list->num_objects; object_index++) {

test/test.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ void teardown_after_tests();
2525
void clear_bucket(const ds3_client* client, const char* bucket_name);
2626

2727
void populate_with_objects(const ds3_client* client, const char* bucket_name);
28+
void populate_with_multi_dir_objects(const ds3_client* client, const char* bucket_name);
29+
ds3_str* populate_with_object_list_return_job( const ds3_client* client,
30+
const char* bucket_name,
31+
ds3_bulk_object_list_response* object_list);
2832
ds3_str* populate_with_objects_return_job(const ds3_client* client, const char* bucket_name);
2933
ds3_str* populate_with_empty_objects(const ds3_client* client, const char* bucket_name);
3034

@@ -41,6 +45,7 @@ void handle_error(ds3_error* error);
4145
void free_client(ds3_client* client);
4246

4347
ds3_bulk_object_list_response* default_object_list();
48+
ds3_bulk_object_list_response* multi_dirs_object_list();
4449

4550
ds3_error* create_bucket_with_data_policy(const ds3_client* client, const char* bucket_id, const char* data_policy_id);
4651

0 commit comments

Comments
 (0)