summaryrefslogtreecommitdiff
path: root/src/HttpServerBodyCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-09-30 00:50:14 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-09-30 00:50:14 +0900
commit90515dfa50c676df37f440893de6e344fbfd2cdc (patch)
tree257d86e0614b6eb0ea8e9384af3269d60a53dbbc /src/HttpServerBodyCommand.cc
parent4b94ede268ff2ff793b22a0730dcbda09d280618 (diff)
RPC over SSL/TLS transport
To enable RPC over SSL/TLS, specify server certificate and private key using --rpc-certificate and --rpc-private-key options and enable --rpc-secure option. After the encryption is enabled, use https and wss scheme to access RPC server.
Diffstat (limited to 'src/HttpServerBodyCommand.cc')
-rw-r--r--src/HttpServerBodyCommand.cc23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/HttpServerBodyCommand.cc b/src/HttpServerBodyCommand.cc
index d986ef4d..23230d00 100644
--- a/src/HttpServerBodyCommand.cc
+++ b/src/HttpServerBodyCommand.cc
@@ -74,7 +74,8 @@ HttpServerBodyCommand::HttpServerBodyCommand
: Command(cuid),
e_(e),
socket_(socket),
- httpServer_(httpServer)
+ httpServer_(httpServer),
+ writeCheck_(false)
{
// To handle Content-Length == 0 case
setStatus(Command::STATUS_ONESHOT_REALTIME);
@@ -87,6 +88,9 @@ HttpServerBodyCommand::HttpServerBodyCommand
HttpServerBodyCommand::~HttpServerBodyCommand()
{
e_->deleteSocketForReadCheck(socket_, this);
+ if(writeCheck_) {
+ e_->deleteSocketForWriteCheck(socket_, this);
+ }
}
namespace {
@@ -144,6 +148,19 @@ void HttpServerBodyCommand::addHttpServerResponseCommand()
e_->setNoWait(true);
}
+void HttpServerBodyCommand::updateWriteCheck()
+{
+ if(httpServer_->wantWrite()) {
+ if(!writeCheck_) {
+ writeCheck_ = true;
+ e_->addSocketForWriteCheck(socket_, this);
+ }
+ } else if(writeCheck_) {
+ writeCheck_ = false;
+ e_->deleteSocketForWriteCheck(socket_, this);
+ }
+}
+
bool HttpServerBodyCommand::execute()
{
if(e_->getRequestGroupMan()->downloadFinished() || e_->isHaltRequested()) {
@@ -151,6 +168,7 @@ bool HttpServerBodyCommand::execute()
}
try {
if(socket_->isReadable(0) ||
+ (writeCheck_ && socket_->isWritable(0)) ||
!httpServer_->getSocketRecvBuffer()->bufferEmpty() ||
httpServer_->getContentLength() == 0) {
timeoutTimer_ = global::wallclock();
@@ -290,9 +308,10 @@ bool HttpServerBodyCommand::execute()
return true;
}
} else {
+ updateWriteCheck();
e_->addCommand(this);
return false;
- }
+ }
} else {
if(timeoutTimer_.difference(global::wallclock()) >= 30) {
A2_LOG_INFO("HTTP request body timeout.");