Ensure Socket::close() deletes the object once closed.

This commit is contained in:
Nathan Osman
2017-08-08 17:01:05 -07:00
parent 461d5100dc
commit 0a7b81d4ba
9 changed files with 56 additions and 54 deletions

View File

@@ -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());

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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<int>(QHttpEngine::Socket::Forbidden));
}

View File

@@ -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);

View File

@@ -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<int>(QHttpEngine::Socket::OK));
}
}

View File

@@ -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<int>(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);
}