From 260966915a7a03f610ee7f1558681ffe57eba16b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 24 Apr 2014 14:06:24 -0700 Subject: [PATCH] add HTTPS versions of webserver classes --- domain-server/src/DomainServer.cpp | 6 ++- domain-server/src/DomainServer.h | 4 +- .../embedded-webserver/src/HTTPConnection.cpp | 4 +- .../embedded-webserver/src/HTTPConnection.h | 4 +- .../embedded-webserver/src/HTTPManager.cpp | 12 +++--- .../embedded-webserver/src/HTTPManager.h | 4 +- .../src/HTTPSConnection.cpp | 23 ++++++++++++ .../embedded-webserver/src/HTTPSConnection.h | 26 +++++++++++++ .../embedded-webserver/src/HTTPSManager.cpp | 34 +++++++++++++++++ .../embedded-webserver/src/HTTPSManager.h | 37 +++++++++++++++++++ 10 files changed, 139 insertions(+), 15 deletions(-) create mode 100644 libraries/embedded-webserver/src/HTTPSConnection.cpp create mode 100644 libraries/embedded-webserver/src/HTTPSConnection.h create mode 100644 libraries/embedded-webserver/src/HTTPSManager.cpp create mode 100644 libraries/embedded-webserver/src/HTTPSManager.h diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index e65f3968e0..f169cd26d0 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -31,11 +31,13 @@ #include "DomainServer.h" -const quint16 DOMAIN_SERVER_HTTP_PORT = 8080; +const quint16 DOMAIN_SERVER_HTTP_PORT = 40100; +const quint16 DOMAIN_SERVER_HTTPS_PORT = 40101; DomainServer::DomainServer(int argc, char* argv[]) : QCoreApplication(argc, argv), - _HTTPManager(DOMAIN_SERVER_HTTP_PORT, QString("%1/resources/web/").arg(QCoreApplication::applicationDirPath()), this), + _httpManager(DOMAIN_SERVER_HTTP_PORT, QString("%1/resources/web/").arg(QCoreApplication::applicationDirPath()), this), + _httpsManager(NULL), _staticAssignmentHash(), _assignmentQueue(), _isUsingDTLS(false), diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 1bc9b71064..52aee24682 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -24,6 +24,7 @@ #include #include +#include #include #include "DTLSServerSession.h" @@ -79,7 +80,8 @@ private: QJsonObject jsonForSocket(const HifiSockAddr& socket); QJsonObject jsonObjectForNode(const SharedNodePointer& node); - HTTPManager _HTTPManager; + HTTPManager _httpManager; + HTTPSManager* _httpsManager; QHash _staticAssignmentHash; QQueue _assignmentQueue; diff --git a/libraries/embedded-webserver/src/HTTPConnection.cpp b/libraries/embedded-webserver/src/HTTPConnection.cpp index 276b4e7f64..f8fcc097f2 100755 --- a/libraries/embedded-webserver/src/HTTPConnection.cpp +++ b/libraries/embedded-webserver/src/HTTPConnection.cpp @@ -28,8 +28,8 @@ HTTPConnection::HTTPConnection (QTcpSocket* socket, HTTPManager* parentManager) _parentManager(parentManager), _socket(socket), _stream(socket), - _address(socket->peerAddress()) { - + _address(socket->peerAddress()) +{ // take over ownership of the socket _socket->setParent(this); diff --git a/libraries/embedded-webserver/src/HTTPConnection.h b/libraries/embedded-webserver/src/HTTPConnection.h index a131a22a9e..d5214ee3a8 100644 --- a/libraries/embedded-webserver/src/HTTPConnection.h +++ b/libraries/embedded-webserver/src/HTTPConnection.h @@ -18,10 +18,10 @@ #include #include -#include +#include #include #include -#include +#include #include #include #include diff --git a/libraries/embedded-webserver/src/HTTPManager.cpp b/libraries/embedded-webserver/src/HTTPManager.cpp index 1fc859014a..ff4ea9e6b4 100755 --- a/libraries/embedded-webserver/src/HTTPManager.cpp +++ b/libraries/embedded-webserver/src/HTTPManager.cpp @@ -138,14 +138,14 @@ HTTPManager::HTTPManager(quint16 port, const QString& documentRoot, HTTPRequestH qDebug() << "Failed to open HTTP server socket:" << errorString(); return; } - - // connect the connection signal - connect(this, SIGNAL(newConnection()), SLOT(acceptConnections())); } -void HTTPManager::acceptConnections() { - QTcpSocket* socket; - while ((socket = nextPendingConnection()) != 0) { +void HTTPManager::incomingConnection(qintptr socketDescriptor) { + QTcpSocket* socket = new QTcpSocket(this); + + if (socket->setSocketDescriptor(socketDescriptor)) { new HTTPConnection(socket, this); + } else { + delete socket; } } diff --git a/libraries/embedded-webserver/src/HTTPManager.h b/libraries/embedded-webserver/src/HTTPManager.h index 1e3afca1b5..ea2936f464 100755 --- a/libraries/embedded-webserver/src/HTTPManager.h +++ b/libraries/embedded-webserver/src/HTTPManager.h @@ -35,9 +35,9 @@ public: bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url); -protected slots: +protected: /// Accepts all pending connections - void acceptConnections(); + virtual void incomingConnection(qintptr socketDescriptor); protected: QString _documentRoot; HTTPRequestHandler* _requestHandler; diff --git a/libraries/embedded-webserver/src/HTTPSConnection.cpp b/libraries/embedded-webserver/src/HTTPSConnection.cpp new file mode 100644 index 0000000000..00f95fb0b5 --- /dev/null +++ b/libraries/embedded-webserver/src/HTTPSConnection.cpp @@ -0,0 +1,23 @@ +// +// HTTPSConnection.cpp +// libraries/embedded-webserver/src +// +// Created by Stephen Birarda on 2014-04-24. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "HTTPSConnection.h" + +HTTPSConnection::HTTPSConnection(QSslSocket* sslSocket, HTTPSManager* parentManager) : + HTTPConnection(sslSocket, parentManager) +{ + connect(sslSocket, SIGNAL(sslErrors(const QList&)), this, SLOT(sslErrors(const QList&))); + sslSocket->startServerEncryption(); +} + +void HTTPSConnection::handleSSLErrors(const QList& errors) { + qDebug() << "SSL errors:" << errors; +} \ No newline at end of file diff --git a/libraries/embedded-webserver/src/HTTPSConnection.h b/libraries/embedded-webserver/src/HTTPSConnection.h new file mode 100644 index 0000000000..7b53dc0063 --- /dev/null +++ b/libraries/embedded-webserver/src/HTTPSConnection.h @@ -0,0 +1,26 @@ +// +// HTTPSConnection.h +// libraries/embedded-webserver/src +// +// Created by Stephen Birarda on 2014-04-24. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HTTPSConnection_h +#define hifi_HTTPSConnection_h + +#include "HTTPConnection.h" +#include "HTTPSManager.h" + +class HTTPSConnection : public HTTPConnection { + Q_OBJECT +public: + HTTPSConnection(QSslSocket* sslSocket, HTTPSManager* parentManager); +protected slots: + void handleSSLErrors(const QList& errors); +}; + +#endif // hifi_HTTPSConnection_h \ No newline at end of file diff --git a/libraries/embedded-webserver/src/HTTPSManager.cpp b/libraries/embedded-webserver/src/HTTPSManager.cpp new file mode 100644 index 0000000000..ed988a6e65 --- /dev/null +++ b/libraries/embedded-webserver/src/HTTPSManager.cpp @@ -0,0 +1,34 @@ +// +// HTTPSManager.cpp +// libraries/embedded-webserver/src +// +// Created by Stephen Birarda on 2014-04-24. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include + +#include "HTTPSConnection.h" + +#include "HTTPSManager.h" + +HTTPSManager::HTTPSManager(quint16 port, const QString& documentRoot, HTTPRequestHandler* requestHandler, QObject* parent) : + HTTPManager(port, documentRoot, requestHandler, parent), + _certificate(), + _privateKey() +{ + +} + +void HTTPSManager::incomingConnection(qintptr socketDescriptor) { + QSslSocket* sslSocket = new QSslSocket(this); + + if (sslSocket->setSocketDescriptor(socketDescriptor)) { + new HTTPSConnection(sslSocket, this); + } else { + delete sslSocket; + } +} \ No newline at end of file diff --git a/libraries/embedded-webserver/src/HTTPSManager.h b/libraries/embedded-webserver/src/HTTPSManager.h new file mode 100644 index 0000000000..e0210c9ee9 --- /dev/null +++ b/libraries/embedded-webserver/src/HTTPSManager.h @@ -0,0 +1,37 @@ +// +// HTTPSManager.h +// libraries/embedded-webserver/src +// +// Created by Stephen Birarda on 2014-04-24. +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#ifndef hifi_HTTPSManager_h +#define hifi_HTTPSManager_h + +#include +#include + +#include "HTTPManager.h" + +class HTTPSManager : public HTTPManager { + Q_OBJECT +public: + HTTPSManager(quint16 port, + const QString& documentRoot, + HTTPRequestHandler* requestHandler = NULL, QObject* parent = 0); + + void setCertificate(const QSslCertificate& certificate) { _certificate = certificate; } + void setPrivateKey(const QSslKey& privateKey) { _privateKey = privateKey; } + +protected: + virtual void incomingConnection(qintptr socketDescriptor); +private: + QSslCertificate _certificate; + QSslKey _privateKey; +}; + +#endif // hifi_HTTPSManager_h \ No newline at end of file