diff options
Diffstat (limited to 'src/HttpServerCommand.cc')
| -rw-r--r-- | src/HttpServerCommand.cc | 41 |
1 files changed, 36 insertions, 5 deletions
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<SocketCore>& socket) + const SharedHandle<SocketCore>& 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<HttpHeader>& 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<HttpHeader> 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<HttpHeader> header; + header = httpServer_->receiveRequest(); if(!header) { + updateWriteCheck(); e_->addCommand(this); return false; } |
