# ks3-c-sdk **Repository Path**: ks3sdk/ks3-c-sdk ## Basic Information - **Project Name**: ks3-c-sdk - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-09-13 - **Last Updated**: 2025-09-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README KS3 SDK For C/C++ 使用指南 ---------------------- ### 注意 文档中的示例代码仅供参考之用,具体使用的时候请参考 KS3 API 文档,根据自己的实际情况调节参数。 ### 1、概述 此 SDK 适用于 Linux/Windows 环境下 C/C++ 版本。基于 KS3 API 构建。 ### 2、安装 ### 2.1 下载源码 https://gitee.com/ks3sdk/ks3-c-sdk ### 2.2 安装依赖 ``` yum -y install libcurl-devel libxml2-devel openssl-devel ``` ### 2.3 安装c sdk #### 进入c sdk目录 ``` cd ks3-c-sdk-master/ks3sdk_c ``` #### 执行make命令进行编译,执行make install命令进行安装 ``` make make install ``` 安装后的库文件和头文件分别存放在ks3-c-sdk-master/lib和ks3-c-sdk-master/include文件夹中 #### 进入c命令行工具目录,并执行make命令,可编译c sdk命令行工具 ``` cd ks3-c-sdk-master/tools make ``` ### 2.4 安装 c++ sdk #### 进入c++ sdk目录 ``` cd ks3-c-sdk-master/sdk_c++ ``` #### 执行make命令进行编译 ``` make ``` 编译后得到libks3.a文件为c++ sdk的库文件 ### 3、初始化 ### 3.1 获取密钥 1. 开通 KS3 服务,https://www.ksyun.com/user/register 注册账号 2. 进入控制台, https://ks3.console.ksyun.com/console.html#/setting 获取 AccessKeyID 、AccessKeySecret ### 3.2 常用术语介绍 #### Object(对象,文件) 在 KS3 中,用户操作的基本数据单元是 Object。单个 Object 允许存储 0~48.8TB 的数据。 Object 包含 key 和 data。其中,key 是 Object 的名字;data 是 Object 的数据。key 为 UTF-8 编码,且编码后的长度不得超过 1024 个字符。 #### Key(文件名) 即 Object 的名字,key 为 UTF-8 编码,且编码后的长度不得超过 1024 个字符。Key 中可以带有斜杠,当 Key 中带有斜杠的时候,将会自动在控制台里组织成目录结构。 **其他术语请参考[概念与术语](https://docs.ksyun.com/documents/2286)** ### 4、C SDK快速入门 请先阅读 [常用概念术语文档](https://docs.ksyun.com/documents/2286) 常见示例请参考源码中 example.c 文件 ### 4.1 创建一个 bucket ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; int error; buffer* resp = NULL; resp = create_bucket(host, bucket, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.2 删除一个 bucket ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; int error; buffer* resp = NULL; resp = delete_bucket(host, bucket, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.3 列出用户所有空间 ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; int error; buffer* resp = NULL; resp = list_all_bucket(host, ak, sk, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.4 上传文件 ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* object_key = "YOUR_OBJECT_KEY"; const char* filename = "LOCAL_DISK_FILE_PATH"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; const char* headers = "x-kss-acl:public-read"; int error; buffer* resp = NULL; resp = upload_file_object(host, bucket, object_key, filename, ak, sk, NULL, headers, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.5 分块上传 #### 4.5.1 初始化分块上传 ``` const char* host = "ks3-cn-beijing.ksyuncs.com"; const char* bucket = "YOUR_BUCKET"; const char* object_key = "YOUR_OBJECT_KEY"; const char* ak = "YOUR_ACCESS_KEY"; const char* sk = "YOUR_SECRET_KEY"; const char* headers = "x-kss-acl:public-read"; int error; buffer* resp = NULL; resp = init_multipart_upload(host, bucket, object_key, ak, sk, NULL, headers, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); // 从response body中解析出uploadid: char uploadid_str[128]; char *oid_beg_ptr = strstr(resp->body, ""); if (oid_beg_ptr) { oid_beg_ptr += strlen(""); char *oid_end_ptr = strstr(oid_beg_ptr, ""); if (oid_end_ptr) { strncpy(uploadid_str, oid_beg_ptr, oid_end_ptr - oid_beg_ptr); uploadid_str[oid_end_ptr - oid_beg_ptr] = 0; } } ``` ##### 4.5.2 上传分块数据 ``` char* data_buf = "hello world"; int data_len = strlen(data_buf); int partNumber = 1; resp = upload_part(host, bucket, object_key, ak, sk, uploadid_str, partNumber, data_buf, data_len, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ##### 4.5.3 完成分块上传 ``` // 构造request body (如下是一块的例子,如果多块,则Part部分重复拼接多次) snprintf(com_xml, sizeof(com_xml), "\n" "\n" "%d\n" "\"%.*s\"" "\n", 1, 32, etag_ptr); resp = complete_multipart_upload(host, bucket, object_key, ak, sk, uploadid_str, com_xml, strlen(com_xml), NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ##### 4.5.4 列举已经上传的块 ``` resp = list_multipart_uploads(host, bucket, ak, sk, uploadid_str, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ##### 4.5.5 取消分块上传 ``` resp = abort_multipart_upload(host, bucket, object_key, ak, sk, uploadId, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code = %ld\n", resp->status_code); printf("status msg = %s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg = %s\n", resp->body); } } buffer_free(resp); ``` ### 4.6 带 header 上传文件 **注意:header 之间要以’\n’分隔** ``` const char* headers = "x-kss-acl:public-read\nx-kss-callbackurl:http://www.callbackurl.com/"; resp = upload_file_object(host, bucket, object_key, filename, ak, sk, NULL, headers, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.7 下载文件 ``` const char* to_save_file_name = "./local_save"; resp = download_file_object(host, bucket, object_key, to_save_file_name, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.8 删除文件 ``` const char* object_key = "YOUR_OBJECT_KEY"; resp = delete_object(host, bucket, object_key, ak, sk, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.9 复制文件 ``` const char* src_bucket = "SRC_BUCKET_NAME"; const char* src_object_key = "SRC_OBJECT_KEY"; const char* dst_bucket = "DST_BUCKET"; const char* dst_object_key = "DST_OBJECT_KEY"; resp = copy_object(host, src_bucket, src_object_key, dst_bucket, dst_object_key, ak, sk, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } buffer_free(resp); ``` ### 4.10 上传 buf object ``` const char* buf = "hello world"; int buf_len = strlen(buf); resp = upload_object(host, bucket, object_key, buf, buf_len, ak, sk, NULL, NULL, &error); if (error != 0) { printf("curl err=%d\n", error); } else { printf("status code=%d\n", resp->status_code); printf("status msg=%s\n", resp->status_msg); if (resp->body != NULL) { printf("error msg=%s\n", resp->body); } } free(buf); buffer_free(resp); ``` ### 5、C++ SDK快速入门 ### 5.1 上传文件 ``` #include #include "ks3.h" #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; std::string content = "some content"; const char* buf = content.c_str(); int size = static_cast(content.size() + 1); sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; int code = client.UploadObject(ctx, buf, size, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; sdk::KS3Client::DestroyGlobalCurl(); return 0; } ``` ### 5.2 下载文件 ``` #include "ks3.h" #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; // 设置下载范围 ctx.start_offset = 0; ctx.end_offset = 500; sdk::KS3Response response; int code = client.GetObject(ctx, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.content.c_str() << std::endl; sdk::KS3Client::DestroyGlobalCurl(); return 0; } ``` ### 5.3 删除文件 ``` #include "ks3.h" #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; int code = client.DeleteObject(ctx, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; sdk::KS3Client::DestroyGlobalCurl(); return 0; }获取文件元数据 #include "ks3.h" #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; int code = client.HeadObject(ctx, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; std::cout << response.content.c_str() << std::endl; sdk::KS3Client::DestroyGlobalCurl(); return 0; } ``` ### 5.4 分块上传 ``` #include "ks3.h" #include #include long read_file(const std::string &filename, char *buf, long offset, long len); long get_file_size(const std::string &filename); using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; // 初始化分块上传 std::string uploadId; int code = client.InitMultipartUpload(ctx, &response, &uploadId); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } if (response.status_code != 200) { std::cout << "[ERROR] init multipart failed status_code=" << response.status_code << ", status_ms=" << response.status_msg.c_str() << std::endl; return -1; } // 上传分片 char buffer[400 * 1024]; long file_size = get_file_size("./test.txt"); if (file_size < 0) { std::cout << "[ERROR] load content failed" << std::endl; return -1; } long offset = 0; int part_size = 400 * 1024; ctx.partNum = 1; ctx.uploadId = uploadId; std::map parts; while (offset < file_size) { long upload_size = (offset + part_size > file_size) ? file_size - offset : part_size; read_file("./test.txt", buffer, offset, upload_size); sdk::KS3Response part_resp; std::string etag; code = client.UploadPart(ctx, buffer, static_cast(upload_size), &part_resp, &etag); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } if (part_resp.status_code != 200) { std::cout << "[ERROR] upload part " << ctx.partNum << " failed status_code=" << part_resp.status_code << ", status_ms=" << part_resp.status_msg.c_str() << std::endl; sdk::KS3Response abort_resp; client.AbortMultipartUpload(ctx, &abort_resp); return -1; } parts.insert(std::pair(ctx.partNum, etag)); offset += upload_size; ctx.partNum++; } // 列举分片 sdk::KS3Response list_resp; std::map list_parts; code = client.ListParts(ctx, &list_parts, &list_resp); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << list_resp.status_code << std::endl; auto it = list_parts.begin(); for (; it != list_parts.end(); ++it) { std::cout << it->first << ":" << it->second.c_str() << std::endl; } // 合并分块 sdk::KS3Response complete_resp; code = client.CompleteMultipartUpload(ctx, parts, &complete_resp); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } if (complete_resp.status_code != 200) { std::cout << "[ERROR] complete multipart failed status_code=" << complete_resp.status_code << ", status_ms=" << complete_resp.status_msg.c_str() << std::endl; sdk::KS3Response abort_resp; // 取消此次分块上传任务 client.AbortMultipartUpload(ctx, &abort_resp); return -1; } sdk::KS3Client::DestroyGlobalCurl(); return 0; } long read_file(const std::string &filename, char *buf, long offset, long len) { std::ifstream file(filename, std::ios::binary); if (!file) { std::cerr << "[ERROR] open file=" << filename << " failed" << std::endl; return -1; } file.seekg(offset, std::ios::beg); file.read(buf, len); long rlen = file.gcount(); if (rlen != len) { std::cerr << "[ERROR] read file=" << filename << " failed: offset=" << offset << ", len=" << len << ", but read len is : " << rlen << std::endl; file.close(); return -1; } file.close(); return rlen; } long get_file_size(const std::string &filename) { std::ifstream file(filename, std::ios::binary | std::ios::ate); if (!file) { std::cerr << "[ERROR] open file=" << filename << " failed" << std::endl; return -1; } long len = file.tellg(); file.close(); return len; } ``` ### 5.5 跨区域复制 ##### 5.5.1 设置跨区域复制规则 ``` #include "ks3.h" #include #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string target_bucket = "targetBucket"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.accesskey = ak; ctx.secretkey = sk; sdk::ReplicationInfo info; info.target_bucket.assign(target_bucket); sdk::KS3Response response; int code = client.SetReplication(ctx, info, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; std::cout << response.content.c_str() << std::endl; sdk::KS3Client::DestroyGlobalCurl(); } ``` ##### 5.5.2 获取跨区域复制规则 ``` #include "ks3.h" #include #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string target_bucket = "targetBucket"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.accesskey = ak; ctx.secretkey = sk; sdk::ReplicationInfo result_info; sdk::KS3Response response; int code = client.GetReplication(ctx, &result_info, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; std::cout << response.content.c_str() << std::endl; if (response.status_code == 200) { std::cout << result_info.target_bucket.c_str() << std::endl; if (!result_info.prefixes.empty()) { for (const auto & prefix : result_info.prefixes) { std::cout << prefix.c_str() << std::endl; } } } sdk::KS3Client::DestroyGlobalCurl(); } ``` ##### 5.5.3 删除跨区域复制规则 ``` #include "ks3.h" #include #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; int code = client.DeleteReplication(ctx, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; std::cout << response.content.c_str() << std::endl; sdk::KS3Client::DestroyGlobalCurl(); } ``` ### 5.6 管理文件访问权限 ##### 5.6.1 设置文件访问权限 通过请求头设置文件访问权限 ``` #include "ks3.h" #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; int code = client.SetCannedAcl(ctx, "public-read", &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; std::cout << response.content << std::endl; sdk::KS3Client::DestroyGlobalCurl(); return 0; } ``` 通过请求体设置文件访问权限 ``` #include "ks3.h" #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; sdk::AccessControlPolicy policy; sdk::AccessControlPolicy::Grant grant; grant.grantee_type = "CanonicalUser"; grant.permission = "READ"; grant.grantee_id = "123456"; grant.grantee_display_name = "123456"; policy.access_control_list.push_back(grant); int code = client.SetAcl(ctx, policy, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; std::cout << response.content << std::endl; sdk::KS3Client::DestroyGlobalCurl(); return 0; } ``` ##### 5.6.2 获取文件访问权限 ``` #include "ks3.h" #include using namespace ks3; int main() { std::string host = "ks3-cn-beijing.ksyuncs.com"; std::string ak = "yourAccessKey"; std::string sk = "yourSecretKey"; std::string bucket = "yourBucketName"; std::string object_key = "yourKeyName"; sdk::KS3Client::InitGlobalCurl(); sdk::KS3Client client(host); client.Init(); sdk::ClientContext ctx; ctx.bucket = bucket; ctx.object_key = object_key; ctx.accesskey = ak; ctx.secretkey = sk; sdk::KS3Response response; sdk::AccessControlPolicy policy; int code = client.GetAcl(ctx, policy, &response); if (code != 0) { std::cout << "failed to call curl with error code " << code << std::endl; return -1; } std::cout << response.status_code << std::endl; std::cout << response.headers_buffer << std::endl; std::cout << response.content << std::endl; std::cout << policy.owner.id << std::endl; std::cout << policy.owner.display_name << std::endl; for (const auto& grant : policy.access_control_list) { std::cout << grant.grantee_type << std::endl; std::cout << grant.grantee_id << std::endl; std::cout << grant.grantee_display_name << std::endl; std::cout << grant.permission << std::endl; } sdk::KS3Client::DestroyGlobalCurl(); return 0; } ```