Eliminated SocketCore::peekData() from HttpServer.

pull/1/head
Tatsuhiro Tsujikawa 2011-01-16 17:27:01 +09:00
parent d030dd5a3f
commit 629099d40d
3 changed files with 36 additions and 26 deletions

View File

@ -47,6 +47,7 @@
#include "Base64.h" #include "Base64.h"
#include "a2functional.h" #include "a2functional.h"
#include "fmt.h" #include "fmt.h"
#include "SocketRecvBuffer.h"
namespace aria2 { namespace aria2 {
@ -54,6 +55,7 @@ HttpServer::HttpServer
(const SharedHandle<SocketCore>& socket, (const SharedHandle<SocketCore>& socket,
DownloadEngine* e) DownloadEngine* e)
: socket_(socket), : socket_(socket),
socketRecvBuffer_(new SocketRecvBuffer(socket_)),
socketBuffer_(socket), socketBuffer_(socket),
e_(e), e_(e),
headerProcessor_(new HttpHeaderProcessor()), headerProcessor_(new HttpHeaderProcessor()),
@ -67,25 +69,21 @@ HttpServer::~HttpServer() {}
SharedHandle<HttpHeader> HttpServer::receiveRequest() SharedHandle<HttpHeader> HttpServer::receiveRequest()
{ {
size_t size = 512; if(socketRecvBuffer_->bufferEmpty()) {
unsigned char buf[size]; if(socketRecvBuffer_->recv() == 0 &&
socket_->peekData(buf, size); !socket_->wantRead() && !socket_->wantWrite()) {
if(size == 0 && !(socket_->wantRead() || socket_->wantWrite())) { throw DL_ABORT_EX(EX_EOF_FROM_PEER);
throw DL_ABORT_EX(EX_EOF_FROM_PEER); }
} }
headerProcessor_->update(buf, size); headerProcessor_->update(socketRecvBuffer_->getBuffer(),
if(!headerProcessor_->eoh()) { socketRecvBuffer_->getBufferLength());
socket_->readData(buf, size); if(headerProcessor_->eoh()) {
return SharedHandle<HttpHeader>(); SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
} size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
size_t putbackDataLength = headerProcessor_->getPutBackDataLength();
size -= putbackDataLength;
socket_->readData(buf, size);
SharedHandle<HttpHeader> header = headerProcessor_->getHttpRequestHeader();
if(header) {
A2_LOG_INFO(fmt("HTTP Server received request\n%s", A2_LOG_INFO(fmt("HTTP Server received request\n%s",
headerProcessor_->getHeaderString().c_str())); headerProcessor_->getHeaderString().c_str()));
socketRecvBuffer_->shiftBuffer
(socketRecvBuffer_->getBufferLength()-putbackDataLength);
lastRequestHeader_ = header; lastRequestHeader_ = header;
lastBody_.clear(); lastBody_.clear();
lastBody_.str(""); lastBody_.str("");
@ -106,8 +104,11 @@ SharedHandle<HttpHeader> HttpServer::receiveRequest()
acceptsGZip_ = acceptsGZip_ =
std::find(acceptEncodings.begin(), acceptEncodings.end(), "gzip") std::find(acceptEncodings.begin(), acceptEncodings.end(), "gzip")
!= acceptEncodings.end(); != acceptEncodings.end();
return header;
} else {
socketRecvBuffer_->clearBuffer();
return SharedHandle<HttpHeader>();
} }
return header;
} }
bool HttpServer::receiveBody() bool HttpServer::receiveBody()
@ -115,16 +116,18 @@ bool HttpServer::receiveBody()
if(lastContentLength_ == 0) { if(lastContentLength_ == 0) {
return true; return true;
} }
const size_t BUFLEN = 4096; if(socketRecvBuffer_->bufferEmpty()) {
char buf[BUFLEN]; if(socketRecvBuffer_->recv() == 0 &&
size_t length = std::min(BUFLEN, !socket_->wantRead() && !socket_->wantWrite()) {
static_cast<size_t> throw DL_ABORT_EX(EX_EOF_FROM_PEER);
(lastContentLength_-lastBody_.tellg())); }
socket_->readData(buf, length);
if(length == 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()); return lastContentLength_ == static_cast<uint64_t>(lastBody_.tellp());
} }

View File

@ -50,10 +50,12 @@ class SocketCore;
class HttpHeader; class HttpHeader;
class HttpHeaderProcessor; class HttpHeaderProcessor;
class DownloadEngine; class DownloadEngine;
class SocketRecvBuffer;
class HttpServer { class HttpServer {
private: private:
SharedHandle<SocketCore> socket_; SharedHandle<SocketCore> socket_;
SharedHandle<SocketRecvBuffer> socketRecvBuffer_;
SocketBuffer socketBuffer_; SocketBuffer socketBuffer_;
DownloadEngine* e_; DownloadEngine* e_;
SharedHandle<HttpHeaderProcessor> headerProcessor_; SharedHandle<HttpHeaderProcessor> headerProcessor_;

View File

@ -54,6 +54,11 @@ public:
// Shifts buffer by offset bytes. offset must satisfy offset <= // Shifts buffer by offset bytes. offset must satisfy offset <=
// getBufferLength(). // getBufferLength().
void shiftBuffer(size_t offset); void shiftBuffer(size_t offset);
// Truncates the contents of buffer to 0.
void clearBuffer()
{
bufLen_ = 0;
}
const SharedHandle<SocketCore>& getSocket() const const SharedHandle<SocketCore>& getSocket() const
{ {