forked from f4exb/sdrangel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhttplistener.cpp
109 lines (95 loc) · 3.11 KB
/
httplistener.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
@file
@author Stefan Frings
*/
#include "httplistener.h"
#include "httpconnectionhandler.h"
#include "httpconnectionhandlerpool.h"
#include <QCoreApplication>
using namespace qtwebapp;
HttpListener::HttpListener(QSettings* settings, HttpRequestHandler* requestHandler, QObject *parent)
: QTcpServer(parent), useQtSettings(true)
{
Q_ASSERT(settings != 0);
Q_ASSERT(requestHandler != 0);
pool = 0;
this->settings = settings;
this->requestHandler = requestHandler;
// Register type of socketDescriptor for signal/slot handling
qRegisterMetaType<tSocketDescriptor>("tSocketDescriptor");
// Start listening
listen();
}
HttpListener::HttpListener(const HttpListenerSettings& settings, HttpRequestHandler* requestHandler, QObject *parent)
: QTcpServer(parent), useQtSettings(false)
{
Q_ASSERT(requestHandler != 0);
pool = 0;
this->settings = 0;
listenerSettings = settings;
this->requestHandler = requestHandler;
// Register type of socketDescriptor for signal/slot handling
qRegisterMetaType<tSocketDescriptor>("tSocketDescriptor");
// Start listening
listen();
}
HttpListener::~HttpListener()
{
close();
qDebug("HttpListener: destroyed");
}
void HttpListener::listen()
{
if (!pool)
{
if (useQtSettings) {
pool = new HttpConnectionHandlerPool(settings, requestHandler);
} else {
pool = new HttpConnectionHandlerPool(&listenerSettings, requestHandler);
}
}
QString host = useQtSettings ? settings->value("host").toString() : listenerSettings.host;
int port = useQtSettings ? settings->value("port").toInt() : listenerSettings.port;
QTcpServer::listen(host.isEmpty() ? QHostAddress::Any : QHostAddress(host), port);
if (!isListening())
{
qCritical("HttpListener: Cannot bind on port %i: %s",port,qPrintable(errorString()));
}
else {
qDebug("HttpListener: Listening on port %i",port);
}
}
void HttpListener::close() {
QTcpServer::close();
qDebug("HttpListener: closed");
if (pool) {
delete pool;
pool=NULL;
}
}
void HttpListener::incomingConnection(tSocketDescriptor socketDescriptor) {
#ifdef SUPERVERBOSE
qDebug("HttpListener: New connection");
#endif
HttpConnectionHandler* freeHandler=NULL;
if (pool)
{
freeHandler=pool->getConnectionHandler();
}
// Let the handler process the new connection.
if (freeHandler)
{
// The descriptor is passed via event queue because the handler lives in another thread
QMetaObject::invokeMethod(freeHandler, "handleConnection", Qt::QueuedConnection, Q_ARG(tSocketDescriptor, socketDescriptor));
}
else
{
// Reject the connection
qDebug("HttpListener: Too many incoming connections");
QTcpSocket* socket=new QTcpSocket(this);
socket->setSocketDescriptor(socketDescriptor);
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
socket->write("HTTP/1.1 503 too many connections\r\nConnection: close\r\n\r\nToo many connections\r\n");
socket->disconnectFromHost();
}
}