dpl_status_t dpl_s3_put(dpl_ctx_t *ctx, const char *bucket, const char *resource, const char *subresource, const dpl_option_t *option, dpl_ftype_t object_type, const dpl_condition_t *condition, const dpl_range_t *range, const dpl_dict_t *metadata, const dpl_sysmd_t *sysmd, const char *data_buf, unsigned int data_len, const dpl_dict_t *query_params, dpl_sysmd_t *returned_sysmdp, char **locationp) { int ret, ret2; dpl_conn_t *conn = NULL; char header[dpl_header_size]; u_int header_len; struct iovec iov[10]; int n_iov = 0; int connection_close = 0; dpl_dict_t *headers_request = NULL; dpl_dict_t *headers_reply = NULL; dpl_req_t *req = NULL; dpl_s3_req_mask_t req_mask = 0u; DPL_TRACE(ctx, DPL_TRACE_BACKEND, ""); req = dpl_req_new(ctx); if (NULL == req) { ret = DPL_ENOMEM; goto end; } dpl_req_set_method(req, DPL_METHOD_PUT); if (NULL == bucket) { ret = DPL_EINVAL; goto end; } ret2 = dpl_req_set_bucket(req, bucket); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_set_resource(req, resource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } if (NULL != subresource) { ret2 = dpl_req_set_subresource(req, subresource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } dpl_req_set_data(req, data_buf, data_len); dpl_req_add_behavior(req, DPL_BEHAVIOR_MD5); if (sysmd) { if (sysmd->mask & DPL_SYSMD_MASK_CANNED_ACL) dpl_req_set_canned_acl(req, sysmd->canned_acl); if (sysmd->mask & DPL_SYSMD_MASK_STORAGE_CLASS) dpl_req_set_storage_class(req, sysmd->storage_class); } if (NULL != metadata) { ret2 = dpl_req_add_metadata(req, metadata); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } ret2 = dpl_s3_req_build(req, req_mask, &headers_request); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_try_connect(ctx, req, &conn); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_add_host_to_headers(req, headers_request); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_s3_add_authorization_to_headers(req, headers_request, NULL, NULL); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_gen_http_request(ctx, req, headers_request, NULL, header, sizeof (header), &header_len); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } iov[n_iov].iov_base = header; iov[n_iov].iov_len = header_len; n_iov++; //final crlf iov[n_iov].iov_base = "\r\n"; iov[n_iov].iov_len = 2; n_iov++; //buffer iov[n_iov].iov_base = (void *)data_buf; iov[n_iov].iov_len = data_len; n_iov++; ret2 = dpl_conn_writev_all(conn, iov, n_iov, conn->ctx->write_timeout); if (DPL_SUCCESS != ret2) { DPL_TRACE(conn->ctx, DPL_TRACE_ERR, "writev failed"); connection_close = 1; ret = ret2; goto end; } ret2 = dpl_read_http_reply(conn, 1, NULL, NULL, &headers_reply, &connection_close); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret = DPL_SUCCESS; end: if (NULL != conn) { if (1 == connection_close) dpl_conn_terminate(conn); else dpl_conn_release(conn); } if (NULL != headers_reply) dpl_dict_free(headers_reply); if (NULL != headers_request) dpl_dict_free(headers_request); if (NULL != req) dpl_req_free(req); DPL_TRACE(ctx, DPL_TRACE_BACKEND, "ret=%d", ret); return ret; }
/** * make a bucket * * @param ctx * @param bucket * @param location_constraint * @param sysmd * * @return */ dpl_status_t dpl_s3_make_bucket(dpl_ctx_t *ctx, const char *bucket, const dpl_sysmd_t *sysmd, char **locationp) { int ret, ret2; dpl_conn_t *conn = NULL; char header[dpl_header_size]; u_int header_len; struct iovec iov[10]; int n_iov = 0; int connection_close = 0; char *location_constraint_str; char data_str[1024]; u_int data_len; dpl_dict_t *headers_request = NULL; dpl_dict_t *headers_reply = NULL; dpl_req_t *req = NULL; dpl_s3_req_mask_t req_mask = 0u; DPL_TRACE(ctx, DPL_TRACE_BACKEND, ""); req = dpl_req_new(ctx); if (NULL == req) { ret = DPL_ENOMEM; goto end; } dpl_req_set_method(req, DPL_METHOD_PUT); if (NULL == bucket) { ret = DPL_EINVAL; goto end; } ret2 = dpl_req_set_bucket(req, bucket); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_set_resource(req, "/"); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } if (sysmd) { if (sysmd->mask & DPL_SYSMD_MASK_LOCATION_CONSTRAINT) { if (DPL_LOCATION_CONSTRAINT_US_STANDARD == sysmd->location_constraint) { data_str[0] = 0; data_len = 0; } else { location_constraint_str = dpl_location_constraint_str(sysmd->location_constraint); if (NULL == location_constraint_str) { ret = DPL_ENOMEM; goto end; } snprintf(data_str, sizeof (data_str), "<CreateBucketConfiguration xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n" "<LocationConstraint>%s</LocationConstraint>\n" "</CreateBucketConfiguration>\n", location_constraint_str); data_len = strlen(data_str); } } else { data_str[0] = 0; data_len = 0; } } else { data_str[0] = 0; data_len = 0; } dpl_req_set_data(req, data_str, data_len); if (sysmd) { if (sysmd->mask & DPL_SYSMD_MASK_CANNED_ACL) dpl_req_set_canned_acl(req, sysmd->canned_acl); if (sysmd->mask & DPL_SYSMD_MASK_STORAGE_CLASS) dpl_req_set_storage_class(req, sysmd->storage_class); } //build request ret2 = dpl_s3_req_build(req, req_mask, &headers_request); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_try_connect(ctx, req, &conn); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_add_host_to_headers(req, headers_request); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_gen_http_request(ctx, req, headers_request, NULL, header, sizeof (header), &header_len); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } iov[n_iov].iov_base = header; iov[n_iov].iov_len = header_len; n_iov++; //final crlf iov[n_iov].iov_base = "\r\n"; iov[n_iov].iov_len = 2; n_iov++; //buffer iov[n_iov].iov_base = data_str; iov[n_iov].iov_len = data_len; n_iov++; ret2 = dpl_conn_writev_all(conn, iov, n_iov, conn->ctx->write_timeout); if (DPL_SUCCESS != ret2) { DPL_TRACE(conn->ctx, DPL_TRACE_ERR, "writev failed"); connection_close = 1; ret = ret2; goto end; } ret2 = dpl_read_http_reply(conn, 1, NULL, NULL, &headers_reply, &connection_close); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret = DPL_SUCCESS; end: if (NULL != conn) { if (1 == connection_close) dpl_conn_terminate(conn); else dpl_conn_release(conn); } if (NULL != headers_reply) dpl_dict_free(headers_reply); if (NULL != headers_request) dpl_dict_free(headers_request); if (NULL != req) dpl_req_free(req); DPL_TRACE(ctx, DPL_TRACE_BACKEND, "ret=%d", ret); return ret; }
dpl_status_t dpl_s3_stream_multipart_complete(dpl_ctx_t *ctx, const char *bucket, const char *resource, const char *uploadid, struct json_object *parts, unsigned int n_parts, const dpl_dict_t *metadata, const dpl_sysmd_t *sysmd) { dpl_status_t ret; dpl_conn_t *conn = NULL; char header[dpl_header_size]; u_int header_len; struct iovec iov[10]; int n_iov = 0; int connection_close = 0; dpl_dict_t *headers_request = NULL; dpl_dict_t *headers_reply = NULL; dpl_req_t *req = NULL; char subresource[strlen(uploadid) + 10 /* for 'uploadId=' */]; char *databuf = NULL; unsigned int databuflen = 0; char *replybuf = NULL; unsigned int replybuflen = 0; snprintf(subresource, sizeof(subresource), "uploadId=%s", uploadid); req = dpl_req_new(ctx); if (NULL == req) { ret = DPL_ENOMEM; goto end; } dpl_req_set_method(req, DPL_METHOD_POST); if (NULL == bucket) { ret = DPL_EINVAL; goto end; } ret = dpl_req_set_bucket(req, bucket); if (DPL_SUCCESS != ret) goto end; ret = dpl_req_set_resource(req, resource); if (DPL_SUCCESS != ret) goto end; ret = dpl_req_set_subresource(req, subresource); if (DPL_SUCCESS != ret) goto end; ret = multipart_complete_gen_body(ctx, parts, n_parts, &databuf, &databuflen); if (DPL_SUCCESS != ret) goto end; dpl_req_set_data(req, databuf, databuflen); dpl_req_add_behavior(req, DPL_BEHAVIOR_MD5); if (sysmd) { if (sysmd->mask & DPL_SYSMD_MASK_CANNED_ACL) dpl_req_set_canned_acl(req, sysmd->canned_acl); if (sysmd->mask & DPL_SYSMD_MASK_STORAGE_CLASS) dpl_req_set_storage_class(req, sysmd->storage_class); } if (NULL != metadata) { ret = dpl_req_add_metadata(req, metadata); if (DPL_SUCCESS != ret) goto end; } ret = dpl_s3_req_build(req, 0u, &headers_request); if (DPL_SUCCESS != ret) goto end; ret = dpl_try_connect(ctx, req, &conn); if (DPL_SUCCESS != ret) goto end; ret = dpl_add_host_to_headers(req, headers_request); if (DPL_SUCCESS != ret) goto end; ret = dpl_s3_add_authorization_to_headers(req, headers_request, NULL, NULL); if (DPL_SUCCESS != ret) goto end; ret = dpl_req_gen_http_request(ctx, req, headers_request, NULL, header, sizeof (header), &header_len); if (DPL_SUCCESS != ret) goto end; iov[n_iov].iov_base = header; iov[n_iov].iov_len = header_len; n_iov++; //final crlf iov[n_iov].iov_base = "\r\n"; iov[n_iov].iov_len = 2; n_iov++; //buffer iov[n_iov].iov_base = (void *)databuf; iov[n_iov].iov_len = databuflen; n_iov++; ret = dpl_conn_writev_all(conn, iov, n_iov, conn->ctx->write_timeout); if (DPL_SUCCESS != ret) { DPL_TRACE(conn->ctx, DPL_TRACE_ERR, "writev failed"); connection_close = 1; goto end; } ret = dpl_read_http_reply_ext(conn, 1, 0, &replybuf, &replybuflen, &headers_reply, &connection_close); if (DPL_SUCCESS != ret) goto end; ret = _multipart_parse_complete(ctx, replybuf, replybuflen); if (DPL_SUCCESS != ret) goto end; ret = DPL_SUCCESS; end: free(databuf); if (NULL != conn) { if (1 == connection_close) dpl_conn_terminate(conn); else dpl_conn_release(conn); } if (NULL != headers_reply) dpl_dict_free(headers_reply); if (NULL != headers_request) dpl_dict_free(headers_request); if (NULL != req) dpl_req_free(req); return ret; }
dpl_status_t dpl_s3_copy(dpl_ctx_t *ctx, const char *src_bucket, const char *src_resource, const char *src_subresource, const char *dst_bucket, const char *dst_resource, const char *dst_subresource, const dpl_option_t *option, dpl_ftype_t object_type, dpl_copy_directive_t copy_directive, const dpl_dict_t *metadata, const dpl_sysmd_t *sysmd, const dpl_condition_t *condition, char **locationp) { int ret, ret2; dpl_conn_t *conn = NULL; char header[dpl_header_size]; u_int header_len; struct iovec iov[10]; int n_iov = 0; int connection_close = 0; dpl_dict_t *headers_request = NULL; dpl_dict_t *headers_reply = NULL; dpl_req_t *req = NULL; dpl_s3_req_mask_t req_mask = 0u; DPL_TRACE(ctx, DPL_TRACE_BACKEND, ""); req = dpl_req_new(ctx); if (NULL == req) { ret = DPL_ENOMEM; goto end; } dpl_req_set_method(req, DPL_METHOD_PUT); req_mask |= DPL_S3_REQ_COPY; if (NULL != condition) dpl_req_set_copy_source_condition(req, condition); if (NULL == src_bucket || NULL == dst_bucket) { ret = DPL_EINVAL; goto end; } ret2 = dpl_req_set_bucket(req, dst_bucket); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_set_resource(req, dst_resource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } if (NULL != dst_subresource) { ret2 = dpl_req_set_subresource(req, dst_subresource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } ret2 = dpl_req_set_src_bucket(req, src_bucket); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_set_src_resource(req, src_resource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } if (NULL != src_subresource) { ret2 = dpl_req_set_src_subresource(req, src_subresource); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } dpl_req_set_copy_directive(req, copy_directive); if (NULL != metadata) { ret2 = dpl_req_add_metadata(req, metadata); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } } if (sysmd) { if (sysmd->mask & DPL_SYSMD_MASK_CANNED_ACL) dpl_req_set_canned_acl(req, sysmd->canned_acl); } //build request ret2 = dpl_s3_req_build(req, req_mask, &headers_request); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_try_connect(ctx, req, &conn); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_add_host_to_headers(req, headers_request); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret2 = dpl_req_gen_http_request(ctx, req, headers_request, NULL, header, sizeof (header), &header_len); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } iov[n_iov].iov_base = header; iov[n_iov].iov_len = header_len; n_iov++; //final crlf iov[n_iov].iov_base = "\r\n"; iov[n_iov].iov_len = 2; n_iov++; ret2 = dpl_conn_writev_all(conn, iov, n_iov, conn->ctx->write_timeout); if (DPL_SUCCESS != ret2) { DPL_TRACE(conn->ctx, DPL_TRACE_ERR, "writev failed"); connection_close = 1; ret = DPL_FAILURE; goto end; } ret2 = dpl_read_http_reply(conn, 1, NULL, NULL, &headers_reply, &connection_close); if (DPL_SUCCESS != ret2) { ret = ret2; goto end; } ret = DPL_SUCCESS; end: if (NULL != conn) { if (1 == connection_close) dpl_conn_terminate(conn); else dpl_conn_release(conn); } if (NULL != headers_reply) dpl_dict_free(headers_reply); if (NULL != headers_request) dpl_dict_free(headers_request); if (NULL != req) dpl_req_free(req); DPL_TRACE(ctx, DPL_TRACE_BACKEND, "ret=%d", ret); return ret; }