summaryrefslogtreecommitdiff
path: root/src/HttpServerCommand.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/HttpServerCommand.cc')
-rw-r--r--src/HttpServerCommand.cc41
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;
}