diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-01-16 16:55:41 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2011-01-16 16:55:41 +0900 |
| commit | ea1b4b3ee533146763245ecbbb4a31e3ed791498 (patch) | |
| tree | 5dfda14ff291403bcee9b24380c1e47673b8a98b /src/AbstractCommand.cc | |
| parent | 602a9d6ba3f8ee38c25448796ad51992f971da8c (diff) | |
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.
Diffstat (limited to 'src/AbstractCommand.cc')
| -rw-r--r-- | src/AbstractCommand.cc | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc index 8c928274..5a15e86a 100644 --- a/src/AbstractCommand.cc +++ b/src/AbstractCommand.cc @@ -66,6 +66,7 @@ #include "uri.h" #include "FileEntry.h" #include "error_code.h" +#include "SocketRecvBuffer.h" #ifdef ENABLE_ASYNC_DNS #include "AsyncNameResolver.h" #endif // ENABLE_ASYNC_DNS @@ -75,20 +76,23 @@ namespace aria2 { -AbstractCommand::AbstractCommand(cuid_t cuid, - const SharedHandle<Request>& req, - const SharedHandle<FileEntry>& fileEntry, - RequestGroup* requestGroup, - DownloadEngine* e, - const SocketHandle& s, - bool incNumConnection): - Command(cuid), checkPoint_(global::wallclock), - timeout_(requestGroup->getTimeout()), - requestGroup_(requestGroup), - req_(req), fileEntry_(fileEntry), e_(e), socket_(s), - checkSocketIsReadable_(false), checkSocketIsWritable_(false), - nameResolverCheck_(false), - incNumConnection_(incNumConnection) +AbstractCommand::AbstractCommand +(cuid_t cuid, + const SharedHandle<Request>& req, + const SharedHandle<FileEntry>& fileEntry, + RequestGroup* requestGroup, + DownloadEngine* e, + const SocketHandle& s, + const SharedHandle<SocketRecvBuffer>& socketRecvBuffer, + bool incNumConnection) + : Command(cuid), checkPoint_(global::wallclock), + timeout_(requestGroup->getTimeout()), + requestGroup_(requestGroup), + req_(req), fileEntry_(fileEntry), e_(e), socket_(s), + socketRecvBuffer_(socketRecvBuffer), + checkSocketIsReadable_(false), checkSocketIsWritable_(false), + nameResolverCheck_(false), + incNumConnection_(incNumConnection) { if(socket_ && socket_->isOpen()) { setReadCheckSocket(socket_); @@ -169,7 +173,9 @@ bool AbstractCommand::execute() { } } } - if((checkSocketIsReadable_ && readEventEnabled()) || + if((checkSocketIsReadable_ && + (readEventEnabled() || + (socketRecvBuffer_ && !socketRecvBuffer_->bufferEmpty()))) || (checkSocketIsWritable_ && writeEventEnabled()) || hupEventEnabled() || #ifdef ENABLE_ASYNC_DNS @@ -846,4 +852,12 @@ const SharedHandle<PieceStorage>& AbstractCommand::getPieceStorage() const return requestGroup_->getPieceStorage(); } +void AbstractCommand::checkSocketRecvBuffer() +{ + if(!socketRecvBuffer_->bufferEmpty()) { + setStatus(Command::STATUS_ONESHOT_REALTIME); + e_->setNoWait(true); + } +} + } // namespace aria2 |
