[Box Backup-commit] COMMIT r2441 - box/trunk/test/httpserver
boxbackup-dev at boxbackup.org
boxbackup-dev at boxbackup.org
Mon Jan 5 00:50:31 GMT 2009
Author: chris
Date: 2009-01-05 00:50:30 +0000 (Mon, 05 Jan 2009)
New Revision: 2441
Modified:
box/trunk/test/httpserver/testhttpserver.cpp
Log:
Add support for HTTP PUT requests (uploads) in S3 simulator.
Modified: box/trunk/test/httpserver/testhttpserver.cpp
===================================================================
--- box/trunk/test/httpserver/testhttpserver.cpp 2009-01-05 00:49:34 UTC (rev 2440)
+++ box/trunk/test/httpserver/testhttpserver.cpp 2009-01-05 00:50:30 UTC (rev 2441)
@@ -27,12 +27,12 @@
TestWebServer();
~TestWebServer();
- virtual void Handle(const HTTPRequest &rRequest, HTTPResponse &rResponse);
+ virtual void Handle(HTTPRequest &rRequest, HTTPResponse &rResponse);
};
// Build a nice HTML response, so this can also be tested neatly in a browser
-void TestWebServer::Handle(const HTTPRequest &rRequest, HTTPResponse &rResponse)
+void TestWebServer::Handle(HTTPRequest &rRequest, HTTPResponse &rResponse)
{
// Test redirection mechanism
if(rRequest.GetRequestURI() == "/redirect")
@@ -119,22 +119,50 @@
S3Simulator() { }
~S3Simulator() { }
- virtual void Handle(const HTTPRequest &rRequest,
- HTTPResponse &rResponse);
+ virtual void Handle(HTTPRequest &rRequest, HTTPResponse &rResponse);
+ virtual void HandleGet(HTTPRequest &rRequest, HTTPResponse &rResponse);
+ virtual void HandlePut(HTTPRequest &rRequest, HTTPResponse &rResponse);
};
-void S3Simulator::Handle(const HTTPRequest &rRequest, HTTPResponse &rResponse)
+void S3Simulator::Handle(HTTPRequest &rRequest, HTTPResponse &rResponse)
{
// if anything goes wrong, return a 500 error
rResponse.SetResponseCode(HTTPResponse::Code_InternalServerError);
rResponse.SetContentType("text/plain");
- if (rRequest.GetMethod() != HTTPRequest::Method_GET)
+ try
+ {
+ if (rRequest.GetMethod() == HTTPRequest::Method_GET)
+ {
+ HandleGet(rRequest, rResponse);
+ }
+ else if (rRequest.GetMethod() == HTTPRequest::Method_PUT)
+ {
+ HandlePut(rRequest, rResponse);
+ }
+ else
+ {
+ rResponse.SetResponseCode(HTTPResponse::Code_MethodNotAllowed);
+ }
+ }
+ catch (CommonException &ce)
{
- rResponse.SetResponseCode(HTTPResponse::Code_MethodNotAllowed);
- return;
+ rResponse.IOStream::Write(ce.what());
}
+ catch (std::exception &e)
+ {
+ rResponse.IOStream::Write(e.what());
+ }
+ catch (...)
+ {
+ rResponse.IOStream::Write("Unknown error");
+ }
+
+ return;
+}
+void S3Simulator::HandleGet(HTTPRequest &rRequest, HTTPResponse &rResponse)
+{
std::string path = "testfiles";
path += rRequest.GetRequestURI();
std::auto_ptr<FileStream> apFile;
@@ -153,32 +181,57 @@
{
rResponse.SetResponseCode(HTTPResponse::Code_Forbidden);
}
- else
- {
- rResponse.SetResponseCode(HTTPResponse::Code_InternalServerError);
- }
- rResponse.IOStream::Write(ce.what());
- return;
+ throw;
}
- catch (std::exception &e)
+
+ // http://docs.amazonwebservices.com/AmazonS3/2006-03-01/UsingRESTOperations.html
+ apFile->CopyStreamTo(rResponse);
+ rResponse.AddHeader("x-amz-id-2", "qBmKRcEWBBhH6XAqsKU/eg24V3jf/kWKN9dJip1L/FpbYr9FDy7wWFurfdQOEMcY");
+ rResponse.AddHeader("x-amz-request-id", "F2A8CCCA26B4B26D");
+ rResponse.AddHeader("Date", "Wed, 01 Mar 2006 12:00:00 GMT");
+ rResponse.AddHeader("Last-Modified", "Sun, 1 Jan 2006 12:00:00 GMT");
+ rResponse.AddHeader("ETag", "\"828ef3fdfa96f00ad9f27c383fc9ac7f\"");
+ rResponse.AddHeader("Server", "AmazonS3");
+ rResponse.SetResponseCode(HTTPResponse::Code_OK);
+}
+
+void S3Simulator::HandlePut(HTTPRequest &rRequest, HTTPResponse &rResponse)
+{
+ std::string path = "testfiles";
+ path += rRequest.GetRequestURI();
+ std::auto_ptr<FileStream> apFile;
+
+ try
{
- rResponse.IOStream::Write(e.what());
- return;
+ apFile.reset(new FileStream(path, O_CREAT | O_WRONLY));
}
- catch (...)
+ catch (CommonException &ce)
{
- rResponse.IOStream::Write("Unknown error");
- return;
+ if (ce.GetSubType() == CommonException::OSFileOpenError)
+ {
+ rResponse.SetResponseCode(HTTPResponse::Code_NotFound);
+ }
+ else if (ce.GetSubType() == CommonException::AccessDenied)
+ {
+ rResponse.SetResponseCode(HTTPResponse::Code_Forbidden);
+ }
+ throw;
}
- // http://docs.amazonwebservices.com/AmazonS3/2006-03-01/UsingRESTOperations.html
- apFile->CopyStreamTo(rResponse);
- rResponse.AddHeader("x-amz-id-2", "qBmKRcEWBBhH6XAqsKU/eg24V3jf/kWKN9dJip1L/FpbYr9FDy7wWFurfdQOEMcY");
+ if (rRequest.IsExpectingContinue())
+ {
+ rResponse.SendContinue();
+ }
+
+ rRequest.ReadContent(*apFile);
+
+ // http://docs.amazonwebservices.com/AmazonS3/2006-03-01/RESTObjectPUT.html
+ rResponse.AddHeader("x-amz-id-2", "LriYPLdmOdAiIfgSm/F1YsViT1LW94/xUQxMsF7xiEb1a0wiIOIxl+zbwZ163pt7");
rResponse.AddHeader("x-amz-request-id", "F2A8CCCA26B4B26D");
rResponse.AddHeader("Date", "Wed, 01 Mar 2006 12:00:00 GMT");
rResponse.AddHeader("Last-Modified", "Sun, 1 Jan 2006 12:00:00 GMT");
rResponse.AddHeader("ETag", "\"828ef3fdfa96f00ad9f27c383fc9ac7f\"");
- rResponse.SetContentType("text/plain");
+ rResponse.SetContentType("");
rResponse.AddHeader("Server", "AmazonS3");
rResponse.SetResponseCode(HTTPResponse::Code_OK);
}
@@ -363,6 +416,34 @@
TEST_THAT(file.CompareWith(response));
}
+ {
+ HTTPRequest request(HTTPRequest::Method_PUT,
+ "/newfile");
+ request.SetHostName("quotes.s3.amazonaws.com");
+ request.AddHeader("Date", "Wed, 01 Mar 2006 12:00:00 GMT");
+ request.AddHeader("Authorization", "AWS 15B4D3461F177624206A:xQE0diMbLRepdf3YB+FIEXAMPLE=");
+ request.AddHeader("Content-Type", "text/plain");
+ FileStream fs("testfiles/testrequests.pl");
+ HTTPResponse response;
+ request.SendWithStream(sock,
+ IOStream::TimeOutInfinite /* or 10000 milliseconds */,
+ &fs, response);
+ std::string value;
+ TEST_EQUAL(200, response.GetResponseCode());
+ TEST_EQUAL("LriYPLdmOdAiIfgSm/F1YsViT1LW94/xUQxMsF7xiEb1a0wiIOIxl+zbwZ163pt7", response.GetHeaderValue("x-amz-id-2"));
+ TEST_EQUAL("F2A8CCCA26B4B26D", response.GetHeaderValue("x-amz-request-id"));
+ TEST_EQUAL("Wed, 01 Mar 2006 12:00:00 GMT", response.GetHeaderValue("Date"));
+ TEST_EQUAL("Sun, 1 Jan 2006 12:00:00 GMT", response.GetHeaderValue("Last-Modified"));
+ TEST_EQUAL("\"828ef3fdfa96f00ad9f27c383fc9ac7f\"", response.GetHeaderValue("ETag"));
+ TEST_EQUAL("", response.GetContentType());
+ TEST_EQUAL("AmazonS3", response.GetHeaderValue("Server"));
+ TEST_EQUAL(0, response.GetSize());
+
+ FileStream f1("testfiles/testrequests.pl");
+ FileStream f2("testfiles/newfile");
+ TEST_THAT(f1.CompareWith(f2));
+ }
+
// Kill it
TEST_THAT(KillServer(pid));
TestRemoteProcessMemLeaks("generic-httpserver.memleaks");
More information about the Boxbackup-commit
mailing list