diff --git a/src/include/qhttpengine/socket.h b/src/include/qhttpengine/socket.h index e49c05c..16dd9b6 100644 --- a/src/include/qhttpengine/socket.h +++ b/src/include/qhttpengine/socket.h @@ -203,7 +203,8 @@ public: * @brief Close the device and underlying socket * * Invoking this method signifies that no more data will be written to the - * device. It will also close the underlying QTcpSocket. + * device. It will also close the underlying QTcpSocket and destroy this + * object. */ virtual void close(); @@ -319,12 +320,12 @@ public: void writeHeaders(); /** - * @brief Write an HTTP 3xx redirect to the socket + * @brief Write an HTTP 3xx redirect to the socket and close it */ void writeRedirect(const QByteArray &path, bool permanent = false); /** - * @brief Write an HTTP error to the socket + * @brief Write an HTTP error to the socket and close it */ void writeError(int statusCode, const QByteArray &statusReason = QByteArray()); diff --git a/src/src/socket.cpp b/src/src/socket.cpp index 83c8720..ffea092 100644 --- a/src/src/socket.cpp +++ b/src/src/socket.cpp @@ -217,6 +217,7 @@ void Socket::close() d->readState = SocketPrivate::ReadFinished; d->writeState = SocketPrivate::WriteFinished; + connect(d->socket, &QTcpSocket::disconnected, this, &Socket::deleteLater); d->socket->close(); } diff --git a/tests/TestBasicAuthMiddleware.cpp b/tests/TestBasicAuthMiddleware.cpp index b0c9f4f..8dd585f 100644 --- a/tests/TestBasicAuthMiddleware.cpp +++ b/tests/TestBasicAuthMiddleware.cpp @@ -94,7 +94,7 @@ void TestBasicAuthMiddleware::testProcess() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); QHttpEngine::Socket::HeaderMap headers; @@ -106,11 +106,11 @@ void TestBasicAuthMiddleware::testProcess() } client.sendHeaders("GET", "/", headers); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); QHttpEngine::Handler handler; handler.addMiddleware(&auth); - handler.route(&socket, "/"); + handler.route(socket, "/"); QTRY_COMPARE(client.statusCode(), status); } diff --git a/tests/TestFilesystemHandler.cpp b/tests/TestFilesystemHandler.cpp index 4738bcc..420052e 100644 --- a/tests/TestFilesystemHandler.cpp +++ b/tests/TestFilesystemHandler.cpp @@ -103,9 +103,9 @@ void TestFilesystemHandler::testRequests() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); - handler.route(&socket, path); + handler.route(socket, path); QTRY_COMPARE(client.statusCode(), statusCode); @@ -173,16 +173,16 @@ void TestFilesystemHandler::testRangeRequests() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); if (!range.isEmpty()) { QHttpEngine::Socket::HeaderMap inHeaders; inHeaders.insert("Range", QByteArray("bytes=") + range.toUtf8()); client.sendHeaders("GET", path.toUtf8(), inHeaders); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); } - handler.route(&socket, path); + handler.route(socket, path); QTRY_COMPARE(client.statusCode(), statusCode); diff --git a/tests/TestHandler.cpp b/tests/TestHandler.cpp index 7df2088..a228662 100644 --- a/tests/TestHandler.cpp +++ b/tests/TestHandler.cpp @@ -97,14 +97,14 @@ void TestHandler::testRedirect() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); client.sendHeaders("GET", path); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); QHttpEngine::Handler handler; handler.addRedirect(pattern, destination); - handler.route(&socket, socket.path()); + handler.route(socket, socket->path()); QTRY_COMPARE(client.statusCode(), statusCode); @@ -151,16 +151,16 @@ void TestHandler::testSubHandler() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); client.sendHeaders("GET", path); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); DummyHandler subHandler; QHttpEngine::Handler handler; handler.addSubHandler(pattern, &subHandler); - handler.route(&socket, socket.path()); + handler.route(socket, socket->path()); QTRY_COMPARE(client.statusCode(), statusCode); QCOMPARE(subHandler.mPathRemainder, pathRemainder); diff --git a/tests/TestMiddleware.cpp b/tests/TestMiddleware.cpp index da6c9c5..ff0966b 100644 --- a/tests/TestMiddleware.cpp +++ b/tests/TestMiddleware.cpp @@ -57,15 +57,15 @@ void TestMiddleware::testProcess() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); client.sendHeaders("GET", "/"); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); DummyMiddleware middleware; QHttpEngine::Handler handler; handler.addMiddleware(&middleware); - handler.route(&socket, "/"); + handler.route(socket, "/"); QTRY_COMPARE(client.statusCode(), static_cast(QHttpEngine::Socket::Forbidden)); } diff --git a/tests/TestProxyHandler.cpp b/tests/TestProxyHandler.cpp index d54445d..ac293b8 100644 --- a/tests/TestProxyHandler.cpp +++ b/tests/TestProxyHandler.cpp @@ -64,17 +64,17 @@ void TestProxyHandler::testDataPassthrough() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server()); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); // Send the headers and wait for them to be parsed QHttpEngine::Socket::HeaderMap headers{ {"Content-Length", QByteArray::number(Data.length())} }; client.sendHeaders("POST", QString("/%1").arg(Path).toUtf8(), headers); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); // Route the request (triggering the upstream connection) - handler.route(&socket, Path); + handler.route(socket, Path); // Send the data and wait for it to return client.sendData(Data); diff --git a/tests/TestQObjectHandler.cpp b/tests/TestQObjectHandler.cpp index 6d18fac..f802e0f 100644 --- a/tests/TestQObjectHandler.cpp +++ b/tests/TestQObjectHandler.cpp @@ -89,12 +89,12 @@ void TestQObjectHandler::testOldConnection() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); client.sendHeaders("GET", "test"); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); - handler.route(&socket, socket.path()); + handler.route(socket, socket->path()); QTRY_COMPARE(client.statusCode(), statusCode); } @@ -119,12 +119,12 @@ void TestQObjectHandler::testNewConnection() QTRY_VERIFY(pair.isConnected()); QSimpleHttpClient client(pair.client()); - QHttpEngine::Socket socket(pair.server(), &pair); + QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair); client.sendHeaders("GET", QByteArray::number(i)); - QTRY_VERIFY(socket.isHeadersParsed()); + QTRY_VERIFY(socket->isHeadersParsed()); - handler.route(&socket, socket.path()); + handler.route(socket, socket->path()); QTRY_COMPARE(client.statusCode(), static_cast(QHttpEngine::Socket::OK)); } } diff --git a/tests/TestSocket.cpp b/tests/TestSocket.cpp index bb81148..3cdc3b8 100644 --- a/tests/TestSocket.cpp +++ b/tests/TestSocket.cpp @@ -41,7 +41,7 @@ Q_DECLARE_METATYPE(QHttpEngine::Socket::QueryStringMap) QSocketPair pair; \ QTRY_VERIFY(pair.isConnected()); \ QSimpleHttpClient client(pair.client()); \ - QHttpEngine::Socket server(pair.server()) + QHttpEngine::Socket *server = new QHttpEngine::Socket(pair.server(), &pair); const QByteArray Method = "POST"; const QByteArray Path = "/test"; @@ -82,13 +82,13 @@ void TestSocket::testProperties() client.sendHeaders(Method, Path, headers); - QTRY_COMPARE(server.method(), QHttpEngine::Socket::POST); - QCOMPARE(server.rawPath(), Path); - QCOMPARE(server.headers(), headers); + QTRY_COMPARE(server->method(), QHttpEngine::Socket::POST); + QCOMPARE(server->rawPath(), Path); + QCOMPARE(server->headers(), headers); - server.setStatusCode(StatusCode, StatusReason); - server.setHeaders(headers); - server.writeHeaders(); + server->setStatusCode(StatusCode, StatusReason); + server->setHeaders(headers); + server->writeHeaders(); QTRY_COMPARE(client.statusCode(), StatusCode); QCOMPARE(client.statusReason(), StatusReason); @@ -102,12 +102,12 @@ void TestSocket::testData() client.sendHeaders(Method, Path, headers); client.sendData(Data); - QTRY_COMPARE(server.contentLength(), Data.length()); - QTRY_COMPARE(server.bytesAvailable(), Data.length()); - QCOMPARE(server.readAll(), Data); + QTRY_COMPARE(server->contentLength(), Data.length()); + QTRY_COMPARE(server->bytesAvailable(), Data.length()); + QCOMPARE(server->readAll(), Data); - server.writeHeaders(); - server.write(Data); + server->writeHeaders(); + server->write(Data); QTRY_COMPARE(client.data(), Data); } @@ -118,7 +118,7 @@ void TestSocket::testRedirect() QSignalSpy disconnectedSpy(pair.client(), SIGNAL(disconnected())); - server.writeRedirect(Path, true); + server->writeRedirect(Path, true); QTRY_COMPARE(client.statusCode(), static_cast(QHttpEngine::Socket::MovedPermanently)); QCOMPARE(client.headers().value("Location"), Path); @@ -129,11 +129,11 @@ void TestSocket::testSignals() { CREATE_SOCKET_PAIR(); - QSignalSpy headersParsedSpy(&server, SIGNAL(headersParsed())); - QSignalSpy readyReadSpy(&server, SIGNAL(readyRead())); - QSignalSpy readChannelFinishedSpy(&server, SIGNAL(readChannelFinished())); - QSignalSpy bytesWrittenSpy(&server, SIGNAL(bytesWritten(qint64))); - QSignalSpy aboutToCloseSpy(&server, SIGNAL(aboutToClose())); + QSignalSpy headersParsedSpy(server, SIGNAL(headersParsed())); + QSignalSpy readyReadSpy(server, SIGNAL(readyRead())); + QSignalSpy readChannelFinishedSpy(server, SIGNAL(readChannelFinished())); + QSignalSpy bytesWrittenSpy(server, SIGNAL(bytesWritten(qint64))); + QSignalSpy aboutToCloseSpy(server, SIGNAL(aboutToClose())); client.sendHeaders(Method, Path, headers); @@ -142,12 +142,12 @@ void TestSocket::testSignals() client.sendData(Data); - QTRY_COMPARE(server.bytesAvailable(), Data.length()); + QTRY_COMPARE(server->bytesAvailable(), Data.length()); QVERIFY(readyReadSpy.count() > 0); QCOMPARE(readChannelFinishedSpy.count(), 1); - server.writeHeaders(); - server.write(Data); + server->writeHeaders(); + server->write(Data); QTRY_COMPARE(client.data().length(), Data.length()); QVERIFY(bytesWrittenSpy.count() > 0); @@ -159,7 +159,7 @@ void TestSocket::testSignals() QCOMPARE(bytesWritten, Data.length()); QTRY_COMPARE(aboutToCloseSpy.count(), 0); - server.close(); + server->close(); QTRY_COMPARE(aboutToCloseSpy.count(), 1); } @@ -176,11 +176,11 @@ void TestSocket::testJson() }); client.sendData(data); - QTRY_VERIFY(server.isHeadersParsed()); - QTRY_VERIFY(server.bytesAvailable() >= server.contentLength()); + QTRY_VERIFY(server->isHeadersParsed()); + QTRY_VERIFY(server->bytesAvailable() >= server->contentLength()); QJsonDocument document; - QVERIFY(server.readJson(document)); + QVERIFY(server->readJson(document)); QCOMPARE(document.object(), object); }