8#include "httpconnectionhandlerpool.h"
9#include <QCoreApplication>
11using namespace stefanfrings;
13HttpListener::HttpListener(
const QSettings* settings,
HttpRequestHandler* requestHandler, QObject *parent)
16 Q_ASSERT(settings!=
nullptr);
17 Q_ASSERT(requestHandler!=
nullptr);
19 this->settings=settings;
20 this->requestHandler=requestHandler;
22 qRegisterMetaType<tSocketDescriptor>(
"tSocketDescriptor");
31 qDebug(
"HttpListener: destroyed");
41 QString host = settings->value(
"host").toString();
42 quint16 port=settings->value(
"port").toUInt() & 0xFFFF;
43 QTcpServer::listen(host.isEmpty() ? QHostAddress::Any : QHostAddress(host), port);
46 qCritical(
"HttpListener: Cannot bind on port %i: %s",port,qPrintable(errorString()));
49 qDebug(
"HttpListener: Listening on port %i",port);
56 qDebug(
"HttpListener: closed");
65 qDebug(
"HttpListener: New connection");
78 QMetaObject::invokeMethod(freeHandler,
"handleConnection", Qt::QueuedConnection, Q_ARG(
tSocketDescriptor, socketDescriptor));
83 qDebug(
"HttpListener: Too many incoming connections");
84 QTcpSocket* socket=
new QTcpSocket(
this);
85 socket->setSocketDescriptor(socketDescriptor);
86 connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
87 socket->write(
"HTTP/1.1 503 too many connections\r\nConnection: close\r\n\r\nToo many connections\r\n");
88 socket->disconnectFromHost();
Pool of http connection handlers.
HttpConnectionHandler * getConnectionHandler()
Get a free connection handler, or 0 if not available.
Alias for QSslConfiguration if OpenSSL is not supported.
void listen()
Restart listeing after close().
void close()
Closes the listener, waits until all pending requests are processed, then closes the connection pool.
void incomingConnection(tSocketDescriptor socketDescriptor)
Serves new incoming connection requests.
virtual ~HttpListener()
Destructor.
The request handler generates a response for each HTTP request.
qintptr tSocketDescriptor
Alias type definition, for compatibility to different Qt versions.