Ensure Socket::close() deletes the object once closed.
This commit is contained in:
@@ -203,7 +203,8 @@ public:
|
|||||||
* @brief Close the device and underlying socket
|
* @brief Close the device and underlying socket
|
||||||
*
|
*
|
||||||
* Invoking this method signifies that no more data will be written to the
|
* 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();
|
virtual void close();
|
||||||
|
|
||||||
@@ -319,12 +320,12 @@ public:
|
|||||||
void writeHeaders();
|
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);
|
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());
|
void writeError(int statusCode, const QByteArray &statusReason = QByteArray());
|
||||||
|
|
||||||
|
|||||||
@@ -217,6 +217,7 @@ void Socket::close()
|
|||||||
d->readState = SocketPrivate::ReadFinished;
|
d->readState = SocketPrivate::ReadFinished;
|
||||||
d->writeState = SocketPrivate::WriteFinished;
|
d->writeState = SocketPrivate::WriteFinished;
|
||||||
|
|
||||||
|
connect(d->socket, &QTcpSocket::disconnected, this, &Socket::deleteLater);
|
||||||
d->socket->close();
|
d->socket->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ void TestBasicAuthMiddleware::testProcess()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
QSimpleHttpClient client(pair.client());
|
||||||
QHttpEngine::Socket socket(pair.server(), &pair);
|
QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair);
|
||||||
|
|
||||||
QHttpEngine::Socket::HeaderMap headers;
|
QHttpEngine::Socket::HeaderMap headers;
|
||||||
|
|
||||||
@@ -106,11 +106,11 @@ void TestBasicAuthMiddleware::testProcess()
|
|||||||
}
|
}
|
||||||
|
|
||||||
client.sendHeaders("GET", "/", headers);
|
client.sendHeaders("GET", "/", headers);
|
||||||
QTRY_VERIFY(socket.isHeadersParsed());
|
QTRY_VERIFY(socket->isHeadersParsed());
|
||||||
|
|
||||||
QHttpEngine::Handler handler;
|
QHttpEngine::Handler handler;
|
||||||
handler.addMiddleware(&auth);
|
handler.addMiddleware(&auth);
|
||||||
handler.route(&socket, "/");
|
handler.route(socket, "/");
|
||||||
|
|
||||||
QTRY_COMPARE(client.statusCode(), status);
|
QTRY_COMPARE(client.statusCode(), status);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,9 +103,9 @@ void TestFilesystemHandler::testRequests()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
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);
|
QTRY_COMPARE(client.statusCode(), statusCode);
|
||||||
|
|
||||||
@@ -173,16 +173,16 @@ void TestFilesystemHandler::testRangeRequests()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
QSimpleHttpClient client(pair.client());
|
||||||
QHttpEngine::Socket socket(pair.server(), &pair);
|
QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair);
|
||||||
|
|
||||||
if (!range.isEmpty()) {
|
if (!range.isEmpty()) {
|
||||||
QHttpEngine::Socket::HeaderMap inHeaders;
|
QHttpEngine::Socket::HeaderMap inHeaders;
|
||||||
inHeaders.insert("Range", QByteArray("bytes=") + range.toUtf8());
|
inHeaders.insert("Range", QByteArray("bytes=") + range.toUtf8());
|
||||||
client.sendHeaders("GET", path.toUtf8(), inHeaders);
|
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);
|
QTRY_COMPARE(client.statusCode(), statusCode);
|
||||||
|
|
||||||
|
|||||||
@@ -97,14 +97,14 @@ void TestHandler::testRedirect()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
QSimpleHttpClient client(pair.client());
|
||||||
QHttpEngine::Socket socket(pair.server(), &pair);
|
QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair);
|
||||||
|
|
||||||
client.sendHeaders("GET", path);
|
client.sendHeaders("GET", path);
|
||||||
QTRY_VERIFY(socket.isHeadersParsed());
|
QTRY_VERIFY(socket->isHeadersParsed());
|
||||||
|
|
||||||
QHttpEngine::Handler handler;
|
QHttpEngine::Handler handler;
|
||||||
handler.addRedirect(pattern, destination);
|
handler.addRedirect(pattern, destination);
|
||||||
handler.route(&socket, socket.path());
|
handler.route(socket, socket->path());
|
||||||
|
|
||||||
QTRY_COMPARE(client.statusCode(), statusCode);
|
QTRY_COMPARE(client.statusCode(), statusCode);
|
||||||
|
|
||||||
@@ -151,16 +151,16 @@ void TestHandler::testSubHandler()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
QSimpleHttpClient client(pair.client());
|
||||||
QHttpEngine::Socket socket(pair.server(), &pair);
|
QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair);
|
||||||
|
|
||||||
client.sendHeaders("GET", path);
|
client.sendHeaders("GET", path);
|
||||||
QTRY_VERIFY(socket.isHeadersParsed());
|
QTRY_VERIFY(socket->isHeadersParsed());
|
||||||
|
|
||||||
DummyHandler subHandler;
|
DummyHandler subHandler;
|
||||||
QHttpEngine::Handler handler;
|
QHttpEngine::Handler handler;
|
||||||
handler.addSubHandler(pattern, &subHandler);
|
handler.addSubHandler(pattern, &subHandler);
|
||||||
|
|
||||||
handler.route(&socket, socket.path());
|
handler.route(socket, socket->path());
|
||||||
|
|
||||||
QTRY_COMPARE(client.statusCode(), statusCode);
|
QTRY_COMPARE(client.statusCode(), statusCode);
|
||||||
QCOMPARE(subHandler.mPathRemainder, pathRemainder);
|
QCOMPARE(subHandler.mPathRemainder, pathRemainder);
|
||||||
|
|||||||
@@ -57,15 +57,15 @@ void TestMiddleware::testProcess()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
QSimpleHttpClient client(pair.client());
|
||||||
QHttpEngine::Socket socket(pair.server(), &pair);
|
QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair);
|
||||||
|
|
||||||
client.sendHeaders("GET", "/");
|
client.sendHeaders("GET", "/");
|
||||||
QTRY_VERIFY(socket.isHeadersParsed());
|
QTRY_VERIFY(socket->isHeadersParsed());
|
||||||
|
|
||||||
DummyMiddleware middleware;
|
DummyMiddleware middleware;
|
||||||
QHttpEngine::Handler handler;
|
QHttpEngine::Handler handler;
|
||||||
handler.addMiddleware(&middleware);
|
handler.addMiddleware(&middleware);
|
||||||
handler.route(&socket, "/");
|
handler.route(socket, "/");
|
||||||
|
|
||||||
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::Forbidden));
|
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::Forbidden));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,17 +64,17 @@ void TestProxyHandler::testDataPassthrough()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
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
|
// Send the headers and wait for them to be parsed
|
||||||
QHttpEngine::Socket::HeaderMap headers{
|
QHttpEngine::Socket::HeaderMap headers{
|
||||||
{"Content-Length", QByteArray::number(Data.length())}
|
{"Content-Length", QByteArray::number(Data.length())}
|
||||||
};
|
};
|
||||||
client.sendHeaders("POST", QString("/%1").arg(Path).toUtf8(), headers);
|
client.sendHeaders("POST", QString("/%1").arg(Path).toUtf8(), headers);
|
||||||
QTRY_VERIFY(socket.isHeadersParsed());
|
QTRY_VERIFY(socket->isHeadersParsed());
|
||||||
|
|
||||||
// Route the request (triggering the upstream connection)
|
// Route the request (triggering the upstream connection)
|
||||||
handler.route(&socket, Path);
|
handler.route(socket, Path);
|
||||||
|
|
||||||
// Send the data and wait for it to return
|
// Send the data and wait for it to return
|
||||||
client.sendData(Data);
|
client.sendData(Data);
|
||||||
|
|||||||
@@ -89,12 +89,12 @@ void TestQObjectHandler::testOldConnection()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
QSimpleHttpClient client(pair.client());
|
||||||
QHttpEngine::Socket socket(pair.server(), &pair);
|
QHttpEngine::Socket *socket = new QHttpEngine::Socket(pair.server(), &pair);
|
||||||
|
|
||||||
client.sendHeaders("GET", "test");
|
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);
|
QTRY_COMPARE(client.statusCode(), statusCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,12 +119,12 @@ void TestQObjectHandler::testNewConnection()
|
|||||||
QTRY_VERIFY(pair.isConnected());
|
QTRY_VERIFY(pair.isConnected());
|
||||||
|
|
||||||
QSimpleHttpClient client(pair.client());
|
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));
|
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));
|
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::OK));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Q_DECLARE_METATYPE(QHttpEngine::Socket::QueryStringMap)
|
|||||||
QSocketPair pair; \
|
QSocketPair pair; \
|
||||||
QTRY_VERIFY(pair.isConnected()); \
|
QTRY_VERIFY(pair.isConnected()); \
|
||||||
QSimpleHttpClient client(pair.client()); \
|
QSimpleHttpClient client(pair.client()); \
|
||||||
QHttpEngine::Socket server(pair.server())
|
QHttpEngine::Socket *server = new QHttpEngine::Socket(pair.server(), &pair);
|
||||||
|
|
||||||
const QByteArray Method = "POST";
|
const QByteArray Method = "POST";
|
||||||
const QByteArray Path = "/test";
|
const QByteArray Path = "/test";
|
||||||
@@ -82,13 +82,13 @@ void TestSocket::testProperties()
|
|||||||
|
|
||||||
client.sendHeaders(Method, Path, headers);
|
client.sendHeaders(Method, Path, headers);
|
||||||
|
|
||||||
QTRY_COMPARE(server.method(), QHttpEngine::Socket::POST);
|
QTRY_COMPARE(server->method(), QHttpEngine::Socket::POST);
|
||||||
QCOMPARE(server.rawPath(), Path);
|
QCOMPARE(server->rawPath(), Path);
|
||||||
QCOMPARE(server.headers(), headers);
|
QCOMPARE(server->headers(), headers);
|
||||||
|
|
||||||
server.setStatusCode(StatusCode, StatusReason);
|
server->setStatusCode(StatusCode, StatusReason);
|
||||||
server.setHeaders(headers);
|
server->setHeaders(headers);
|
||||||
server.writeHeaders();
|
server->writeHeaders();
|
||||||
|
|
||||||
QTRY_COMPARE(client.statusCode(), StatusCode);
|
QTRY_COMPARE(client.statusCode(), StatusCode);
|
||||||
QCOMPARE(client.statusReason(), StatusReason);
|
QCOMPARE(client.statusReason(), StatusReason);
|
||||||
@@ -102,12 +102,12 @@ void TestSocket::testData()
|
|||||||
client.sendHeaders(Method, Path, headers);
|
client.sendHeaders(Method, Path, headers);
|
||||||
client.sendData(Data);
|
client.sendData(Data);
|
||||||
|
|
||||||
QTRY_COMPARE(server.contentLength(), Data.length());
|
QTRY_COMPARE(server->contentLength(), Data.length());
|
||||||
QTRY_COMPARE(server.bytesAvailable(), Data.length());
|
QTRY_COMPARE(server->bytesAvailable(), Data.length());
|
||||||
QCOMPARE(server.readAll(), Data);
|
QCOMPARE(server->readAll(), Data);
|
||||||
|
|
||||||
server.writeHeaders();
|
server->writeHeaders();
|
||||||
server.write(Data);
|
server->write(Data);
|
||||||
|
|
||||||
QTRY_COMPARE(client.data(), Data);
|
QTRY_COMPARE(client.data(), Data);
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ void TestSocket::testRedirect()
|
|||||||
|
|
||||||
QSignalSpy disconnectedSpy(pair.client(), SIGNAL(disconnected()));
|
QSignalSpy disconnectedSpy(pair.client(), SIGNAL(disconnected()));
|
||||||
|
|
||||||
server.writeRedirect(Path, true);
|
server->writeRedirect(Path, true);
|
||||||
|
|
||||||
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::MovedPermanently));
|
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::MovedPermanently));
|
||||||
QCOMPARE(client.headers().value("Location"), Path);
|
QCOMPARE(client.headers().value("Location"), Path);
|
||||||
@@ -129,11 +129,11 @@ void TestSocket::testSignals()
|
|||||||
{
|
{
|
||||||
CREATE_SOCKET_PAIR();
|
CREATE_SOCKET_PAIR();
|
||||||
|
|
||||||
QSignalSpy headersParsedSpy(&server, SIGNAL(headersParsed()));
|
QSignalSpy headersParsedSpy(server, SIGNAL(headersParsed()));
|
||||||
QSignalSpy readyReadSpy(&server, SIGNAL(readyRead()));
|
QSignalSpy readyReadSpy(server, SIGNAL(readyRead()));
|
||||||
QSignalSpy readChannelFinishedSpy(&server, SIGNAL(readChannelFinished()));
|
QSignalSpy readChannelFinishedSpy(server, SIGNAL(readChannelFinished()));
|
||||||
QSignalSpy bytesWrittenSpy(&server, SIGNAL(bytesWritten(qint64)));
|
QSignalSpy bytesWrittenSpy(server, SIGNAL(bytesWritten(qint64)));
|
||||||
QSignalSpy aboutToCloseSpy(&server, SIGNAL(aboutToClose()));
|
QSignalSpy aboutToCloseSpy(server, SIGNAL(aboutToClose()));
|
||||||
|
|
||||||
client.sendHeaders(Method, Path, headers);
|
client.sendHeaders(Method, Path, headers);
|
||||||
|
|
||||||
@@ -142,12 +142,12 @@ void TestSocket::testSignals()
|
|||||||
|
|
||||||
client.sendData(Data);
|
client.sendData(Data);
|
||||||
|
|
||||||
QTRY_COMPARE(server.bytesAvailable(), Data.length());
|
QTRY_COMPARE(server->bytesAvailable(), Data.length());
|
||||||
QVERIFY(readyReadSpy.count() > 0);
|
QVERIFY(readyReadSpy.count() > 0);
|
||||||
QCOMPARE(readChannelFinishedSpy.count(), 1);
|
QCOMPARE(readChannelFinishedSpy.count(), 1);
|
||||||
|
|
||||||
server.writeHeaders();
|
server->writeHeaders();
|
||||||
server.write(Data);
|
server->write(Data);
|
||||||
|
|
||||||
QTRY_COMPARE(client.data().length(), Data.length());
|
QTRY_COMPARE(client.data().length(), Data.length());
|
||||||
QVERIFY(bytesWrittenSpy.count() > 0);
|
QVERIFY(bytesWrittenSpy.count() > 0);
|
||||||
@@ -159,7 +159,7 @@ void TestSocket::testSignals()
|
|||||||
QCOMPARE(bytesWritten, Data.length());
|
QCOMPARE(bytesWritten, Data.length());
|
||||||
|
|
||||||
QTRY_COMPARE(aboutToCloseSpy.count(), 0);
|
QTRY_COMPARE(aboutToCloseSpy.count(), 0);
|
||||||
server.close();
|
server->close();
|
||||||
QTRY_COMPARE(aboutToCloseSpy.count(), 1);
|
QTRY_COMPARE(aboutToCloseSpy.count(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,11 +176,11 @@ void TestSocket::testJson()
|
|||||||
});
|
});
|
||||||
client.sendData(data);
|
client.sendData(data);
|
||||||
|
|
||||||
QTRY_VERIFY(server.isHeadersParsed());
|
QTRY_VERIFY(server->isHeadersParsed());
|
||||||
QTRY_VERIFY(server.bytesAvailable() >= server.contentLength());
|
QTRY_VERIFY(server->bytesAvailable() >= server->contentLength());
|
||||||
|
|
||||||
QJsonDocument document;
|
QJsonDocument document;
|
||||||
QVERIFY(server.readJson(document));
|
QVERIFY(server->readJson(document));
|
||||||
QCOMPARE(document.object(), object);
|
QCOMPARE(document.object(), object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user