From 90515dfa50c676df37f440893de6e344fbfd2cdc Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sun, 30 Sep 2012 00:50:14 +0900 Subject: 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. --- src/HttpServerCommand.cc | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'src/HttpServerCommand.cc') diff --git a/src/HttpServerCommand.cc b/src/HttpServerCommand.cc index ca0b9071..195b040b 100644 --- a/src/HttpServerCommand.cc +++ b/src/HttpServerCommand.cc @@ -64,14 +64,17 @@ namespace aria2 { HttpServerCommand::HttpServerCommand (cuid_t cuid, DownloadEngine* e, - const SharedHandle& socket) + const SharedHandle& socket, + bool secure) : Command(cuid), e_(e), socket_(socket), - httpServer_(new HttpServer(socket, e)) + httpServer_(new HttpServer(socket, e)), + writeCheck_(false) { setStatus(Command::STATUS_ONESHOT_REALTIME); e_->addSocketForReadCheck(socket_, this); + httpServer_->setSecure(secure); httpServer_->setUsernamePassword(e_->getOption()->get(PREF_RPC_USER), e_->getOption()->get(PREF_RPC_PASSWD)); if(e_->getOption()->getAsBool(PREF_RPC_ALLOW_ORIGIN_ALL)) { @@ -93,7 +96,8 @@ HttpServerCommand::HttpServerCommand : Command(cuid), e_(e), socket_(socket), - httpServer_(httpServer) + httpServer_(httpServer), + writeCheck_(false) { e_->addSocketForReadCheck(socket_, this); checkSocketRecvBuffer(); @@ -102,6 +106,9 @@ HttpServerCommand::HttpServerCommand HttpServerCommand::~HttpServerCommand() { e_->deleteSocketForReadCheck(socket_, this); + if(writeCheck_) { + e_->deleteSocketForWriteCheck(socket_, this); + } } void HttpServerCommand::checkSocketRecvBuffer() @@ -147,6 +154,19 @@ int websocketHandshake(const SharedHandle& header) #endif // ENABLE_WEBSOCKET +void HttpServerCommand::updateWriteCheck() +{ + if(httpServer_->wantWrite()) { + if(!writeCheck_) { + writeCheck_ = true; + e_->addSocketForWriteCheck(socket_, this); + } + } else if(writeCheck_) { + writeCheck_ = false; + e_->deleteSocketForWriteCheck(socket_, this); + } +} + bool HttpServerCommand::execute() { if(e_->getRequestGroupMan()->downloadFinished() || e_->isHaltRequested()) { @@ -154,13 +174,24 @@ bool HttpServerCommand::execute() } try { if(socket_->isReadable(0) || + (writeCheck_ && socket_->isWritable(0)) || !httpServer_->getSocketRecvBuffer()->bufferEmpty()) { timeoutTimer_ = global::wallclock(); - SharedHandle header; - header = httpServer_->receiveRequest(); + if(httpServer_->getSecure()) { + // tlsAccept() just returns true if handshake has already + // finished. + if(!socket_->tlsAccept()) { + updateWriteCheck(); + e_->addCommand(this); + return false; + } + } + SharedHandle header; + header = httpServer_->receiveRequest(); if(!header) { + updateWriteCheck(); e_->addCommand(this); return false; } -- cgit