Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
// require curl 7.17 higher
// http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html
xmlParserCtxtPtr DoGetXML(const string &region, 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;
}