diff options
author | Mikhail Svetkin <mikhail.svetkin@gmail.com> | 2020-02-17 23:32:02 +0100 |
---|---|---|
committer | Mikhail Svetkin <mikhail.svetkin@gmail.com> | 2020-02-24 21:27:24 +0100 |
commit | 65ba5db9e0f33d046b189e9a4847bea2d87a1b3c (patch) | |
tree | 023ac17e1e19291c7ac860945b9d20b8d7687eff | |
parent | a96d975ea8eddf336082e1725f748602ffc01c73 (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.cpp | 41 | ||||
-rw-r--r-- | src/httpserver/qhttpserverrequest.cpp | 1 |
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 |