提交 1a861ede 编写于 作者: A Adam Lee 提交者: Adam Lee

s3ext: implement POST method

Signed-off-by: NAdam Lee <ali@pivotal.io>
Signed-off-by: NHaozhou Wang <hawang@pivotal.io>
上级 34d311e4
......@@ -31,8 +31,8 @@ class S(BaseHTTPRequestHandler):
self._set_headers()
def do_PUT(self):
# Doesn't do anything with posted data
print "----- SOMETHING WAS PUT!! ------"
# Just bounce the request back
print "----- SOMETHING WAS PUT ------"
print self.headers
length = int(self.headers['Content-Length'])
content = self.rfile.read(length)
......@@ -40,8 +40,8 @@ class S(BaseHTTPRequestHandler):
self.wfile.write(content)
def do_POST(self):
# Doesn't do anything with posted data
print "----- SOMETHING WAS POST!! ------"
# Just bounce the request back
print "----- SOMETHING WAS POST ------"
print self.headers
length = int(self.headers['Content-Length'])
content = self.rfile.read(length)
......
#ifndef INCLUDE_GPWRITER_H_
#define INCLUDE_GPWRITER_H_
#include <string>
#include <string.h>
#include <string>
#include "writer.h"
......
......@@ -126,6 +126,8 @@ class S3Service : public S3Interface {
xmlParserCtxtPtr getXMLContext(Response& response);
string getUploadId(const string& keyUrl, const string& region, const S3Credential& cred);
RESTfulService* restfulService;
};
......
......@@ -12,6 +12,9 @@ class S3RESTfulService : public RESTfulService {
Response put(const string& url, HTTPHeaders& headers, const map<string, string>& params,
const vector<uint8_t>& data);
Response post(const string& url, HTTPHeaders& headers, const map<string, string>& params,
const string& queryString);
ResponseCode head(const string& url, HTTPHeaders& headers, const map<string, string>& params);
};
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -3,7 +3,7 @@ CREATE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
-- end_ignore
......
......@@ -3,7 +3,7 @@ CREATE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
-- end_ignore
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION write_to_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_export' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
writefunc = write_to_s3
writefunc = write_to_s3
);
DROP EXTERNAL TABLE s3regress;
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS '$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE OR REPLACE FUNCTION write_to_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_export' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3,
writefunc = write_to_s3
readfunc = read_from_s3,
writefunc = write_to_s3
);
DROP EXTERNAL TABLE IF EXISTS s3regress_r;
DROP EXTERNAL TABLE IF EXISTS s3regress_w;
CREATE READABLE EXTERNAL TABLE s3regress_r (date text, time text, open float, high float, low float, volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/ config=/home/gpadmin/s3.conf') FORMAT 'csv';
CREATE READABLE EXTERNAL TABLE s3regress_r (date text, time text, open float, high float, low float,
volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/533.csv config=/home/gpadmin/s3.conf') FORMAT 'csv';
CREATE WRITABLE EXTERNAL TABLE s3regress_w (date text, time text, open float, high float, low float, volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/533.csv config=/home/gpadmin/s3.conf') FORMAT 'csv';
CREATE WRITABLE EXTERNAL TABLE s3regress_w (date text, time text, open float, high float, low float,
volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/533.csv config=/home/gpadmin/s3.conf') FORMAT 'csv';
INSERT INTO s3regress_w (date, time, open, high, low, volume) values ('2016-07-28', '12:00:00', 0.5, 0.5, 0.3, 1);
INSERT INTO s3regress_w (date, time, open, high, low, volume) VALUES ('2016-07-28', '12:00:00', 0.5, 0.5, 0.3, 1);
SELECT * FROM s3regress_r limit 1;
SELECT * FROM s3regress_r LIMIT 1;
DROP EXTERNAL TABLE IF EXISTS s3regress_r;
DROP EXTERNAL TABLE IF EXISTS s3regress_w;
......
......@@ -2,7 +2,7 @@ CREATE OR REPLACE FUNCTION write_to_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_export' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
writefunc = write_to_s3
writefunc = write_to_s3
);
DROP EXTERNAL TABLE s3regress;
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
......@@ -3,7 +3,7 @@ CREATE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
ERROR: function "read_from_s3" already exists with same argument types
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
ERROR: duplicate key value violates unique constraint "pg_extprotocol_ptcname_index"
DETAIL: Key (ptcname)=(s3) already exists.
......
......@@ -3,7 +3,7 @@ CREATE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
ERROR: function "read_from_s3" already exists with same argument types
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
-- end_ignore
DROP EXTERNAL TABLE parallel2;
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3
readfunc = read_from_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION write_to_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_export' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
writefunc = write_to_s3
writefunc = write_to_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS '$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE OR REPLACE FUNCTION read_from_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_import' LANGUAGE C STABLE;
CREATE OR REPLACE FUNCTION write_to_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_export' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
readfunc = read_from_s3,
writefunc = write_to_s3
readfunc = read_from_s3,
writefunc = write_to_s3
);
DROP EXTERNAL TABLE IF EXISTS s3regress_r;
NOTICE: table "s3regress_r" does not exist, skipping
DROP EXTERNAL TABLE IF EXISTS s3regress_w;
NOTICE: table "s3regress_w" does not exist, skipping
CREATE READABLE EXTERNAL TABLE s3regress_r (date text, time text, open float, high float, low float, volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/ config=/home/gpadmin/s3.conf') FORMAT 'csv';
CREATE WRITABLE EXTERNAL TABLE s3regress_w (date text, time text, open float, high float, low float, volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/533.csv config=/home/gpadmin/s3.conf') FORMAT 'csv';
INSERT INTO s3regress_w (date, time, open, high, low, volume) values ('2016-07-28', '12:00:00', 0.5, 0.5, 0.3, 1);
SELECT * FROM s3regress_r limit 1;
CREATE READABLE EXTERNAL TABLE s3regress_r (date text, time text, open float, high float, low float,
volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/533.csv config=/home/gpadmin/s3.conf') FORMAT 'csv';
CREATE WRITABLE EXTERNAL TABLE s3regress_w (date text, time text, open float, high float, low float,
volume int) LOCATION('s3://s3-us-west-2.amazonaws.com/s3test.pivotal.io/regress/s3write/quick/533.csv config=/home/gpadmin/s3.conf') FORMAT 'csv';
INSERT INTO s3regress_w (date, time, open, high, low, volume) VALUES ('2016-07-28', '12:00:00', 0.5, 0.5, 0.3, 1);
SELECT * FROM s3regress_r LIMIT 1;
date | time | open | high | low | volume
------------+----------+------+------+-----+--------
2016-07-28 | 12:00:00 | 0.5 | 0.5 | 0.3 | 1
......
CREATE OR REPLACE FUNCTION write_to_s3() RETURNS integer AS
'$libdir/gps3ext.so', 's3_export' LANGUAGE C STABLE;
CREATE PROTOCOL s3 (
writefunc = write_to_s3
writefunc = write_to_s3
);
DROP EXTERNAL TABLE s3regress;
ERROR: table "s3regress" does not exist
......
......@@ -45,7 +45,7 @@ uint64_t GPWriter::write(char* buf, uint64_t count) {
vector<uint8_t> data;
data.insert(data.end(), buf, buf + count);
return this->s3service.uploadData(data, this->params.getUrlToUpload(), this->params.getRegion(),
return this->s3service.uploadData(data, this->getKeyToUpload(), this->params.getRegion(),
this->params.getCred());
}
......
......@@ -446,6 +446,11 @@ bool S3Service::checkKeyExistence(const string &keyUrl, const string &region,
return false;
}
string S3Service::getUploadId(const string &keyUrl, const string &region,
const S3Credential &cred) {
return "";
}
ListBucketResult::~ListBucketResult() {
vector<BucketContent *>::iterator i;
for (i = this->contents.begin(); i != this->contents.end(); i++) {
......
......@@ -203,6 +203,75 @@ Response S3RESTfulService::put(const string &url, HTTPHeaders &headers,
return response;
}
Response S3RESTfulService::post(const string &url, HTTPHeaders &headers,
const map<string, string> &params, const string &queryString) {
Response response;
CURL *curl = curl_easy_init();
CHECK_OR_DIE_MSG(curl != NULL, "%s", "Failed to create curl handler");
headers.CreateList();
/* options for downloading */
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_FORBID_REUSE, 1L);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers.GetList());
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&response);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, RESTfulServiceWriteFuncCallback);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, queryString.c_str());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)queryString.length());
// consider low speed as timeout
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, s3ext_low_speed_limit);
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, s3ext_low_speed_time);
map<string, string>::const_iterator iter = params.find("debug");
if (iter != params.end() && iter->second == "true") {
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
}
if (s3ext_debug_curl) {
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
}
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
S3ERROR("curl_easy_perform() failed: %s", curl_easy_strerror(res));
response.clearBuffer();
response.setStatus(RESPONSE_FAIL);
response.setMessage(
string("Failed to talk to s3 service ").append(curl_easy_strerror(res)));
} else {
long responseCode;
// Get the HTTP response status code from HTTP header
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode);
// 2XX are successful response. Here we deal with 200 (OK) and 206 (partial content)
// firstly.
if ((responseCode == 200) || (responseCode == 206)) {
response.setStatus(RESPONSE_OK);
response.setMessage("Success");
} else { // Server error, set status to RESPONSE_ERROR
stringstream sstr;
sstr << "S3 server returned error, error code is " << responseCode;
response.setStatus(RESPONSE_ERROR);
response.setMessage(sstr.str());
}
}
curl_easy_cleanup(curl);
headers.FreeList();
return response;
}
// head() will execute HTTP HEAD RESTful API with given url/headers/params, and return the HTTP
// response code.
//
......
......@@ -29,7 +29,6 @@ class MockS3Interface : public S3Interface {
const S3Credential& cred));
};
class MockS3RESTfulService : public S3RESTfulService {
public:
MOCK_METHOD3(get, Response(const string &url, HTTPHeaders &headers,
......
......@@ -145,14 +145,14 @@ bool compareVector(const vector<T>& a, const vector<T>& b) {
return true;
}
/* Run 'python bin/dummyHTTPServer.py' before enable this test */
/* Run './bin/dummyHTTPServer.py' before enabling this test */
TEST(S3RESTfulService, DISABLED_PutToDummyServer) {
HTTPHeaders headers;
map<string, string> params;
string url;
S3RESTfulService service;
/* data = "abcdefghij", len = 11 (including '\0') */
/* data = "abcdefghij", length = 11 (including '\0') */
vector<uint8_t> data;
for (int i = 0; i < 10; i++) data.push_back('a' + i);
data.push_back(0);
......@@ -160,7 +160,6 @@ TEST(S3RESTfulService, DISABLED_PutToDummyServer) {
headers.Add(CONTENTTYPE, "text/plain");
headers.Add(CONTENTLENGTH, std::to_string(data.size()));
/* 553 is our office room number */
url = "http://localhost:8553";
Response resp = service.put(url, headers, params, data);
......@@ -204,3 +203,63 @@ TEST(S3RESTfulService, HeadWithCorrectURL) {
EXPECT_EQ(200, code);
}
TEST(S3RESTfulService, PostWithoutURL) {
HTTPHeaders headers;
map<string, string> params;
string url;
S3RESTfulService service;
string query;
Response resp = service.post(url, headers, params, query);
EXPECT_EQ(RESPONSE_FAIL, resp.getStatus());
EXPECT_EQ("Failed to talk to s3 service URL using bad/illegal format or missing URL",
resp.getMessage());
}
TEST(S3RESTfulService, PostToServerWithBlindPutService) {
HTTPHeaders headers;
map<string, string> params;
string url;
S3RESTfulService service;
string query = "abcdefghij";
url = "https://www.bing.com";
Response resp = service.post(url, headers, params, query);
EXPECT_EQ(RESPONSE_OK, resp.getStatus());
}
TEST(S3RESTfulService, PostToServerWith404Page) {
HTTPHeaders headers;
map<string, string> params;
string url;
S3RESTfulService service;
string query = "abcdefghij";
url = "https://www.bing.com/pivotal.html";
Response resp = service.post(url, headers, params, query);
EXPECT_EQ(RESPONSE_ERROR, resp.getStatus());
EXPECT_EQ("S3 server returned error, error code is 404", resp.getMessage());
}
/* Run './bin/dummyHTTPServer.py' before enabling this test */
TEST(S3RESTfulService, DISABLED_PostToDummyServer) {
HTTPHeaders headers;
map<string, string> params;
string url;
S3RESTfulService service;
string query = "abcdefghij";
url = "http://localhost:8553";
Response resp = service.post(url, headers, params, query);
EXPECT_EQ(RESPONSE_OK, resp.getStatus());
EXPECT_EQ(query, string(resp.getRawData().begin(), resp.getRawData().end()));
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册