MythTV master
httpserver.h
Go to the documentation of this file.
1
2// Program Name: httpserver.h
3// Created : Oct. 1, 2005
4//
5// Purpose : HTTP 1.1 Mini Server Implmenetation
6// Used for UPnp/AV implementation & status information
7//
8// Copyright (c) 2005 David Blain <dblain@mythtv.org>
9//
10// Licensed under the GPL v2 or later, see LICENSE for details
11//
13
14#ifndef HTTPSERVER_H
15#define HTTPSERVER_H
16
17#include <QtGlobal>
18#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
19#include <QtSystemDetection>
20#endif
21// POSIX headers
22#include <sys/types.h>
23#ifndef Q_OS_WINDOWS
24#include <netinet/in.h>
25#include <arpa/inet.h>
26#endif
27#include <utility>
28
29// Qt headers
30#include <QReadWriteLock>
31#include <QMultiMap>
32#include <QRunnable>
33#include <QPointer>
34#include <QMutex>
35#include <QList>
36#include <QSslConfiguration>
37#include <QSslError>
38#include <QSslKey>
39#include <QSslSocket>
40
41// MythTV headers
42#include "libmythbase/compat.h"
45
46#include "httprequest.h"
47
48class HttpWorkerThread;
49class HttpServer;
50#ifndef QT_NO_OPENSSL
51class QSslKey;
52class QSslCertificate;
53class QSslConfiguration;
54#endif
55
56enum ContentProtection : std::uint8_t
57{
58 cpLocalNoAuth = 0x00, // Can only be accessed locally, but no authentication is required
59 cpLocalAuth = 0x01, // Can only be accessed locally, authentication is required
60 cpRemoteAuth = 0x02 // Can be accessed remotely, authentication is required
61};
62
65//
66// HttpServerExtension Class Definition
67//
70
71class UPNP_PUBLIC HttpServerExtension : public QObject
72{
73 Q_OBJECT
74
75 public:
76
77 QString m_sName;
78 QString m_sSharePath;
79 int m_nSocketTimeout { -1 }; // Extension may wish to adjust the default e.g. UPnP
80
81 // HTTP::RequestType. Defaults, extensions may extend the list
82 uint m_nSupportedMethods
85
86 public:
87
88 HttpServerExtension( QString sName, QString sSharePath)
89 : m_sName(std::move( sName )), m_sSharePath(std::move( sSharePath )) {};
90
91 ~HttpServerExtension() override = default;
92
93 virtual bool ProcessRequest(HTTPRequest *pRequest) = 0;
94
95 virtual bool ProcessOptions(HTTPRequest *pRequest);
96
97 virtual QStringList GetBasePaths() = 0;
98
99 virtual int GetSocketTimeout() const { return m_nSocketTimeout; }// -1 = Use config value
100};
101
102using HttpServerExtensionList = QList<QPointer<HttpServerExtension> >;
103
106//
107// HttpServer Class Definition
108//
111
113{
114 Q_OBJECT
115
116 public:
117 HttpServer();
118 ~HttpServer() override;
119
120 void RegisterExtension(HttpServerExtension *pExtension);
121 void UnregisterExtension(HttpServerExtension *pExtension);
122 void DelegateRequest(HTTPRequest *pRequest);
126 uint GetSocketTimeout(HTTPRequest *pRequest) const;
127
128 QString GetSharePath(void) const
129 { // never modified after creation, so no need to lock
130 return m_sSharePath;
131 }
132
133 bool IsRunning(void) const
134 {
135 m_rwlock.lockForRead();
136 bool tmp = m_running;
137 m_rwlock.unlock();
138 return tmp;
139 }
140
141 static QString GetPlatform(void);
142 static QString GetServerVersion(void);
143
144 protected:
145 mutable QReadWriteLock m_rwlock;
147 // This multimap does NOT take ownership of the HttpServerExtension*
148 QMultiMap< QString, HttpServerExtension* > m_basePaths;
151 bool m_running { true }; // protected by m_rwlock
152
153 static QMutex s_platformLock;
154 static QString s_platform;
155
156#ifndef QT_NO_OPENSSL
157 QSslConfiguration m_sslConfig;
158#endif
159
160 const QString m_privateToken; // Private token; Used to salt digest auth nonce, changes on backend restart
161
162 protected slots:
163 void newTcpConnection(qintptr socket) override; // QTcpServer
164
165 private:
166 void LoadSSLConfig();
167};
168
171//
172// HttpWorkerThread Class Definition
173//
176
177class HttpWorker : public QRunnable
178{
179 public:
180
187 HttpWorker(HttpServer &httpServer, qintptr sock, PoolServerType type
188#ifndef QT_NO_OPENSSL
189 , const QSslConfiguration& sslConfig
190#endif
191 );
192
193 void run(void) override; // QRunnable
194
195 protected:
197 qintptr m_socket;
198 std::chrono::milliseconds m_socketTimeout;
200
201#ifndef QT_NO_OPENSSL
202 QSslConfiguration m_sslConfig;
203#endif
204};
205
206
207#endif // HTTPSERVER_H
~HttpServerExtension() override=default
HttpServerExtension(QString sName, QString sSharePath)
Definition: httpserver.h:88
virtual int GetSocketTimeout() const
Definition: httpserver.h:99
virtual QStringList GetBasePaths()=0
virtual bool ProcessRequest(HTTPRequest *pRequest)=0
QString m_sSharePath
Definition: httpserver.h:78
QMultiMap< QString, HttpServerExtension * > m_basePaths
Definition: httpserver.h:148
QString m_sSharePath
Definition: httpserver.h:149
static QMutex s_platformLock
Definition: httpserver.h:153
MThreadPool m_threadPool
Definition: httpserver.h:150
QReadWriteLock m_rwlock
Definition: httpserver.h:145
bool IsRunning(void) const
Definition: httpserver.h:133
HttpServerExtensionList m_extensions
Definition: httpserver.h:146
static QString s_platform
Definition: httpserver.h:154
QString GetSharePath(void) const
Definition: httpserver.h:128
QSslConfiguration m_sslConfig
Definition: httpserver.h:157
const QString m_privateToken
Definition: httpserver.h:160
HttpWorker(HttpServer &httpServer, qintptr sock, PoolServerType type, const QSslConfiguration &sslConfig)
Definition: httpserver.cpp:440
HttpServer & m_httpServer
Definition: httpserver.h:196
PoolServerType m_connectionType
Definition: httpserver.h:199
qintptr m_socket
Definition: httpserver.h:197
std::chrono::milliseconds m_socketTimeout
Definition: httpserver.h:198
void run(void) override
Definition: httpserver.cpp:460
QSslConfiguration m_sslConfig
Definition: httpserver.h:202
Manages a collection of sockets listening on different ports.
Definition: serverpool.h:60
unsigned int uint
Definition: compat.h:60
static uint32_t * tmp
Definition: goom_core.cpp:28
@ RequestTypePost
Definition: httprequest.h:51
@ RequestTypeOptions
Definition: httprequest.h:55
@ RequestTypeGet
Definition: httprequest.h:49
@ RequestTypeHead
Definition: httprequest.h:50
QList< QPointer< HttpServerExtension > > HttpServerExtensionList
Definition: httpserver.h:102
ContentProtection
Definition: httpserver.h:57
@ cpLocalNoAuth
Definition: httpserver.h:58
@ cpLocalAuth
Definition: httpserver.h:59
@ cpRemoteAuth
Definition: httpserver.h:60
STL namespace.
PoolServerType
Definition: serverpool.h:30
#define UPNP_PUBLIC
Definition: upnpexp.h:9