删除对象(C SDK)
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。
功能说明
为节省空间和成本,您可以根据需要删除指定桶中的单个对象。
接口约束
- 您必须是桶拥有者或拥有删除对象的权限,才能删除对象。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:object:DeleteObject权限,如果使用桶策略则需授予DeleteObject权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略、配置对象策略。
- OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。
- 桶没有开启多版本控制功能时,已删除的对象不可恢复,请谨慎操作。
方法定义
1 2 |
void delete_object(const obs_options *options, obs_object_info *object_info, obs_response_handler *handler, void *callback_data); |
请求参数说明
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
options |
const obs_options* |
必选 |
参数解释: 请求桶的上下文,配置option(C SDK),通过obs_options设置AK、SK、endpoint、bucket、超时时间、临时鉴权。 约束限制: 无 |
object_info |
必选 |
参数解释: 对象名和版本号。 约束限制: 非多版本对象,version设置为0。 |
|
handler |
必选 |
参数解释: 回调结构体,结构体内所有成员都是回调函数的指针,用于设置处理接口响应数据的回调函数。您可以通过设置回调函数,把服务端的响应数据复制到您的自定义回调数据callback_data中。 约束限制: 无 |
|
callback_data |
void * |
可选 |
参数解释: 用户自定义回调数据。 约束限制: 无 取值范围: 无 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
bucket_options |
必选 |
参数解释: 桶相关设置。 约束限制: 无 |
|
request_options |
必选 |
参数解释: 请求相关设置。 约束限制: 无 |
|
temp_auth |
可选 |
参数解释: 用于临时计算签名的结构体,不使用时请设置为NULL。 约束限制: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
host_name |
char * |
必选 |
参数解释: 连接OBS的服务地址,请求使用的主机名,是指存放资源的服务器的域名,就是终端节点endpoint。 示例:host_name = "obs.cn-north-4.myhuaweicloud.com"; 约束限制: 不需要带“http://”或“https://”前缀,通过obs_protocol控制是使用http协议还是https协议。 取值范围: 您可以从这里查看OBS当前开通的服务地址。 默认取值: 无 |
bucket_name |
char * |
必选 |
参数解释: 桶名。 约束限制:
取值范围: 无 默认取值: 无 |
useCname |
bool |
可选 |
参数解释: 是否通过自定义域名访问OBS服务。 约束限制: 无 取值范围: true:通过自定义域名访问OBS服务。 false:不通过自定义域名访问OBS服务。 默认取值: false |
protocol |
可选 |
参数解释: 是使用http协议还是https协议。 约束限制: 无 取值范围: 请详见obs_protocol。 默认取值: OBS_PROTOCOL_HTTPS(默认使用https协议) |
|
access_key |
char * |
必选 |
参数解释: 访问密钥中的AK。 约束限制: 无 取值范围: 请详见创建访问密钥。 默认取值: 无 |
secret_access_key |
char * |
必选 |
参数解释: 访问密钥中的SK。 约束限制: 无 取值范围: 请详见创建访问密钥。 默认取值: 无 |
storage_class |
可选 |
参数解释: 创桶时可指定的桶的存储类别。 约束限制: 无 取值范围: 默认取值: OBS_STORAGE_CLASS_STANDARD(指标准存储类别) |
|
token |
char * |
可选 |
参数解释: 临时访问密钥中的SecurityToken。 约束限制: 无 取值范围: 请详见创建访问密钥。 默认取值: 无 |
epid |
char * |
可选 |
参数解释: 创桶时可指定的企业项目ID,开通企业项目的用户可以从企业项目服务获取。 约束限制: epid格式为uuid,未开通企业项目的用户可以不带该头域。 示例:9892d768-2d13-450f-aac7-ed0e44c2585f 默认取值: 无 |
bucket_type |
可选 |
参数解释: 创桶时,指定是对象桶还是并行文件系统。 约束限制: 无 取值范围: 请详见obs_bucket_type。 默认取值: OBS_BUCKET_OBJECT(指对象桶) |
|
bucket_list_type |
可选 |
参数解释: 列举桶时,确定列举桶的类型:所有桶、对象桶、并行文件系统。 约束限制: 无 取值范围: |
枚举值 |
说明 |
---|---|
OBS_STORAGE_CLASS_STANDARD |
标准存储。 标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1MB),且需要频繁访问数据的业务场景。 |
OBS_STORAGE_CLASS_STANDARD_IA |
低频访问存储。 低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。 |
OBS_STORAGE_CLASS_GLACIER |
归档存储。 归档存储适用于很少访问(平均一年访问一次)数据的业务场景。 |
OBS_STORAGE_CLASS_DEEP_ARCHIVE |
深度归档存储(受限公测) 适用于长期不访问(平均几年访问一次)数据的业务场景。 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
connect_time |
int |
必选 |
参数解释: 建立HTTP/HTTPS连接的超时时间(单位:毫秒)。 约束限制: 无 取值范围: [10000, 60000] 默认取值: 60000 |
max_connected_time |
int |
必选 |
参数解释: 请求超时时间(单位:秒)。 约束限制: 无 取值范围: 无 默认取值: 0(指永远不会主动断开链接) |
proxy_auth |
char* |
可选 |
参数解释: 代理认证信息,格式为username:password。 约束限制: 无 取值范围: 无 默认取值: 无 |
proxy_host |
char* |
可选 |
参数解释: 代理服务器的IP地址或主机名。 约束限制: 无 取值范围: 无 默认取值: 无 |
枚举值 |
说明 |
---|---|
OBS_BUCKET_LIST_ALL |
列举所有桶。 |
OBS_BUCKET_LIST_OBJECT |
列举所有对象桶。 |
OBS_BUCKET_LIST_PFS |
列举所有并行文件系统。 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
expires |
long long int |
必选 |
参数解释: 临时鉴权的有效期(单位:秒)。 约束限制: 无 取值范围: [0-630720000] 默认取值: 无 |
temp_auth_callback |
void(*temp_auth_callback)(char *temp_auth_url, uint64_t temp_auth_url_len, char*temp_auth_headers, uint64_t temp_auth_headers_len, void*callback_data) |
必选 |
参数解释: 用户自定义回调函数指针,用于将临时url以及涉及的计算签名头域记录到用户自定义回调数据中。 约束限制: 无 |
callback_data |
void * |
必选 |
参数解释: 用户自定义回调数据。 约束限制: 无 取值范围: 无 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
temp_auth_url |
char * |
必选 |
参数解释: 临时鉴权的URL。OBS服务支持用户构造一个特定操作的URL,这个URL的Query参数中会包含用户AK、签名、有效期等信息,任何拿到这个URL的人均可执行临时鉴权操作,OBS服务收到这个请求后认为该请求就是签发URL用户自己在执行操作。例如构造一个携带签名信息的下载对象的URL,拿到相应URL的人都能下载这个对象,但该URL只在Expires指定的失效时间内有效。 约束限制: 无 取值范围: 无 默认取值: 无 |
temp_auth_url_len |
uint64_t |
必选 |
参数解释: 临时鉴权的URL的长度。 约束限制: 无 取值范围: 无 默认取值: 无 |
temp_auth_headers |
char * |
必选 |
参数解释: 临时鉴权的headers。 约束限制: 无 取值范围: 无 默认取值: 无 |
temp_auth_headers_len |
uint64_t |
必选 |
参数解释: 临时鉴权的headers的数量。 约束限制: 无 取值范围: 无 默认取值: 无 |
callback_data |
void * |
必选 |
参数解释: 用户自定义回调数据。 约束限制: 无 取值范围: 无 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
properties_callback |
必选 |
参数解释: 响应回调函数指针,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中。 约束限制: 无 |
|
complete_callback |
必选 |
参数解释: 结束回调函数指针,可以在这个回调中把obs_status和obs_error_details的内容记录到callback_data(用户自定义回调数据)中。 约束限制: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
properties |
const obs_response_properties* |
必选 |
参数解释: 响应头域中的参数,建议将其内容记录到callback_data(用户自定义回调数据)中。 约束限制: 无 |
callback_data |
void * |
必选 |
参数解释: 用户自定义回调数据指针。 约束限制: 无 取值范围: 无 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
status |
必选 |
参数解释: SDK内部的请求状态码。 约束限制: 无 取值范围: 请详见obs_status。 |
|
error_details |
const obs_error_details* |
必选 |
参数解释: 响应回调函数指针,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中。 约束限制: 无 |
callback_data |
void * |
必选 |
参数解释: 用户自定义回调数据指针。 约束限制: 无 取值范围: 无 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
request_id |
const char * |
可选 |
参数解释: 由OBS创建来唯一确定本次请求的值,可以通过该值来定位问题。 约束限制: 无 取值范围: 无 默认取值: 无 |
request_id2 |
const char * |
可选 |
参数解释: 帮助定位问题的特殊符号。 约束限制: 无 取值范围: 无 默认取值: 无 |
content_type |
const char * |
可选 |
参数解释: 对象的文件类型(MIME类型)。Content-Type(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式。 约束限制: 无 取值范围: 无 默认取值: 无 |
content_length |
uint64_t |
可选 |
参数解释: 响应消息体的字节长度。 约束限制: 无 取值范围: 无 默认取值: 无 |
server |
const char * |
可选 |
参数解释: HTTP请求中的Server头域。 约束限制: 无 取值范围: 无 默认取值: 无 |
etag |
const char * |
可选 |
参数解释: 对象的base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或复制操作创建的对象,都有唯一的ETag。 约束限制: 当对象是服务端加密的对象时,ETag值不是对象的MD5值。 取值范围: 长度为32的字符串。 默认取值: 无 |
expiration |
const char * |
可选 |
参数解释: 对象的详细过期信息。 约束限制: 无 取值范围: 大于0的整型数,单位:天。 默认取值: 无 |
website_redirect_location |
const char * |
可选 |
参数解释: 当桶设置了Website配置,就可以设置对象元数据的这个属性,Website接入点返回301重定向响应,将获取这个对象的请求重定向到该属性指定的桶内另一个对象或一个外部的URL,该参数指明对象的重定向地址。 例如,重定向请求到桶内另一对象: x-obs-website-redirect-location:/anotherPage.html 或重定向请求到一个外部URL: x-obs-website-redirect-location:http://www.example.com/ OBS将这个值从头域中取出,保存在对象的元数据“WebsiteRedirectLocation”中。 约束限制:
取值范围: 无 默认取值: 无 |
version_id |
const char * |
可选 |
参数解释: 对象的版本号。 约束限制: 如果该对象无版本号,则为NULL。 取值范围: 长度为32的字符串。 默认取值: 无 |
meta_data_count |
int |
可选 |
参数解释: meta_data数组中的元素个数。 约束限制: 无 取值范围: 无 默认取值: 无 |
meta_data |
const obs_name_value * |
可选 |
参数解释: 对象的自定义元数据。OBS支持用户使用以“x-obs-meta-”开头的消息头来加入自定义的元数据,以便对对象进行自定义管理。当用户获取此对象或查询此对象元数据时,加入的自定义元数据将会在返回的消息头中出现。 约束限制: 无 |
use_server_side_encryption |
char |
可选 |
参数解释: 如果开启了服务端加密,会被置为'\1'。 约束限制: 无 取值范围: 无 默认取值: 无 |
allow_origin |
const char * |
可选 |
参数解释: 当桶设置了CORS配置,如果请求中的Origin满足服务端的CORS配置,则在响应中包含这个Origin。 约束限制: 无 取值范围: 符合CORS协议的取值范围。 默认取值: 无 |
allow_headers |
const char * |
可选 |
参数解释: 当桶设置了CORS配置,如果请求的headers满足服务端的CORS配置,则在响应中包含这个headers。 约束限制: 最多可填写一个“*”通配符,不支持&、:、<、空格以及中文字符。 取值范围: 符合CORS协议的取值范围。 默认取值: 无 |
max_age |
const char * |
可选 |
参数解释: 桶CORS规则中的MaxAgeSeconds。MaxAgeSeconds指请求来源的客户端可以对跨域请求返回结果的缓存时间。 约束限制: 每个CORSRule可以包含至多一个MaxAgeSeconds。 取值范围: 大于等于0的整型数,单位:秒。 默认取值: 3000 |
allow_methods |
const char * |
可选 |
参数解释: 当桶设置了CORS配置,如果请求的Access-Control-Request-Method满足服务端的CORS配置,则在响应中包含这条rule中的Methods。 约束限制: 无 取值范围:
取值范围: 无 |
expose_headers |
const char * |
可选 |
参数解释: 桶CORS规则中的ExposeHeader。ExposeHeader是指CORS规则允许响应中可返回的附加头域,给客户端提供额外的信息。默认情况下浏览器只能访问以下头域:Content-Length、Content-Type,如果需要访问其他头域,需要在附加头域中配置。 约束限制: 不支持*、&、:、<、空格以及中文字符。 取值范围: 无 默认取值: 无 |
storage_class |
const char * |
可选 |
参数解释: 对象的存储类别。 约束限制: 仅当对象为非标准存储类别时,会返回此头域。 取值范围:
默认取值: 无 |
server_side_encryption |
const char * |
可选 |
参数解释: 该头域表示服务端的加密方式。 示例:x-obs-server-side-encryption:kms 约束限制: 如果服务端加密是SSE-KMS方式,响应包含该头域。 取值范围:
默认取值: 无 |
kms_key_id |
const char * |
可选 |
参数描述: 密钥ID。当加密方式为SSE-KMS且使用指定密钥加密时,需输入密钥ID。 约束限制: 当您设置了server_side_encryption且赋值为“kms”,即选择kms加密方式时,才能使用该头域指定加密密钥。 取值范围: 无 默认取值: 当您选择使用kms加密方式,但未设置此头域时,默认的主密钥将会被使用。如果默认主密钥不存在,系统将默认创建并使用。 |
customer_algorithm |
const char * |
可选 |
参数解释: 如果服务端加密是SSE-C方式,响应包含该头域,该头域表示解密使用的算法。 约束限制: 无 取值范围: AES256(指AES256解密算法) 默认取值: 无 |
customer_key_md5 |
const char * |
可选 |
参数解释: 如果服务端加密是SSE-C方式,响应包含该头域,该头域表示解密使用的密钥的MD5值。 约束限制: 由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ==。 取值范围: 密钥ID MD5的base64值。 默认取值: 无 |
bucket_location |
const char * |
可选 |
参数解释: 桶的区域位置信息。 约束限制: 无 取值范围: 无 默认取值: 无 |
obs_version |
const char * |
可选 |
参数解释: 桶所在的OBS服务版本号。 约束限制: 无 取值范围:
默认取值: 无 |
restore |
const char * |
可选 |
参数解释: 标识对象的恢复状态。 示例:正在恢复ongoing-request="true";已恢复 ongoing-request="false", expiry-date="Wed, 7 Nov 2012 00:00:00 GMT"。其中expiry-date表示对象恢复后的失效时间。 约束限制: 仅当对象为归档或深度归档存储类别,并且处于正在恢复或已经恢复时,会返回此头域。 取值范围: 无 默认取值: 无 |
obs_object_type |
const char * |
可选 |
参数解释: 对象的类型。 约束限制: 仅当对象为非Normal对象时,会返回此头域。 取值范围: Appendable 默认取值: 无 |
obs_next_append_position |
const char * |
可选 |
参数解释: 指明下一次请求应该提供的position。 约束限制: 仅当对象为Appendable对象时,会返回此头域。 取值范围: 无 默认取值: 无 |
obs_head_epid |
const char * |
可选 |
参数解释: 当前桶的企业项目ID,开通企业项目的用户可以从企业项目服务获取。 约束限制: 格式为uuid,未开通企业项目的用户可以不带该头域。 取值范围: 无 默认取值: 无 |
reserved_indicator |
const char * |
可选 |
参数解释: 帮助定位问题的特殊符号。 约束限制: 无 取值范围: 无 默认取值: 无 |
参数名称 |
参数类型 |
描述 |
---|---|---|
message |
const char* |
参数解释: 错误响应消息体XML中具体错误更全面、详细的英文解释。 约束限制: 无 取值范围: 取值范围可参见错误码。 默认取值: 无 |
resource |
const char* |
参数解释: 该错误相关的桶或对象资源。 约束限制: 无 取值范围: 无 默认取值: 无 |
further_details |
const char* |
参数解释: 错误响应消息体XML中的FurtherDetails元素的值。 约束限制: 无 取值范围: 无 默认取值: 无 |
extra_details_count |
int |
参数解释: 错误响应消息体XML中的其他元素的数量。 约束限制: 无 取值范围: 无 默认取值: 无 |
extra_details |
参数解释: 错误响应消息体XML中的其他元素的值。 约束限制: 无 |
|
error_headers_count |
int |
参数解释: error_headers的头域数量。 约束限制: 无 取值范围: 无 默认取值: 无 |
error_headers |
char** |
参数解释: 响应头域中包含error的所有头域。 约束限制: 无 取值范围: 无 默认取值: 无 |
参数名称 |
参数类型 |
是否必选 |
描述 |
---|---|---|---|
name |
char * |
可选 |
参数解释: 属性的键。 约束限制: 无 取值范围: 无 默认取值: 无 |
value |
char * |
可选 |
参数解释: 属性的值。 约束限制: 无 取值范围: 无 默认取值: 无 |
枚举值 |
说明 |
---|---|
OBS_STATUS_OK |
请求成功。 |
OBS_STATUS_InitCurlFailed |
初始化curl失败。 |
OBS_STATUS_InternalError |
内部错误。 |
OBS_STATUS_OutOfMemory |
本地环境内存不足。 |
OBS_STATUS_FailedToIInitializeRequest |
初始化请求失败。 |
OBS_STATUS_ConnectionFailed |
网络连接失败。 |
OBS_STATUS_XmlParseFailure |
xml解析失败。 |
OBS_STATUS_NameLookupError |
域名解析失败。 |
OBS_STATUS_FailedToConnect |
无法连接到服务端。 |
OBS_STATUS_PartialFile |
网络传输。 |
OBS_STATUS_InvalidParameter |
参数非法。 |
OBS_STATUS_NoToken |
当前并发数已经超过最大并发数(默认值1000),通过set_online_request_max_count函数去调整最大并发数。 |
OBS_STATUS_OpenFileFailed |
打开文件失败。 |
OBS_STATUS_AccessDenied |
请求被拒绝。 |
OBS_STATUS_MalformedPolicy |
请求policy格式不正确。 |
OBS_STATUS_MalformedXML |
请求xml格式不正确。 |
OBS_STATUS_MethodNotAllowed |
请求方法不允许。 |
OBS_STATUS_SignatureDoesNotMatch |
签名不匹配,检查ak、sk、token是否对应或有误。 |
OBS_STATUS_ServiceUnavailable |
服务端异常。 |
OBS_STATUS_SlowDown |
请求频率过快。 |
代码示例:删除对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
#include "eSDKOBS.h" #include <stdio.h> #include <sys/stat.h> // 响应回调函数,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中 obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data); void response_complete_callback(obs_status status, const obs_error_details *error, void *callback_data); int main() { // 以下示例展示如何通过delete_object删除单个对象: // 在程序入口调用obs_initialize方法来初始化网络、内存等全局资源。 obs_initialize(OBS_INIT_ALL); obs_options options; // 创建并初始化options,该参数包括访问域名(host_name)、访问密钥(access_key_id和acces_key_secret)、桶名(bucket_name)、桶存储类别(storage_class)等配置信息 init_obs_options(&options); // host_name填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 options.bucket_options.host_name = "obs.cn-north-4.myhuaweicloud.com"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY。 options.bucket_options.access_key = getenv("ACCESS_KEY_ID"); options.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY"); // 填写Bucket名称,例如example-bucket-name。 char * bucketName = "example-bucket-name"; options.bucket_options.bucket_name = bucketName; // 要删除的对象信息 obs_object_info object_info; memset(&object_info, 0, sizeof(obs_object_info)); object_info.key = "example_get_file_test_delete"; object_info.version_id = NULL; // 设置响应回调函数 obs_response_handler response_handler = { &response_properties_callback, &response_complete_callback }; obs_status ret_status = OBS_STATUS_BUTT; // 删除对象 delete_object(&options, &object_info, &response_handler, &ret_status); if (OBS_STATUS_OK == ret_status) { printf("delete object successfully. \n"); } else { printf("delete object failed(%s).\n", obs_get_status_name(ret_status)); } // 释放分配的全局资源 obs_deinitialize(); } // 响应回调函数,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中 obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data) { if (properties == NULL) { printf("error! obs_response_properties is null!"); if (callback_data != NULL) { obs_sever_callback_data *data = (obs_sever_callback_data *)callback_data; printf("server_callback buf is %s, len is %llu", data->buffer, data->buffer_len); return OBS_STATUS_OK; } else { printf("error! obs_sever_callback_data is null!"); return OBS_STATUS_OK; } } // 打印响应信息 #define print_nonnull(name, field) \ do { \ if (properties-> field) { \ printf("%s: %s\n", name, properties->field); \ } \ } while (0) print_nonnull("request_id", request_id); print_nonnull("request_id2", request_id2); print_nonnull("content_type", content_type); if (properties->content_length) { printf("content_length: %llu\n", properties->content_length); } print_nonnull("server", server); print_nonnull("ETag", etag); print_nonnull("expiration", expiration); print_nonnull("website_redirect_location", website_redirect_location); print_nonnull("version_id", version_id); print_nonnull("allow_origin", allow_origin); print_nonnull("allow_headers", allow_headers); print_nonnull("max_age", max_age); print_nonnull("allow_methods", allow_methods); print_nonnull("expose_headers", expose_headers); print_nonnull("storage_class", storage_class); print_nonnull("server_side_encryption", server_side_encryption); print_nonnull("kms_key_id", kms_key_id); print_nonnull("customer_algorithm", customer_algorithm); print_nonnull("customer_key_md5", customer_key_md5); print_nonnull("bucket_location", bucket_location); print_nonnull("obs_version", obs_version); print_nonnull("restore", restore); print_nonnull("obs_object_type", obs_object_type); print_nonnull("obs_next_append_position", obs_next_append_position); print_nonnull("obs_head_epid", obs_head_epid); print_nonnull("reserved_indicator", reserved_indicator); int i; for (i = 0; i < properties->meta_data_count; i++) { printf("x-obs-meta-%s: %s\n", properties->meta_data[i].name, properties->meta_data[i].value); } return OBS_STATUS_OK; } void print_error_details(const obs_error_details *error) { if (error && error->message) { printf("Error Message: \n %s\n", error->message); } if (error && error->resource) { printf("Error Resource: \n %s\n", error->resource); } if (error && error->further_details) { printf("Error further_details: \n %s\n", error->further_details); } if (error && error->extra_details_count) { int i; for (i = 0; i < error->extra_details_count; i++) { printf("Error Extra Detail(%d):\n %s:%s\n", i, error->extra_details[i].name, error->extra_details[i].value); } } if (error && error->error_headers_count) { int i; for (i = 0; i < error->error_headers_count; i++) { const char *errorHeader = error->error_headers[i]; printf("Error Headers(%d):\n %s\n", i, errorHeader == NULL ? "NULL Header" : errorHeader); } } } void response_complete_callback(obs_status status, const obs_error_details *error, void *callback_data) { if (callback_data) { obs_status *ret_status = (obs_status *)callback_data; *ret_status = status; } else { printf("Callback_data is NULL"); } print_error_details(error); } |