/** * tstring_assign: * @str: the destination #tstring_t. Its current contents * are destroyed. * @rval: the string to copy into @str * * Copies the bytes from a string into a #tstring_t, * destroying any previous contents. It is rather like * the standard strcpy() function, except that you do not * have to worry about having enough space to copy the string. * * Returns: @str */ tstring_t * tstring_assign(tstring_t *str, const char *rval) { assert(rval != NULL); assert(str != NULL); /* Make sure assigning to itself doesn't corrupt the string. */ if (str->str != rval) { tstring_truncate(str, 0); tstring_append(str, rval); } return str; }
oss_post_object_group_result_t * client_post_object_group(oss_client_t *client, oss_post_object_group_request_t *request, unsigned short *retcode) { assert(client != NULL); assert(request != NULL); curl_request_param_t *user_data = (curl_request_param_t *)malloc(sizeof(curl_request_param_t)); user_data->send_buffer = (param_buffer_t *)malloc(sizeof(param_buffer_t)); //user_data->send_buffer->ptr = (char *)malloc(sizeof(char) * 128 * 1024); user_data->send_buffer->fp = NULL; user_data->recv_buffer = (param_buffer_t *)malloc(sizeof(param_buffer_t)); user_data->recv_buffer->ptr = (char *)malloc(sizeof(char) * MAX_RECV_BUFFER_SIZE); user_data->recv_buffer->fp = NULL; user_data->recv_buffer->left = MAX_RECV_BUFFER_SIZE; user_data->recv_buffer->allocated = MAX_RECV_BUFFER_SIZE; user_data->header_buffer = (param_buffer_t *)malloc(sizeof(param_buffer_t)); user_data->header_buffer->ptr = (char *)malloc(sizeof(char) * MAX_HEADER_BUFFER_SIZE); user_data->header_buffer->fp = NULL; user_data->header_buffer->left = MAX_HEADER_BUFFER_SIZE; user_data->header_buffer->allocated = MAX_HEADER_BUFFER_SIZE; unsigned int bucket_name_len = strlen(request->bucket_name); unsigned int key_len = strlen(request->key); char *resource = (char *)malloc(sizeof(char) * (bucket_name_len + key_len) + 16); char *url = (char *)malloc(sizeof(char) * (bucket_name_len + key_len + strlen(client->endpoint) + 32)); char header_host[256] = {0}; char header_date[48] = {0}; char header_auth[128] = {0}; char *now; char part[256] = {0}; unsigned int sign_len = 0; int parts = 0; unsigned int i = 0; oss_map_t *default_headers = oss_map_new(16); /** * 构造参数,resource,url 赋值, * */ sprintf(resource, "/%s/%s?group", request->get_bucket_name(request), request->get_key(request)); sprintf(url, "%s/%s/%s?group", client->endpoint, request->get_bucket_name(request), request->get_key(request)); sprintf(header_host, "Host: %s", client->endpoint); now = (char *)oss_get_gmt_time(); sprintf(header_date, "Date: %s", now); /** * 请求头部构造 */ oss_map_put(default_headers, OSS_DATE, now); oss_map_put(default_headers, OSS_CONTENT_TYPE, "application/x-www-form-urlencoded"); /** * 生成签名值 */ char *sign = (char *)generate_authentication(client->access_key, OSS_HTTP_POST, default_headers, NULL, resource, &sign_len); sprintf(header_auth, "Authorization: OSS %s:%s", client->access_id, sign); oss_object_group_item_t **part_item = request->get_items(request, &parts); tstring_t *tstr_part_item = tstring_new("<CreateFileGroup>"); for (; i < parts; i++) { sprintf(part, "<Part><PartNumber>%d</PartNumber><PartName>%s</PartName><ETag>%s</ETag></Part>", (*(part_item + i))->get_part_number(*(part_item + i)), (*(part_item + i))->get_part_name(*(part_item + i)), (*(part_item + i))->get_etag(*(part_item + i))); tstring_append(tstr_part_item, part); } tstring_append(tstr_part_item, "</CreateFileGroup>\n"); unsigned int tmp_len = strlen(tstring_data(tstr_part_item)); char *tmp = (char *)malloc(sizeof(char) * (tmp_len + 1)); strncpy(tmp, tstring_data(tstr_part_item), tmp_len); tmp[tmp_len] = '\0'; user_data->send_buffer->ptr = tmp; //user_data->send_buffer->ptr = (char *)(tstring_data(tstr_part_item)); user_data->send_buffer->left = tstring_size(tstr_part_item); user_data->send_buffer->allocated = tstring_size(tstr_part_item); /** * 自定义 HTTP 请求头部 */ struct curl_slist *http_headers = NULL; http_headers = curl_slist_append(http_headers, header_host); http_headers = curl_slist_append(http_headers, header_date); http_headers = curl_slist_append(http_headers, header_auth); /** * 发送请求 */ object_group_curl_operation(OSS_HTTP_POST, resource, url, http_headers, user_data); /** * 释放 http_headers资源 */ curl_slist_free_all(http_headers); tstring_free(tstr_part_item); oss_map_delete(default_headers); if(now != NULL) { free(now); now = NULL; } if(sign != NULL) { free(sign); sign = NULL; } if(resource != NULL) { free(resource); resource = NULL; } if(url != NULL) { free(url); url = NULL; } if (user_data->header_buffer->code != 200) { if (retcode != NULL) *retcode = oss_get_retcode_from_response(user_data->recv_buffer->ptr); oss_free_user_data(user_data); return NULL; } else { if (retcode != NULL) *retcode = 0; return construct_post_object_group_response(user_data); } }