407 lines
13 KiB
C
407 lines
13 KiB
C
|
|
#include "aos_log.h"
|
||
|
|
#include "aos_define.h"
|
||
|
|
#include "aos_util.h"
|
||
|
|
#include "aos_string.h"
|
||
|
|
#include "aos_status.h"
|
||
|
|
#include "oss_auth.h"
|
||
|
|
#include "oss_util.h"
|
||
|
|
#include "oss_xml.h"
|
||
|
|
#include "oss_api.h"
|
||
|
|
|
||
|
|
aos_status_t *oss_create_bucket(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
oss_acl_e oss_acl,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
const char *oss_acl_str = NULL;
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 0);
|
||
|
|
|
||
|
|
//init headers
|
||
|
|
headers = aos_table_create_if_null(options, headers, 1);
|
||
|
|
oss_acl_str = get_oss_acl_str(oss_acl);
|
||
|
|
if (oss_acl_str) {
|
||
|
|
apr_table_set(headers, OSS_CANNONICALIZED_HEADER_ACL, oss_acl_str);
|
||
|
|
}
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_PUT, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_delete_bucket(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
|
||
|
|
headers = aos_table_create_if_null(options, headers, 0);
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 0);
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_DELETE, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_put_bucket_acl(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
oss_acl_e oss_acl,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
const char *oss_acl_str = NULL;
|
||
|
|
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 1);
|
||
|
|
apr_table_add(query_params, OSS_ACL, "");
|
||
|
|
|
||
|
|
headers = aos_table_create_if_null(options, headers, 1);
|
||
|
|
oss_acl_str = get_oss_acl_str(oss_acl);
|
||
|
|
if (oss_acl_str) {
|
||
|
|
apr_table_set(headers, OSS_CANNONICALIZED_HEADER_ACL, oss_acl_str);
|
||
|
|
}
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_PUT, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_get_bucket_acl(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
aos_string_t *oss_acl,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
int res;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 1);
|
||
|
|
apr_table_add(query_params, OSS_ACL, "");
|
||
|
|
|
||
|
|
headers = aos_table_create_if_null(options, headers, 0);
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_GET, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
if (!aos_status_is_ok(s)) {
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
res = oss_acl_parse_from_body(options->pool, &resp->body, oss_acl);
|
||
|
|
if (res != AOSE_OK) {
|
||
|
|
aos_xml_error_status_set(s, res);
|
||
|
|
}
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_list_object(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
oss_list_object_params_t *params,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
int res;
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
|
||
|
|
//init query_params
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 4);
|
||
|
|
apr_table_add(query_params, OSS_PREFIX, params->prefix.data);
|
||
|
|
apr_table_add(query_params, OSS_DELIMITER, params->delimiter.data);
|
||
|
|
apr_table_add(query_params, OSS_MARKER, params->marker.data);
|
||
|
|
aos_table_add_int(query_params, OSS_MAX_KEYS, params->max_ret);
|
||
|
|
|
||
|
|
//init headers
|
||
|
|
headers = aos_table_create_if_null(options, headers, 0);
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_GET, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
if (!aos_status_is_ok(s)) {
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
res = oss_list_objects_parse_from_body(options->pool, &resp->body,
|
||
|
|
¶ms->object_list, ¶ms->common_prefix_list,
|
||
|
|
¶ms->next_marker, ¶ms->truncated);
|
||
|
|
if (res != AOSE_OK) {
|
||
|
|
aos_xml_error_status_set(s, res);
|
||
|
|
}
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_put_bucket_lifecycle(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
aos_list_t *lifecycle_rule_list,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
apr_table_t *query_params = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
aos_list_t body;
|
||
|
|
|
||
|
|
//init query_params
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 1);
|
||
|
|
apr_table_add(query_params, OSS_LIFECYCLE, "");
|
||
|
|
|
||
|
|
//init headers
|
||
|
|
headers = aos_table_create_if_null(options, headers, 0);
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_PUT, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
build_lifecycle_body(options->pool, lifecycle_rule_list, &body);
|
||
|
|
oss_write_request_body_from_buffer(&body, req);
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_get_bucket_lifecycle(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
aos_list_t *lifecycle_rule_list,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
int res;
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
|
||
|
|
//init query_params
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 1);
|
||
|
|
apr_table_add(query_params, OSS_LIFECYCLE, "");
|
||
|
|
|
||
|
|
//init headers
|
||
|
|
headers = aos_table_create_if_null(options, headers, 0);
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_GET, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
if (!aos_status_is_ok(s)) {
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
res = oss_lifecycle_rules_parse_from_body(options->pool,
|
||
|
|
&resp->body, lifecycle_rule_list);
|
||
|
|
if (res != AOSE_OK) {
|
||
|
|
aos_xml_error_status_set(s, res);
|
||
|
|
}
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_delete_bucket_lifecycle(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
aos_table_t **resp_headers)
|
||
|
|
{
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
|
||
|
|
//init query_params
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 1);
|
||
|
|
apr_table_add(query_params, OSS_LIFECYCLE, "");
|
||
|
|
|
||
|
|
//init headers
|
||
|
|
headers = aos_table_create_if_null(options, headers, 0);
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_DELETE, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_delete_objects(const oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
aos_list_t *object_list,
|
||
|
|
int is_quiet,
|
||
|
|
aos_table_t **resp_headers,
|
||
|
|
aos_list_t *deleted_object_list)
|
||
|
|
{
|
||
|
|
int res;
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_http_request_t *req = NULL;
|
||
|
|
aos_http_response_t *resp = NULL;
|
||
|
|
aos_table_t *headers = NULL;
|
||
|
|
aos_table_t *query_params = NULL;
|
||
|
|
aos_list_t body;
|
||
|
|
unsigned char *md5 = NULL;
|
||
|
|
char *buf = NULL;
|
||
|
|
int64_t body_len;
|
||
|
|
char *b64_value = NULL;
|
||
|
|
int b64_buf_len = (20 + 1) * 4 / 3;
|
||
|
|
int b64_len;
|
||
|
|
|
||
|
|
//init query_params
|
||
|
|
query_params = aos_table_create_if_null(options, query_params, 1);
|
||
|
|
apr_table_add(query_params, OSS_DELETE, "");
|
||
|
|
|
||
|
|
//init headers
|
||
|
|
headers = aos_table_create_if_null(options, headers, 1);
|
||
|
|
apr_table_set(headers, OSS_CONTENT_TYPE, OSS_MULTIPART_CONTENT_TYPE);
|
||
|
|
|
||
|
|
oss_init_bucket_request(options, bucket, HTTP_POST, &req,
|
||
|
|
query_params, headers, &resp);
|
||
|
|
|
||
|
|
build_delete_objects_body(options->pool, object_list, is_quiet, &body);
|
||
|
|
|
||
|
|
//add Content-MD5
|
||
|
|
body_len = aos_buf_list_len(&body);
|
||
|
|
buf = aos_buf_list_content(options->pool, &body);
|
||
|
|
md5 = aos_md5(options->pool, buf, (apr_size_t)body_len);
|
||
|
|
b64_value = aos_pcalloc(options->pool, b64_buf_len);
|
||
|
|
b64_len = aos_base64_encode(md5, 20, b64_value);
|
||
|
|
b64_value[b64_len] = '\0';
|
||
|
|
apr_table_addn(headers, OSS_CONTENT_MD5, b64_value);
|
||
|
|
|
||
|
|
oss_write_request_body_from_buffer(&body, req);
|
||
|
|
|
||
|
|
s = oss_process_request(options, req, resp);
|
||
|
|
oss_fill_read_response_header(resp, resp_headers);
|
||
|
|
|
||
|
|
if (is_quiet) {
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!aos_status_is_ok(s)) {
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
res = oss_delete_objects_parse_from_body(options->pool, &resp->body,
|
||
|
|
deleted_object_list);
|
||
|
|
if (res != AOSE_OK) {
|
||
|
|
aos_xml_error_status_set(s, res);
|
||
|
|
}
|
||
|
|
|
||
|
|
return s;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_status_t *oss_delete_objects_by_prefix(oss_request_options_t *options,
|
||
|
|
const aos_string_t *bucket,
|
||
|
|
const aos_string_t *prefix)
|
||
|
|
{
|
||
|
|
aos_pool_t *subpool = NULL;
|
||
|
|
aos_pool_t *parent_pool = NULL;
|
||
|
|
int is_quiet = 1;
|
||
|
|
aos_status_t *s = NULL;
|
||
|
|
aos_status_t *ret = NULL;
|
||
|
|
oss_list_object_params_t *params = NULL;
|
||
|
|
int list_object_count = 0;
|
||
|
|
|
||
|
|
parent_pool = options->pool;
|
||
|
|
params = oss_create_list_object_params(parent_pool);
|
||
|
|
if (prefix->data == NULL) {
|
||
|
|
aos_str_set(¶ms->prefix, "");
|
||
|
|
} else {
|
||
|
|
aos_str_set(¶ms->prefix, prefix->data);
|
||
|
|
}
|
||
|
|
while (params->truncated) {
|
||
|
|
aos_table_t *list_object_resp_headers = NULL;
|
||
|
|
aos_list_t object_list;
|
||
|
|
aos_list_t deleted_object_list;
|
||
|
|
oss_list_object_content_t *list_content = NULL;
|
||
|
|
aos_table_t *delete_objects_resp_headers = NULL;
|
||
|
|
char *key = NULL;
|
||
|
|
|
||
|
|
aos_pool_create(&subpool, parent_pool);
|
||
|
|
options->pool = subpool;
|
||
|
|
list_object_count = 0;
|
||
|
|
aos_list_init(&object_list);
|
||
|
|
s = oss_list_object(options, bucket, params, &list_object_resp_headers);
|
||
|
|
if (!aos_status_is_ok(s)) {
|
||
|
|
ret = aos_status_dup(parent_pool, s);
|
||
|
|
aos_pool_destroy(subpool);
|
||
|
|
options->pool = parent_pool;
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_list_for_each_entry(oss_list_object_content_t, list_content, ¶ms->object_list, node) {
|
||
|
|
oss_object_key_t *object_key = oss_create_oss_object_key(parent_pool);
|
||
|
|
key = apr_psprintf(parent_pool, "%.*s", list_content->key.len,
|
||
|
|
list_content->key.data);
|
||
|
|
aos_str_set(&object_key->key, key);
|
||
|
|
aos_list_add_tail(&object_key->node, &object_list);
|
||
|
|
list_object_count += 1;
|
||
|
|
}
|
||
|
|
if (list_object_count == 0)
|
||
|
|
{
|
||
|
|
ret = aos_status_dup(parent_pool, s);
|
||
|
|
aos_pool_destroy(subpool);
|
||
|
|
options->pool = parent_pool;
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
aos_pool_destroy(subpool);
|
||
|
|
|
||
|
|
aos_list_init(&deleted_object_list);
|
||
|
|
aos_pool_create(&subpool, parent_pool);
|
||
|
|
options->pool = subpool;
|
||
|
|
s = oss_delete_objects(options, bucket, &object_list, is_quiet,
|
||
|
|
&delete_objects_resp_headers, &deleted_object_list);
|
||
|
|
if (!aos_status_is_ok(s)) {
|
||
|
|
ret = aos_status_dup(parent_pool, s);
|
||
|
|
aos_pool_destroy(subpool);
|
||
|
|
options->pool = parent_pool;
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
if (!params->truncated) {
|
||
|
|
ret = aos_status_dup(parent_pool, s);
|
||
|
|
}
|
||
|
|
|
||
|
|
aos_pool_destroy(subpool);
|
||
|
|
|
||
|
|
aos_list_init(¶ms->object_list);
|
||
|
|
if (params->next_marker.data) {
|
||
|
|
aos_str_set(¶ms->marker, params->next_marker.data);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
options->pool = parent_pool;
|
||
|
|
return ret;
|
||
|
|
}
|