static Qiniu_Error Qiniu_Io_call( Qiniu_Client* self, Qiniu_Io_PutRet* ret, struct curl_httppost* formpost) { Qiniu_Error err; CURL* curl = Qiniu_Client_reset(self); struct curl_slist* headers = curl_slist_append(NULL, "Expect:"); curl_easy_setopt(curl, CURLOPT_URL, QINIU_UP_HOST); curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); err = Qiniu_callex(curl, &self->b, &self->root, Qiniu_False, &self->respHeader); if (err.code == 200 && ret != NULL) { ret->hash = Qiniu_Json_GetString(self->root, "hash", NULL); ret->key = Qiniu_Json_GetString(self->root, "key", NULL); } curl_formfree(formpost); /* * Bug No.(4718) Wang Xiaotao 2013\10\17 17:46:07 * Change for : free variable 'headers' * Reason : memory leak! */ curl_slist_free_all(headers); return err; }
Qiniu_Error Qiniu_RS_Stat( Qiniu_Client* self, Qiniu_RS_StatRet* ret, const char* tableName, const char* key) { Qiniu_Error err; cJSON* root; char* entryURI = Qiniu_String_Concat3(tableName, ":", key); char* entryURIEncoded = Qiniu_String_Encode(entryURI); char* url = Qiniu_String_Concat3(QINIU_RS_HOST, "/stat/", entryURIEncoded); Qiniu_Free(entryURI); Qiniu_Free(entryURIEncoded); err = Qiniu_Client_Call(self, &root, url); Qiniu_Free(url); if (err.code == 200) { ret->hash = Qiniu_Json_GetString(root, "hash", 0); ret->mimeType = Qiniu_Json_GetString(root, "mimeType", 0); ret->fsize = Qiniu_Json_GetInt64(root, "fsize", 0); ret->putTime = Qiniu_Json_GetInt64(root, "putTime", 0); } return err; }
Qiniu_Error Qiniu_callex(CURL* curl, Qiniu_Buffer *resp, Qiniu_Json** ret, Qiniu_Bool simpleError, Qiniu_Buffer *resph) { Qiniu_Error err; CURLcode curlCode; long httpCode; Qiniu_Json* root; curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Qiniu_Buffer_Fwrite); curl_easy_setopt(curl, CURLOPT_WRITEDATA, resp); if (resph != NULL) { curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, Qiniu_Buffer_Fwrite); curl_easy_setopt(curl, CURLOPT_WRITEHEADER, resph); } curlCode = curl_easy_perform(curl); if (curlCode == 0) { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpCode); if (Qiniu_Buffer_Len(resp) != 0) { root = cJSON_Parse(Qiniu_Buffer_CStr(resp)); } else { root = NULL; } *ret = root; err.code = (int)httpCode; if (httpCode / 100 != 2) { if (simpleError) { err.message = g_statusCodeError; } else { err.message = Qiniu_Json_GetString(root, "error", g_statusCodeError); } } else { err.message = "OK"; } } else { *ret = NULL; err.code = curlCode; err.message = "curl_easy_perform error"; } printf("code %d\n", err.code); return err; }
Qiniu_Error Qiniu_RS_BatchCopy( Qiniu_Client* self, Qiniu_RS_BatchItemRet* rets, Qiniu_RS_EntryPathPair* entryPairs, Qiniu_ItemCount entryCount) { int code; Qiniu_Error err; cJSON *root, *arrayItem, *dataItem; char *body = NULL, *bodyTmp = NULL; char *entryURISrc, *entryURISrcEncoded, *opBody; char *entryURIDest, *entryURIDestEncoded, *bodyPart; Qiniu_ItemCount curr = 0; Qiniu_ItemCount retSize = 0; Qiniu_RS_EntryPathPair* entryPair = entryPairs; char* url = Qiniu_String_Concat2(QINIU_RS_HOST, "/batch"); curr = 0; while (curr < entryCount) { entryURISrc = Qiniu_String_Concat3(entryPair->src.bucket, ":", entryPair->src.key); entryURISrcEncoded = Qiniu_String_Encode(entryURISrc); entryURIDest = Qiniu_String_Concat3(entryPair->dest.bucket, ":", entryPair->dest.key); entryURIDestEncoded = Qiniu_String_Encode(entryURIDest); bodyPart = Qiniu_String_Concat3(entryURISrcEncoded, "/", entryURIDestEncoded); opBody = Qiniu_String_Concat2("op=/copy/", bodyPart); free(entryURISrc); free(entryURISrcEncoded); free(entryURIDest); free(entryURIDestEncoded); free(bodyPart); if (!body) { bodyTmp = opBody; } else { bodyTmp = Qiniu_String_Concat3(body, "&", opBody); free(opBody); } free(body); body = bodyTmp; curr++; entryPair = &entryPairs[curr]; } err = Qiniu_Client_CallWithBuffer(self, &root, url, body, strlen(body), "application/x-www-form-urlencoded"); free(url); /* * Bug No.(4672) Wang Xiaotao 2013\10\15 17:56:00 * Change for : free var 'body' * Reason : memory leak! */ free(body); retSize = cJSON_GetArraySize(root); curr = 0; while (curr < retSize) { arrayItem = cJSON_GetArrayItem(root, curr); code = (int)Qiniu_Json_GetInt64(arrayItem, "code", 0); dataItem = cJSON_GetObjectItem(arrayItem, "data"); rets[curr].code = code; if (code != 200) { rets[curr].error = Qiniu_Json_GetString(dataItem, "error", 0); } curr++; } return err; }
Qiniu_Error Qiniu_RS_BatchStat( Qiniu_Client* self, Qiniu_RS_BatchStatRet* rets, Qiniu_RS_EntryPath* entries, Qiniu_ItemCount entryCount) { int code; Qiniu_Error err; cJSON *root, *arrayItem, *dataItem; char *body = NULL, *bodyTmp = NULL; char *entryURI, *entryURIEncoded, *opBody; Qiniu_RS_EntryPath* entry = entries; Qiniu_ItemCount curr = 0; Qiniu_ItemCount retSize = 0; char* url = Qiniu_String_Concat2(QINIU_RS_HOST, "/batch"); while (curr < entryCount) { entryURI = Qiniu_String_Concat3(entry->bucket, ":", entry->key); entryURIEncoded = Qiniu_String_Encode(entryURI); opBody = Qiniu_String_Concat2("op=/stat/", entryURIEncoded); free(entryURI); free(entryURIEncoded); if (!body) { bodyTmp = opBody; } else { bodyTmp = Qiniu_String_Concat3(body, "&", opBody); free(opBody); } free(body); body = bodyTmp; curr++; entry = &entries[curr]; } err = Qiniu_Client_CallWithBuffer(self, &root, url, body, strlen(body), "application/x-www-form-urlencoded"); free(url); /* * Bug No.(4672) Wang Xiaotao 2013\10\15 17:56:00 * Change for : free var 'body' * Reason : memory leak! */ free(body); retSize = cJSON_GetArraySize(root); curr = 0; while (curr < retSize) { arrayItem = cJSON_GetArrayItem(root, curr); code = (int)Qiniu_Json_GetInt64(arrayItem, "code", 0); dataItem = cJSON_GetObjectItem(arrayItem, "data"); rets[curr].code = code; if (code != 200) { rets[curr].error = Qiniu_Json_GetString(dataItem, "error", 0); } else { rets[curr].data.hash = Qiniu_Json_GetString(dataItem, "hash", 0); rets[curr].data.mimeType = Qiniu_Json_GetString(dataItem, "mimeType", 0); rets[curr].data.fsize = Qiniu_Json_GetInt64(dataItem, "fsize", 0); rets[curr].data.putTime = Qiniu_Json_GetInt64(dataItem, "putTime", 0); } curr++; } return err; }