TEST(S3Common, HeaderContent) { HeaderContent *h = new HeaderContent(); EXPECT_NE((void *)NULL, h); // test Add if (h) { ASSERT_TRUE(h->Add(HOST, HOSTSTR)); ASSERT_TRUE(h->Add(RANGE, RANGESTR)); ASSERT_TRUE(h->Add(CONTENTMD5, MD5STR)); } // test Get #if 0 if (h) { EXPECT_STREQ(HOSTSTR, h->Get(HOST)); EXPECT_STREQ(RANGESTR, h->Get(RANGE)); EXPECT_STREQ(MD5STR, h->Get(CONTENTMD5)); } #endif // test GetList if (h) { curl_slist *l = h->GetList(); ASSERT_NE((void *)NULL, l); if (l) { curl_slist_free_all(l); } } if (h) delete h; }
// require curl 7.17 higher // http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html xmlParserCtxtPtr DoGetXML(const string ®ion, const string &url, const string &prefix, const S3Credential &cred, const string &marker) { stringstream host; host << "s3-" << region << ".amazonaws.com"; CURL *curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); #if DEBUG_S3_CURL curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); #endif curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1L); } else { S3ERROR("Can't create curl instance, no enough memory?"); return NULL; } XMLInfo xml; xml.ctxt = NULL; curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&xml); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ParserCallback); HeaderContent *header = new HeaderContent(); if (!header) { S3ERROR("Can allocate memory for header"); return NULL; } header->Add(HOST, host.str()); UrlParser p(url.c_str()); header->Add(X_AMZ_CONTENT_SHA256, "UNSIGNED-PAYLOAD"); std::stringstream query; if (marker != "") { query << "marker=" << marker << "&"; } query << "prefix=" << prefix; if (!SignRequestV4("GET", header, region, p.Path(), query.str(), cred)) { S3ERROR("Failed to sign in DoGetXML()"); delete header; return NULL; } struct curl_slist *chunk = header->GetList(); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); CURLcode res = curl_easy_perform(curl); if (res != CURLE_OK) { S3ERROR("curl_easy_perform() failed: %s", curl_easy_strerror(res)); if (xml.ctxt) { xmlDocPtr doc = xml.ctxt->myDoc; xmlFreeParserCtxt(xml.ctxt); xmlFreeDoc(doc); xml.ctxt = NULL; } } else { if (xml.ctxt) { xmlParseChunk(xml.ctxt, "", 0, 1); } else { S3ERROR("XML is downloaded but failed to be parsed"); } } curl_slist_free_all(chunk); curl_easy_cleanup(curl); delete header; return xml.ctxt; }