summaryrefslogtreecommitdiff
path: root/src/HttpServer.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-16 17:27:01 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-16 17:27:01 +0900
commit629099d40d1d6675772aa1082ff0b9b27e9c522c (patch)
treecb4c2fdd5daf83b9b0f004bccdb82fcb90e7f538 /src/HttpServer.cc
parentd030dd5a3f025434291558673cdad64ab3c9bbbc (diff)
Eliminated SocketCore::peekData() from HttpServer.
Diffstat (limited to 'src/HttpServer.cc')
-rw-r--r--src/HttpServer.cc55
1 files changed, 29 insertions, 26 deletions
diff --git a/src/HttpServer.cc b/src/HttpServer.cc
index fd8f9b6b..aee010d4 100644
--- a/src/HttpServer.cc
+++ b/src/HttpServer.cc
@@ -47,6 +47,7 @@
#include "Base64.h"
#include "a2functional.h"
#include "fmt.h"
+#include "SocketRecvBuffer.h"
namespace aria2 {
@@ -54,6 +55,7 @@ HttpServer::HttpServer
(const SharedHandle<SocketCore>& socket,
DownloadEngine* e)
: socket_(socket),
+ socketRecvBuffer_(new SocketRecvBuffer(socket_)),
socketBuffer_(socket),
e_(e),
headerProcessor_(new HttpHeaderProcessor()),
@@ -67,25 +69,21 @@ HttpServer::~HttpServer() {}
SharedHandle<HttpHeader> HttpServer::receiveRequest()
{
- size_t size = 512;
- unsigned char buf[size];
- socket_->peekData(buf, size);
- if(size == 0 && !(socket_->wantRead() || socket_->wantWrite())) {
- throw DL_ABORT_EX(EX_EOF_FROM_PEER);
- }
- headerProcessor_->update(buf, size);
- if(!headerProcessor_->eoh()) {
- socket_->readData(buf, size);
- return SharedHandle<HttpHeader>();
+ if(socketRecvBuffer_->bufferEmpty()) {
+ if(socketRecvBuffer_->recv() == 0 &&
+ !socket_->wantRead() && !socket_->wantWrite()) {
+ throw DL_ABORT_EX(EX_EOF_FROM_PEER);
+ }
}
- size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
- size -= putbackDataLength;
- socket_->readData(buf, size);
-
- SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
- if(header) {
+ headerProcessor_->update(socketRecvBuffer_->getBuffer(),
+ socketRecvBuffer_->getBufferLength());
+ if(headerProcessor_->eoh()) {
+ SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
+ size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
A2_LOG_INFO(fmt("HTTP Server received request\n%s",
headerProcessor_->getHeaderString().c_str()));
+ socketRecvBuffer_->shiftBuffer
+ (socketRecvBuffer_->getBufferLength()-putbackDataLength);
lastRequestHeader_ = header;
lastBody_.clear();
lastBody_.str("");
@@ -106,8 +104,11 @@ SharedHandle<HttpHeader> HttpServer::receiveRequest()
acceptsGZip_ =
std::find(acceptEncodings.begin(), acceptEncodings.end(), "gzip")
!= acceptEncodings.end();
+ return header;
+ } else {
+ socketRecvBuffer_->clearBuffer();
+ return SharedHandle<HttpHeader>();
}
- return header;
}
bool HttpServer::receiveBody()
@@ -115,16 +116,18 @@ bool HttpServer::receiveBody()
if(lastContentLength_ == 0) {
return true;
}
- const size_t BUFLEN = 4096;
- char buf[BUFLEN];
- size_t length = std::min(BUFLEN,
- static_cast<size_t>
- (lastContentLength_-lastBody_.tellg()));
- socket_->readData(buf, length);
- if(length == 0 && !(socket_->wantRead() || socket_->wantWrite())) {
- throw DL_ABORT_EX(EX_EOF_FROM_PEER);
+ if(socketRecvBuffer_->bufferEmpty()) {
+ if(socketRecvBuffer_->recv() == 0 &&
+ !socket_->wantRead() && !socket_->wantWrite()) {
+ throw DL_ABORT_EX(EX_EOF_FROM_PEER);
+ }
}
- lastBody_.write(buf, length);
+ size_t length =
+ std::min(socketRecvBuffer_->getBufferLength(),
+ static_cast<size_t>(lastContentLength_-lastBody_.tellg()));
+ lastBody_.write(reinterpret_cast<const char*>(socketRecvBuffer_->getBuffer()),
+ length);
+ socketRecvBuffer_->shiftBuffer(length);
return lastContentLength_ == static_cast<uint64_t>(lastBody_.tellp());
}