2017-08-23 16:47:07 +00:00
|
|
|
/**
|
|
|
|
@file
|
|
|
|
@author Stefan Frings
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef HTTPCONNECTIONHANDLER_H
|
|
|
|
#define HTTPCONNECTIONHANDLER_H
|
|
|
|
|
|
|
|
#ifndef QT_NO_OPENSSL
|
|
|
|
#include <QSslConfiguration>
|
|
|
|
#endif
|
|
|
|
#include <QTcpSocket>
|
|
|
|
#include <QSettings>
|
|
|
|
#include <QTimer>
|
|
|
|
#include <QThread>
|
|
|
|
#include "httpglobal.h"
|
|
|
|
#include "httprequest.h"
|
|
|
|
#include "httprequesthandler.h"
|
2017-11-13 12:46:02 +00:00
|
|
|
#include "httplistenersettings.h"
|
2017-08-23 16:47:07 +00:00
|
|
|
|
2018-03-20 12:49:21 +00:00
|
|
|
#include "export.h"
|
2018-03-03 19:23:38 +00:00
|
|
|
|
2017-11-11 08:32:15 +00:00
|
|
|
namespace qtwebapp {
|
2017-08-23 16:47:07 +00:00
|
|
|
|
|
|
|
/** Alias type definition, for compatibility to different Qt versions */
|
|
|
|
#if QT_VERSION >= 0x050000
|
|
|
|
typedef qintptr tSocketDescriptor;
|
|
|
|
#else
|
|
|
|
typedef int tSocketDescriptor;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/** Alias for QSslConfiguration if OpenSSL is not supported */
|
|
|
|
#ifdef QT_NO_OPENSSL
|
|
|
|
#define QSslConfiguration QObject
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
The connection handler accepts incoming connections and dispatches incoming requests to to a
|
|
|
|
request mapper. Since HTTP clients can send multiple requests before waiting for the response,
|
|
|
|
the incoming requests are queued and processed one after the other.
|
|
|
|
<p>
|
|
|
|
Example for the required configuration settings:
|
|
|
|
<code><pre>
|
|
|
|
readTimeout=60000
|
|
|
|
maxRequestSize=16000
|
|
|
|
maxMultiPartSize=1000000
|
|
|
|
</pre></code>
|
|
|
|
<p>
|
|
|
|
The readTimeout value defines the maximum time to wait for a complete HTTP request.
|
|
|
|
@see HttpRequest for description of config settings maxRequestSize and maxMultiPartSize.
|
|
|
|
*/
|
2018-03-03 19:23:38 +00:00
|
|
|
class HTTPSERVER_API HttpConnectionHandler : public QThread {
|
2017-08-23 16:47:07 +00:00
|
|
|
Q_OBJECT
|
|
|
|
Q_DISABLE_COPY(HttpConnectionHandler)
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
Constructor.
|
2017-11-13 12:46:02 +00:00
|
|
|
@param settings Configuration settings of the HTTP webserver as Qt settings
|
2017-08-23 16:47:07 +00:00
|
|
|
@param requestHandler Handler that will process each incoming HTTP request
|
|
|
|
@param sslConfiguration SSL (HTTPS) will be used if not NULL
|
|
|
|
*/
|
|
|
|
HttpConnectionHandler(QSettings* settings, HttpRequestHandler* requestHandler, QSslConfiguration* sslConfiguration=NULL);
|
2017-11-13 12:46:02 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
Constructor.
|
|
|
|
@param settings Configuration settings of the HTTP webserver as a structure
|
|
|
|
@param requestHandler Handler that will process each incoming HTTP request
|
|
|
|
@param sslConfiguration SSL (HTTPS) will be used if not NULL
|
|
|
|
*/
|
2017-11-18 09:15:29 +00:00
|
|
|
HttpConnectionHandler(const HttpListenerSettings* settings, HttpRequestHandler* requestHandler, QSslConfiguration* sslConfiguration=NULL);
|
2017-08-23 16:47:07 +00:00
|
|
|
|
|
|
|
/** Destructor */
|
|
|
|
virtual ~HttpConnectionHandler();
|
|
|
|
|
|
|
|
/** Returns true, if this handler is in use. */
|
|
|
|
bool isBusy();
|
|
|
|
|
|
|
|
/** Mark this handler as busy */
|
|
|
|
void setBusy();
|
|
|
|
|
2017-11-13 12:46:02 +00:00
|
|
|
/**
|
2017-11-18 09:15:29 +00:00
|
|
|
* Get a listener settings constant reference. Can be changed on the HttpListener only.
|
2017-11-13 12:46:02 +00:00
|
|
|
* @return The current listener settings
|
|
|
|
*/
|
2017-11-18 09:15:29 +00:00
|
|
|
const HttpListenerSettings *getListenerSettings() const { return listenerSettings; }
|
2017-11-13 12:46:02 +00:00
|
|
|
|
|
|
|
|
2017-08-23 16:47:07 +00:00
|
|
|
private:
|
|
|
|
|
|
|
|
/** Configuration settings */
|
|
|
|
QSettings* settings;
|
2017-11-13 12:46:02 +00:00
|
|
|
|
|
|
|
/** Configuration settings */
|
2017-11-18 09:15:29 +00:00
|
|
|
const HttpListenerSettings* listenerSettings;
|
2017-08-23 16:47:07 +00:00
|
|
|
|
|
|
|
/** TCP socket of the current connection */
|
|
|
|
QTcpSocket* socket;
|
|
|
|
|
|
|
|
/** Time for read timeout detection */
|
|
|
|
QTimer readTimer;
|
|
|
|
|
|
|
|
/** Storage for the current incoming HTTP request */
|
|
|
|
HttpRequest* currentRequest;
|
|
|
|
|
|
|
|
/** Dispatches received requests to services */
|
|
|
|
HttpRequestHandler* requestHandler;
|
|
|
|
|
|
|
|
/** This shows the busy-state from a very early time */
|
|
|
|
bool busy;
|
|
|
|
|
|
|
|
/** Configuration for SSL */
|
|
|
|
QSslConfiguration* sslConfiguration;
|
|
|
|
|
|
|
|
/** Executes the threads own event loop */
|
|
|
|
void run();
|
|
|
|
|
|
|
|
/** Create SSL or TCP socket */
|
|
|
|
void createSocket();
|
|
|
|
|
2017-11-13 00:36:00 +00:00
|
|
|
/** Settings flag */
|
|
|
|
bool useQtSettings;
|
|
|
|
|
2017-08-23 16:47:07 +00:00
|
|
|
public slots:
|
|
|
|
|
|
|
|
/**
|
|
|
|
Received from from the listener, when the handler shall start processing a new connection.
|
|
|
|
@param socketDescriptor references the accepted connection.
|
|
|
|
*/
|
|
|
|
void handleConnection(tSocketDescriptor socketDescriptor);
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
|
|
|
|
/** Received from the socket when a read-timeout occured */
|
|
|
|
void readTimeout();
|
|
|
|
|
|
|
|
/** Received from the socket when incoming data can be read */
|
|
|
|
void read();
|
|
|
|
|
|
|
|
/** Received from the socket when a connection has been closed */
|
|
|
|
void disconnected();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
} // end of namespace
|
|
|
|
|
|
|
|
#endif // HTTPCONNECTIONHANDLER_H
|