summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Svetkin <mikhail.svetkin@gmail.com>2020-02-17 23:32:02 +0100
committerMikhail Svetkin <mikhail.svetkin@gmail.com>2020-02-24 21:27:24 +0100
commit65ba5db9e0f33d046b189e9a4847bea2d87a1b3c (patch)
tree023ac17e1e19291c7ac860945b9d20b8d7687eff
parenta96d975ea8eddf336082e1725f748602ffc01c73 (diff)
Small refactoring of QHttpServerRequest and QAbstractHttpServer
1. Move initialization of httpParser from QAbstractHttpServer to QHttpServerRequest. 2. Simplify access to an upgrade header value from a request. httpParser sets an upgrade flag only if the request has two headers or the request is HTTP CONNECT method. Change-Id: I39c2325558a58679e40d38e46706cd61ef36d327 Reviewed-by: Mikhail Svetkin <mikhail.svetkin@gmail.com>
-rw-r--r--src/httpserver/qabstracthttpserver.cpp41
-rw-r--r--src/httpserver/qhttpserverrequest.cpp1
2 files changed, 19 insertions, 23 deletions
diff --git a/src/httpserver/qabstracthttpserver.cpp b/src/httpserver/qabstracthttpserver.cpp
index 71e2297..2b699ed 100644
--- a/src/httpserver/qabstracthttpserver.cpp
+++ b/src/httpserver/qabstracthttpserver.cpp
@@ -58,8 +58,6 @@ void QAbstractHttpServerPrivate::handleNewConnections()
Q_ASSERT(tcpServer);
while (auto socket = tcpServer->nextPendingConnection()) {
auto request = new QHttpServerRequest(socket->peerAddress()); // TODO own tcp server could pre-allocate it
- http_parser_init(&request->d->httpParser, HTTP_REQUEST);
-
QObject::connect(socket, &QTcpSocket::readyRead, q_ptr,
[this, request, socket] () {
handleReadyRead(socket, request);
@@ -94,30 +92,27 @@ void QAbstractHttpServerPrivate::handleReadyRead(QTcpSocket *socket,
request->d->state != QHttpServerRequestPrivate::State::OnMessageComplete)
return; // Partial read
- if (request->d->httpParser.upgrade) { // Upgrade
- const auto &headers = request->d->headers;
- const auto upgradeHash = request->d->headerHash(QByteArrayLiteral("upgrade"));
- const auto it = headers.find(upgradeHash);
- if (it != headers.end()) {
+ if (request->d->httpParser.upgrade &&
+ request->d->httpParser.method != HTTP_CONNECT) { // Upgrade
+ const auto &upgradeValue = request->value(QByteArrayLiteral("upgrade"));
#if defined(QT_WEBSOCKETS_LIB)
- if (it.value().second.compare(QByteArrayLiteral("websocket"), Qt::CaseInsensitive) == 0) {
- static const auto signal = QMetaMethod::fromSignal(
- &QAbstractHttpServer::newWebSocketConnection);
- if (q->isSignalConnected(signal)) {
- QObject::disconnect(socket, &QTcpSocket::readyRead, nullptr, nullptr);
- socket->rollbackTransaction();
- websocketServer.handleConnection(socket);
- Q_EMIT socket->readyRead();
- } else {
- qWarning(lcHttpServer, "WebSocket received but no slots connected to "
- "QWebSocketServer::newConnection");
- socket->disconnectFromHost();
- }
- return;
+ if (upgradeValue.compare(QByteArrayLiteral("websocket"), Qt::CaseInsensitive) == 0) {
+ static const auto signal = QMetaMethod::fromSignal(
+ &QAbstractHttpServer::newWebSocketConnection);
+ if (q->isSignalConnected(signal)) {
+ QObject::disconnect(socket, &QTcpSocket::readyRead, nullptr, nullptr);
+ socket->rollbackTransaction();
+ websocketServer.handleConnection(socket);
+ Q_EMIT socket->readyRead();
+ } else {
+ qWarning(lcHttpServer, "WebSocket received but no slots connected to "
+ "QWebSocketServer::newConnection");
+ socket->disconnectFromHost();
}
-#endif
- qCWarning(lcHttpServer, "Upgrade to %s not supported", it.value().second.constData());
+ return;
}
+#endif
+ qCWarning(lcHttpServer, "Upgrade to %s not supported", upgradeValue.constData());
socket->disconnectFromHost();
return;
}
diff --git a/src/httpserver/qhttpserverrequest.cpp b/src/httpserver/qhttpserverrequest.cpp
index da7d8ca..20c2821 100644
--- a/src/httpserver/qhttpserverrequest.cpp
+++ b/src/httpserver/qhttpserverrequest.cpp
@@ -94,6 +94,7 @@ QHttpServerRequestPrivate::QHttpServerRequestPrivate(const QHostAddress &remoteA
: remoteAddress(remoteAddress)
{
httpParser.data = this;
+ http_parser_init(&httpParser, HTTP_REQUEST);
}
QByteArray QHttpServerRequestPrivate::header(const QByteArray &key) const