summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-16 17:52:18 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-16 17:52:18 +0900
commitb2f27e6548ec5f13a0f5776612cb512cb0d30d4e (patch)
tree122e2f32f2e899924d746e73bc442172fc1a7d8c
parente60181d1ad73ef2ca873d8d2ba0e13a932f0751a (diff)
Check !SocketRecvBuffer::bufferEmpty() in ctor.
Also treat !SocketRecvBuffer::bufferEmpty() as data is available.
-rw-r--r--src/HttpServer.h5
-rw-r--r--src/HttpServerBodyCommand.cc9
-rw-r--r--src/HttpServerCommand.cc14
-rw-r--r--src/HttpServerCommand.h2
4 files changed, 28 insertions, 2 deletions
diff --git a/src/HttpServer.h b/src/HttpServer.h
index 2845631a..cdd1e40e 100644
--- a/src/HttpServer.h
+++ b/src/HttpServer.h
@@ -116,6 +116,11 @@ public:
void disableGZip() { gzip_ = false; }
uint64_t getContentLength() const { return lastContentLength_; }
+
+ const SharedHandle<SocketRecvBuffer>& getSocketRecvBuffer() const
+ {
+ return socketRecvBuffer_;
+ }
};
} // namespace aria2
diff --git a/src/HttpServerBodyCommand.cc b/src/HttpServerBodyCommand.cc
index 6febd3a8..e49c253c 100644
--- a/src/HttpServerBodyCommand.cc
+++ b/src/HttpServerBodyCommand.cc
@@ -53,6 +53,7 @@
#include "wallclock.h"
#include "util.h"
#include "fmt.h"
+#include "SocketRecvBuffer.h"
namespace aria2 {
@@ -66,8 +67,12 @@ HttpServerBodyCommand::HttpServerBodyCommand
socket_(socket),
httpServer_(httpServer)
{
+ // To handle Content-Length == 0 case
setStatus(Command::STATUS_ONESHOT_REALTIME);
e_->addSocketForReadCheck(socket_, this);
+ if(!httpServer_->getSocketRecvBuffer()->bufferEmpty()) {
+ e_->setNoWait(true);
+ }
}
HttpServerBodyCommand::~HttpServerBodyCommand()
@@ -81,7 +86,9 @@ bool HttpServerBodyCommand::execute()
return true;
}
try {
- if(socket_->isReadable(0) || httpServer_->getContentLength() == 0) {
+ if(socket_->isReadable(0) ||
+ !httpServer_->getSocketRecvBuffer()->bufferEmpty() ||
+ httpServer_->getContentLength() == 0) {
timeoutTimer_ = global::wallclock;
if(httpServer_->receiveBody()) {
diff --git a/src/HttpServerCommand.cc b/src/HttpServerCommand.cc
index 28ecca16..92b465ac 100644
--- a/src/HttpServerCommand.cc
+++ b/src/HttpServerCommand.cc
@@ -49,6 +49,7 @@
#include "util.h"
#include "wallclock.h"
#include "fmt.h"
+#include "SocketRecvBuffer.h"
namespace aria2 {
@@ -70,6 +71,7 @@ HttpServerCommand::HttpServerCommand
#else // !HAVE_LIBZ
httpServer_->disableGZip();
#endif // !HAVE_LIBZ
+ checkSocketRecvBuffer();
}
HttpServerCommand::HttpServerCommand
@@ -83,6 +85,7 @@ HttpServerCommand::HttpServerCommand
httpServer_(httpServer)
{
e_->addSocketForReadCheck(socket_, this);
+ checkSocketRecvBuffer();
}
HttpServerCommand::~HttpServerCommand()
@@ -90,13 +93,22 @@ HttpServerCommand::~HttpServerCommand()
e_->deleteSocketForReadCheck(socket_, this);
}
+void HttpServerCommand::checkSocketRecvBuffer()
+{
+ if(!httpServer_->getSocketRecvBuffer()->bufferEmpty()) {
+ setStatus(Command::STATUS_ONESHOT_REALTIME);
+ e_->setNoWait(true);
+ }
+}
+
bool HttpServerCommand::execute()
{
if(e_->getRequestGroupMan()->downloadFinished() || e_->isHaltRequested()) {
return true;
}
try {
- if(socket_->isReadable(0)) {
+ if(socket_->isReadable(0) ||
+ !httpServer_->getSocketRecvBuffer()->bufferEmpty()) {
timeoutTimer_ = global::wallclock;
SharedHandle<HttpHeader> header;
diff --git a/src/HttpServerCommand.h b/src/HttpServerCommand.h
index 403bfd30..e54d5bbc 100644
--- a/src/HttpServerCommand.h
+++ b/src/HttpServerCommand.h
@@ -51,6 +51,8 @@ private:
SharedHandle<SocketCore> socket_;
SharedHandle<HttpServer> httpServer_;
Timer timeoutTimer_;
+
+ void checkSocketRecvBuffer();
public:
HttpServerCommand(cuid_t cuid, DownloadEngine* e,
const SharedHandle<SocketCore>& socket);