summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Svetkin <mikhail.svetkin@gmail.com>2020-02-17 22:16:55 +0100
committerMikhail Svetkin <mikhail.svetkin@gmail.com>2020-02-26 12:53:15 +0100
commita65cc1fa6e8b234ad57838a573ef17f29859bf6d (patch)
tree267cd4f0c599df189ebb7cda5a6c346423b9456e
parent65ba5db9e0f33d046b189e9a4847bea2d87a1b3c (diff)
Do not disconnect on HTTP CONNECT method
According HTTP/1.1 specifications (RFC 7231) CONNECT is intended only for use in requests to a proxy. That it is why http-parser sets the upgrade flag. This patch will allow users to decide how to handle this. Change-Id: Ic2d10ca4ab113b4cac85e14f15af7890d5773e98 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
-rw-r--r--src/httpserver/qhttpserverrequest.cpp2
-rw-r--r--src/httpserver/qhttpserverrequest.h6
-rw-r--r--tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp9
3 files changed, 14 insertions, 3 deletions
diff --git a/src/httpserver/qhttpserverrequest.cpp b/src/httpserver/qhttpserverrequest.cpp
index 20c2821..5c0ac5f 100644
--- a/src/httpserver/qhttpserverrequest.cpp
+++ b/src/httpserver/qhttpserverrequest.cpp
@@ -291,6 +291,8 @@ QHttpServerRequest::Method QHttpServerRequest::method() const
return QHttpServerRequest::Method::Options;
case HTTP_PATCH:
return QHttpServerRequest::Method::Patch;
+ case HTTP_CONNECT:
+ return QHttpServerRequest::Method::Connect;
default:
return QHttpServerRequest::Method::Unknown;
}
diff --git a/src/httpserver/qhttpserverrequest.h b/src/httpserver/qhttpserverrequest.h
index ea4fc7f..4ace46a 100644
--- a/src/httpserver/qhttpserverrequest.h
+++ b/src/httpserver/qhttpserverrequest.h
@@ -65,8 +65,9 @@ public:
Head = 0x0010,
Options = 0x0020,
Patch = 0x0040,
+ Connect = 0x0080,
- All = Get | Put | Delete | Post | Head | Options | Patch,
+ All = Get | Put | Delete | Post | Head | Options | Patch | Connect,
// Include upper-case aliases for the sake of parsing from strings:
GET = Get,
@@ -75,7 +76,8 @@ public:
POST = Post,
HEAD = Head,
OPTIONS = Options,
- PATCH = Patch
+ PATCH = Patch,
+ CONNECT = Connect
};
Q_ENUM(Method)
Q_DECLARE_FLAGS(Methods, Method)
diff --git a/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp b/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp
index 912a7a6..d8dc0ef 100644
--- a/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp
+++ b/tests/auto/qabstracthttpserver/tst_qabstracthttpserver.cpp
@@ -252,7 +252,12 @@ void tst_QAbstractHttpServer::qtbug82053()
{
struct HttpServer : QAbstractHttpServer
{
- bool handleRequest(const QHttpServerRequest &, QTcpSocket *) override { return false; }
+ bool wasConnectRequest{false};
+ bool handleRequest(const QHttpServerRequest &req, QTcpSocket *) override
+ {
+ wasConnectRequest = (req.method() == QHttpServerRequest::Method::Connect);
+ return false;
+ }
} server;
auto tcpServer = new QTcpServer;
tcpServer->listen();
@@ -264,6 +269,8 @@ void tst_QAbstractHttpServer::qtbug82053()
client.write("CONNECT / HTTP/1.1\n\n");
client.waitForBytesWritten();
QTest::qWait(0);
+ QCOMPARE(client.state(), QAbstractSocket::ConnectedState);
+ QTRY_VERIFY(server.wasConnectRequest);
}
QT_END_NAMESPACE