// Copyright (C) 2019 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef QABSTRACTHTTPSERVER_H #define QABSTRACTHTTPSERVER_H #include #include #include #include #include #if QT_CONFIG(ssl) #include #endif #if defined(QT_WEBSOCKETS_LIB) #include #endif // defined(QT_WEBSOCKETS_LIB) #include #include QT_BEGIN_NAMESPACE class QHttpServerRequest; class QHttpServerResponder; class QLocalServer; class QTcpServer; class QAbstractHttpServerPrivate; class Q_HTTPSERVER_EXPORT QAbstractHttpServer : public QObject { Q_OBJECT friend class QHttpServerHttp1ProtocolHandler; friend class QHttpServerHttp2ProtocolHandler; public: explicit QAbstractHttpServer(QObject *parent = nullptr); ~QAbstractHttpServer() override; QList serverPorts() const; bool bind(QTcpServer *server); QList servers() const; #if QT_CONFIG(localserver) bool bind(QLocalServer *server); QList localServers() const; #endif #if QT_CONFIG(ssl) QHttp2Configuration http2Configuration() const; void setHttp2Configuration(const QHttp2Configuration &configuration); #endif void setConfiguration(const QHttpServerConfiguration &config); QHttpServerConfiguration configuration() const; #if defined(QT_WEBSOCKETS_LIB) Q_SIGNALS: void newWebSocketConnection(); private: using WebSocketUpgradeVerifierPrototype = QHttpServerWebSocketUpgradeResponse (*)(const QHttpServerRequest &request); template using if_compatible_callable = typename std::enable_if< QtPrivate::AreFunctionsCompatible::value, bool>::type; void addWebSocketUpgradeVerifierImpl(const QObject *context, QtPrivate::QSlotObjectBase *slotObjRaw); public: bool hasPendingWebSocketConnections() const; std::unique_ptr nextPendingWebSocketConnection(); #ifdef Q_QDOC template void addWebSocketUpgradeVerifier(const QObject *context, Handler &&func) #else template = true> void addWebSocketUpgradeVerifier( const typename QtPrivate::ContextTypeForFunctor::ContextType *context, Handler &&func) #endif { addWebSocketUpgradeVerifierImpl( context, QtPrivate::makeCallableObject( std::forward(func))); } private: QHttpServerWebSocketUpgradeResponse verifyWebSocketUpgrade(const QHttpServerRequest &request) const; #endif // defined(QT_WEBSOCKETS_LIB) protected: QAbstractHttpServer(QAbstractHttpServerPrivate &dd, QObject *parent = nullptr); virtual bool handleRequest(const QHttpServerRequest &request, QHttpServerResponder &responder) = 0; virtual void missingHandler(const QHttpServerRequest &request, QHttpServerResponder &responder) = 0; private: Q_DECLARE_PRIVATE(QAbstractHttpServer) }; QT_END_NAMESPACE #endif // QABSTRACTHTTPSERVER_H