MythTV  master
httpserver.h
Go to the documentation of this file.
1 // 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 COPYING for details
11 //
13 
14 #ifndef HTTPSERVER_H
15 #define HTTPSERVER_H
16 
17 // POSIX headers
18 #include <sys/types.h>
19 #ifndef _WIN32
20 #include <netinet/in.h>
21 #include <arpa/inet.h>
22 #endif
23 #include <utility>
24 
25 // Qt headers
26 #include <QReadWriteLock>
27 #include <QMultiMap>
28 #include <QRunnable>
29 #include <QPointer>
30 #include <QMutex>
31 #include <QList>
32 #include <QSslConfiguration>
33 #include <QSslError>
34 #include <QSslKey>
35 #include <QSslSocket>
36 
37 // MythTV headers
38 #include "serverpool.h"
39 #include "httprequest.h"
40 #include "mthreadpool.h"
41 #include "upnputil.h"
42 #include "compat.h"
43 
44 class HttpWorkerThread;
45 class QScriptEngine;
46 class HttpServer;
47 #ifndef QT_NO_OPENSSL
48 class QSslKey;
49 class QSslCertificate;
50 class QSslConfiguration;
51 #endif
52 
54 {
55  cpLocalNoAuth = 0x00, // Can only be accessed locally, but no authentication is required
56  cpLocalAuth = 0x01, // Can only be accessed locally, authentication is required
57  cpRemoteAuth = 0x02 // Can be accessed remotely, authentication is required
58 };
59 
62 //
63 // HttpServerExtension Class Definition
64 //
67 
68 class UPNP_PUBLIC HttpServerExtension : public QObject
69 {
70  Q_OBJECT
71 
72  public:
73 
74  QString m_sName;
75  QString m_sSharePath;
76  int m_nSocketTimeout; // Extension may wish to adjust the default e.g. UPnP
77 
78  uint m_nSupportedMethods; // Bit flags - HTTP::RequestType
79 
80  public:
81 
82  HttpServerExtension( QString sName, QString sSharePath)
83  : m_sName(std::move( sName )), m_sSharePath(std::move( sSharePath )),
84  m_nSocketTimeout(-1),
85  m_nSupportedMethods((RequestTypeGet | RequestTypePost | // Defaults, extensions may extend the list
87 
88  ~HttpServerExtension() override = default;
89 
90  virtual bool ProcessRequest(HTTPRequest *pRequest) = 0;
91 
92  virtual bool ProcessOptions(HTTPRequest *pRequest);
93 
94  virtual QStringList GetBasePaths() = 0;
95 
96  virtual int GetSocketTimeout() const { return m_nSocketTimeout; }// -1 = Use config value
97 };
98 
99 using HttpServerExtensionList = QList<QPointer<HttpServerExtension> >;
100 
103 //
104 // HttpServer Class Definition
105 //
108 
110 {
111  Q_OBJECT
112 
113  public:
114  HttpServer();
115  ~HttpServer() override;
116 
117  void RegisterExtension(HttpServerExtension *pExtension);
118  void UnregisterExtension(HttpServerExtension *pExtension);
119  void DelegateRequest(HTTPRequest *pRequest);
123  uint GetSocketTimeout(HTTPRequest *pRequest) const;
124 
125  QString GetSharePath(void) const
126  { // never modified after creation, so no need to lock
127  return m_sSharePath;
128  }
129 
130  bool IsRunning(void) const
131  {
132  m_rwlock.lockForRead();
133  bool tmp = m_running;
134  m_rwlock.unlock();
135  return tmp;
136  }
137 
138  static QString GetPlatform(void);
139  static QString GetServerVersion(void);
140 
141  protected:
142  mutable QReadWriteLock m_rwlock;
144  // This multimap does NOT take ownership of the HttpServerExtension*
145  QMultiMap< QString, HttpServerExtension* > m_basePaths;
146  QString m_sSharePath;
148  bool m_running { true }; // protected by m_rwlock
149 
150  static QMutex s_platformLock;
151  static QString s_platform;
152 
153 #ifndef QT_NO_OPENSSL
154  QSslConfiguration m_sslConfig;
155 #endif
156 
157  const QString m_privateToken; // Private token; Used to salt digest auth nonce, changes on backend restart
158 
159  protected slots:
160  void newTcpConnection(qintptr socket) override; // QTcpServer
161 
162  private:
163  void LoadSSLConfig();
164 };
165 
168 //
169 // HttpWorkerThread Class Definition
170 //
173 
174 class HttpWorker : public QRunnable
175 {
176  public:
177 
184  HttpWorker(HttpServer &httpServer, qintptr sock, PoolServerType type
185 #ifndef QT_NO_OPENSSL
186  , const QSslConfiguration& sslConfig
187 #endif
188  );
189 
190  void run(void) override; // QRunnable
191 
192  protected:
194  qintptr m_socket;
195  std::chrono::milliseconds m_socketTimeout;
197 
198 #ifndef QT_NO_OPENSSL
199  QSslConfiguration m_sslConfig;
200 #endif
201 };
202 
203 
204 #endif // HTTPSERVER_H
HttpServerExtension::m_nSupportedMethods
uint m_nSupportedMethods
Definition: httpserver.h:78
HTTPRequest
Definition: httprequest.h:108
HttpWorker
Definition: httpserver.h:174
HttpWorker::m_sslConfig
QSslConfiguration m_sslConfig
Definition: httpserver.h:199
HttpServer::IsRunning
bool IsRunning(void) const
Definition: httpserver.h:130
HttpServer::m_sSharePath
QString m_sSharePath
Definition: httpserver.h:146
ServerPool
Manages a collection of sockets listening on different ports.
Definition: serverpool.h:58
HttpServerExtension::GetSocketTimeout
virtual int GetSocketTimeout() const
Definition: httpserver.h:96
RequestTypePost
@ RequestTypePost
Definition: httprequest.h:49
RequestTypeOptions
@ RequestTypeOptions
Definition: httprequest.h:53
HttpWorker::run
void run(void) override
Definition: httpserver.cpp:465
HttpServer::s_platform
static QString s_platform
Definition: httpserver.h:151
HttpServer::m_privateToken
const QString m_privateToken
Definition: httpserver.h:157
HttpServerExtension::HttpServerExtension
HttpServerExtension(QString sName, QString sSharePath)
Definition: httpserver.h:82
HttpWorker::m_httpServer
HttpServer & m_httpServer
Definition: httpserver.h:193
tmp
static guint32 * tmp
Definition: goom_core.cpp:31
HttpServer::m_rwlock
QReadWriteLock m_rwlock
Definition: httpserver.h:142
compat.h
RequestTypeHead
@ RequestTypeHead
Definition: httprequest.h:48
HttpServer::m_threadPool
MThreadPool m_threadPool
Definition: httpserver.h:147
PoolServerType
PoolServerType
Definition: serverpool.h:28
HttpServerExtension::m_nSocketTimeout
int m_nSocketTimeout
Definition: httpserver.h:76
ServerPool::newTcpConnection
virtual void newTcpConnection(qintptr socket)
Definition: serverpool.cpp:672
HttpWorker::m_connectionType
PoolServerType m_connectionType
Definition: httpserver.h:196
uint
unsigned int uint
Definition: compat.h:140
ContentProtection
ContentProtection
Definition: httpserver.h:53
mthreadpool.h
HttpServer::GetSharePath
QString GetSharePath(void) const
Definition: httpserver.h:125
MThreadPool
Definition: mthreadpool.h:18
cpLocalAuth
@ cpLocalAuth
Definition: httpserver.h:56
cpLocalNoAuth
@ cpLocalNoAuth
Definition: httpserver.h:55
std
Definition: mythchrono.h:23
HttpServer::m_basePaths
QMultiMap< QString, HttpServerExtension * > m_basePaths
Definition: httpserver.h:145
HttpWorker::m_socket
qintptr m_socket
Definition: httpserver.h:194
serverpool.h
HttpServerExtensionList
QList< QPointer< HttpServerExtension > > HttpServerExtensionList
Definition: httpserver.h:99
HttpServer::m_sslConfig
QSslConfiguration m_sslConfig
Definition: httpserver.h:154
UPNP_PUBLIC
#define UPNP_PUBLIC
Definition: upnpexp.h:9
HttpServer
Definition: httpserver.h:109
cpRemoteAuth
@ cpRemoteAuth
Definition: httpserver.h:57
HttpServer::m_extensions
HttpServerExtensionList m_extensions
Definition: httpserver.h:143
HttpServer::s_platformLock
static QMutex s_platformLock
Definition: httpserver.h:150
HttpWorker::HttpWorker
HttpWorker(HttpServer &httpServer, qintptr sock, PoolServerType type, const QSslConfiguration &sslConfig)
Definition: httpserver.cpp:445
HttpServerExtension::m_sName
QString m_sName
Definition: httpserver.h:74
RequestTypeGet
@ RequestTypeGet
Definition: httprequest.h:47
HttpServerExtension
Definition: httpserver.h:68
HttpWorker::m_socketTimeout
std::chrono::milliseconds m_socketTimeout
Definition: httpserver.h:195
upnputil.h
httprequest.h
HttpServerExtension::m_sSharePath
QString m_sSharePath
Definition: httpserver.h:75