From ea1b4b3ee533146763245ecbbb4a31e3ed791498 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 16 Jan 2011 16:55:41 +0900 Subject: Eliminated SocketCore::peekData() form HTTP/FTP downloads. We introduced SocketRecvBuffer which buffers received bytes. Since HTTP response header and response body are divided with \r\n, we have to buffer up several bytes to find this delimiter. We use SocketRecvBuffer to hold these bytes and only consumes header and passes SocketRecvBuffer, which may contain head of response body, to next Command. Since FTPConnection doesn't use SocketCore::peekData(), we left it as is. --- src/HttpConnection.cc | 57 +++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 27 deletions(-) (limited to 'src/HttpConnection.cc') diff --git a/src/HttpConnection.cc b/src/HttpConnection.cc index effb4d27..9433d3bd 100644 --- a/src/HttpConnection.cc +++ b/src/HttpConnection.cc @@ -56,6 +56,7 @@ #include "AuthConfig.h" #include "a2functional.h" #include "fmt.h" +#include "SocketRecvBuffer.h" namespace aria2 { @@ -67,9 +68,13 @@ HttpRequestEntry::HttpRequestEntry HttpRequestEntry::~HttpRequestEntry() {} -HttpConnection::HttpConnection(cuid_t cuid, const SocketHandle& socket) +HttpConnection::HttpConnection +(cuid_t cuid, + const SocketHandle& socket, + const SharedHandle& socketRecvBuffer) : cuid_(cuid), socket_(socket), + socketRecvBuffer_(socketRecvBuffer), socketBuffer_(socket) {} @@ -126,36 +131,34 @@ SharedHandle HttpConnection::receiveResponse() } HttpRequestEntryHandle entry = outstandingHttpRequests_.front(); HttpHeaderProcessorHandle proc = entry->getHttpHeaderProcessor(); - - unsigned char buf[512]; - size_t size = sizeof(buf); - socket_->peekData(buf, size); - if(size == 0) { - if(socket_->wantRead() || socket_->wantWrite()) { - return SharedHandle(); - } else { + if(socketRecvBuffer_->bufferEmpty()) { + if(socketRecvBuffer_->recv() == 0 && + !socket_->wantRead() && !socket_->wantWrite()) { throw DL_RETRY_EX(EX_GOT_EOF); } } - proc->update(buf, size); - if(!proc->eoh()) { - socket_->readData(buf, size); - return SharedHandle(); + proc->update(socketRecvBuffer_->getBuffer(), + socketRecvBuffer_->getBufferLength()); + SharedHandle httpResponse; + size_t shiftBufferLength; + if(proc->eoh()) { + SharedHandle httpHeader = proc->getHttpResponseHeader(); + size_t putbackDataLength = proc->getPutBackDataLength(); + A2_LOG_INFO(fmt(MSG_RECEIVE_RESPONSE, + cuid_, + proc->getHeaderString().c_str())); + assert(socketRecvBuffer_->getBufferLength() >= putbackDataLength); + shiftBufferLength = + socketRecvBuffer_->getBufferLength()-putbackDataLength; + httpResponse.reset(new HttpResponse()); + httpResponse->setCuid(cuid_); + httpResponse->setHttpHeader(httpHeader); + httpResponse->setHttpRequest(entry->getHttpRequest()); + outstandingHttpRequests_.pop_front(); + } else { + shiftBufferLength = socketRecvBuffer_->getBufferLength(); } - size_t putbackDataLength = proc->getPutBackDataLength(); - size -= putbackDataLength; - socket_->readData(buf, size); - A2_LOG_INFO(fmt(MSG_RECEIVE_RESPONSE, - cuid_, - proc->getHeaderString().c_str())); - SharedHandle httpHeader = proc->getHttpResponseHeader(); - SharedHandle httpResponse(new HttpResponse()); - httpResponse->setCuid(cuid_); - httpResponse->setHttpHeader(httpHeader); - httpResponse->setHttpRequest(entry->getHttpRequest()); - - outstandingHttpRequests_.pop_front(); - + socketRecvBuffer_->shiftBuffer(shiftBufferLength); return httpResponse; } -- cgit