summaryrefslogtreecommitdiff
path: root/src/AbstractHttpServerResponseCommand.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/AbstractHttpServerResponseCommand.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/AbstractHttpServerResponseCommand.cc')
-rw-r--r--src/AbstractHttpServerResponseCommand.cc49
1 files changed, 41 insertions, 8 deletions
diff --git a/src/AbstractHttpServerResponseCommand.cc b/src/AbstractHttpServerResponseCommand.cc
index 7b89a254..5d9d8c11 100644
--- a/src/AbstractHttpServerResponseCommand.cc
+++ b/src/AbstractHttpServerResponseCommand.cc
@@ -55,15 +55,44 @@ AbstractHttpServerResponseCommand::AbstractHttpServerResponseCommand
: Command(cuid),
e_(e),
socket_(socket),
- httpServer_(httpServer)
+ httpServer_(httpServer),
+ readCheck_(false),
+ writeCheck_(true)
{
- setStatus(Command::STATUS_ONESHOT_REALTIME);
+ setStatus(Command::STATUS_ONESHOT_REALTIME);
e_->addSocketForWriteCheck(socket_, this);
}
AbstractHttpServerResponseCommand::~AbstractHttpServerResponseCommand()
{
- e_->deleteSocketForWriteCheck(socket_, this);
+ if(readCheck_) {
+ e_->deleteSocketForReadCheck(socket_, this);
+ }
+ if(writeCheck_) {
+ e_->deleteSocketForWriteCheck(socket_, this);
+ }
+}
+
+void AbstractHttpServerResponseCommand::updateReadWriteCheck()
+{
+ if(httpServer_->wantRead()) {
+ if(!readCheck_) {
+ readCheck_ = true;
+ e_->addSocketForReadCheck(socket_, this);
+ }
+ } else if(readCheck_) {
+ readCheck_ = false;
+ e_->deleteSocketForReadCheck(socket_, this);
+ }
+ if(httpServer_->wantWrite()) {
+ if(!writeCheck_) {
+ writeCheck_ = true;
+ e_->addSocketForWriteCheck(socket_, this);
+ }
+ } else if(writeCheck_) {
+ writeCheck_ = false;
+ e_->deleteSocketForWriteCheck(socket_, this);
+ }
}
bool AbstractHttpServerResponseCommand::execute()
@@ -72,26 +101,30 @@ bool AbstractHttpServerResponseCommand::execute()
return true;
}
try {
- httpServer_->sendResponse();
+ ssize_t len = httpServer_->sendResponse();
+ if(len > 0) {
+ timeoutTimer_ = global::wallclock();
+ }
} catch(RecoverableException& e) {
A2_LOG_INFO_EX
- (fmt("CUID#%" PRId64 " - Error occurred while transmitting response body.",
+ (fmt("CUID#%"PRId64" - Error occurred while transmitting response body.",
getCuid()),
e);
return true;
}
if(httpServer_->sendBufferIsEmpty()) {
- A2_LOG_INFO(fmt("CUID#%" PRId64 " - HttpServer: all response transmitted.",
+ A2_LOG_INFO(fmt("CUID#%"PRId64" - HttpServer: all response transmitted.",
getCuid()));
afterSend(httpServer_, e_);
return true;
} else {
- if(timeoutTimer_.difference(global::wallclock()) >= 10) {
- A2_LOG_INFO(fmt("CUID#%" PRId64 " - HttpServer: Timeout while trasmitting"
+ if(timeoutTimer_.difference(global::wallclock()) >= 30) {
+ A2_LOG_INFO(fmt("CUID#%"PRId64" - HttpServer: Timeout while trasmitting"
" response.",
getCuid()));
return true;
} else {
+ updateReadWriteCheck();
e_->addCommand(this);
return false;
}