HttpServer: Return bool for receiveHeader, use std::unique_ptr for headers

pull/103/head
Tatsuhiro Tsujikawa 2013-06-29 23:20:43 +09:00
parent 6a3e26a34d
commit d128a39fb6
4 changed files with 12 additions and 15 deletions

View File

@ -126,7 +126,7 @@ const char* getStatusString(int status)
}
} // namespace
std::shared_ptr<HttpHeader> HttpServer::receiveRequest()
bool HttpServer::receiveRequest()
{
if(socketRecvBuffer_->bufferEmpty()) {
if(socketRecvBuffer_->recv() == 0 &&
@ -134,14 +134,12 @@ std::shared_ptr<HttpHeader> HttpServer::receiveRequest()
throw DL_ABORT_EX(EX_EOF_FROM_PEER);
}
}
std::shared_ptr<HttpHeader> header;
if(headerProcessor_->parse(socketRecvBuffer_->getBuffer(),
socketRecvBuffer_->getBufferLength())) {
header = headerProcessor_->getResult();
lastRequestHeader_ = headerProcessor_->getResult();
A2_LOG_INFO(fmt("HTTP Server received request\n%s",
headerProcessor_->getHeaderString().c_str()));
socketRecvBuffer_->shiftBuffer(headerProcessor_->getLastBytesProcessed());
lastRequestHeader_ = header;
bodyConsumed_ = 0;
if(setupResponseRecv() < 0) {
A2_LOG_INFO("Request path is invaild. Ignore the request body.");
@ -172,10 +170,11 @@ std::shared_ptr<HttpHeader> HttpServer::receiveRequest()
break;
}
}
return true;
} else {
socketRecvBuffer_->shiftBuffer(headerProcessor_->getLastBytesProcessed());
return false;
}
return header;
}
bool HttpServer::receiveBody()

View File

@ -68,7 +68,7 @@ private:
std::shared_ptr<SocketRecvBuffer> socketRecvBuffer_;
SocketBuffer socketBuffer_;
std::unique_ptr<HttpHeaderProcessor> headerProcessor_;
std::shared_ptr<HttpHeader> lastRequestHeader_;
std::unique_ptr<HttpHeader> lastRequestHeader_;
int64_t lastContentLength_;
// How many bytes are consumed. The total number of bytes is
// lastContentLength_.
@ -87,7 +87,7 @@ public:
~HttpServer();
std::shared_ptr<HttpHeader> receiveRequest();
bool receiveRequest();
bool receiveBody();
@ -171,7 +171,7 @@ public:
return socket_;
}
const std::shared_ptr<HttpHeader>& getRequestHeader() const
const std::unique_ptr<HttpHeader>& getRequestHeader() const
{
return lastRequestHeader_;
}

View File

@ -183,8 +183,7 @@ bool HttpServerBodyCommand::execute()
if(httpServer_->getMethod() == "OPTIONS") {
// Response to Preflight Request.
// See http://www.w3.org/TR/cors/
const std::shared_ptr<HttpHeader>& header =
httpServer_->getRequestHeader();
auto& header = httpServer_->getRequestHeader();
std::string accessControlHeaders;
if(!header->find(HttpHeader::ORIGIN).empty() &&
!header->find(HttpHeader::ACCESS_CONTROL_REQUEST_METHOD).empty()

View File

@ -137,7 +137,7 @@ std::string createWebSocketServerKey(const std::string& clientKey)
} // namespace
namespace {
int websocketHandshake(const std::shared_ptr<HttpHeader>& header)
int websocketHandshake(const HttpHeader* header)
{
if(header->getMethod() != "GET" ||
header->find(HttpHeader::SEC_WEBSOCKET_KEY).empty()) {
@ -190,9 +190,7 @@ bool HttpServerCommand::execute()
}
#endif // ENABLE_SSL
std::shared_ptr<HttpHeader> header;
header = httpServer_->receiveRequest();
if(!header) {
if(!httpServer_->receiveRequest()) {
updateWriteCheck();
e_->addCommand(std::unique_ptr<Command>(this));
return false;
@ -209,10 +207,11 @@ bool HttpServerCommand::execute()
e_->setNoWait(true);
return true;
}
auto& header = httpServer_->getRequestHeader();
if(header->fieldContains(HttpHeader::UPGRADE, "websocket") &&
header->fieldContains(HttpHeader::CONNECTION, "upgrade")) {
#ifdef ENABLE_WEBSOCKET
int status = websocketHandshake(header);
int status = websocketHandshake(header.get());
if(status == 101) {
std::string serverKey =
createWebSocketServerKey