Move everything into the QHttpEngine namespace.

This commit is contained in:
Nathan Osman
2017-07-07 21:56:09 -07:00
parent 6fea4fbd61
commit 61d219721e
60 changed files with 295 additions and 136 deletions

View File

@@ -37,7 +37,7 @@ int main(int argc, char * argv[])
QCoreApplication a(argc, argv);
// Attempt to open the local file and read from it
LocalFile file;
QHttpEngine::LocalFile file;
if (!file.open()) {
qCritical("Unable to open local file - is server running?");
return 1;

View File

@@ -27,7 +27,7 @@
#include "apihandler.h"
void ApiHandler::messages(Socket *socket)
void ApiHandler::messages(QHttpEngine::Socket *socket)
{
QJsonObject object;
object.insert("messages", QJsonArray::fromStringList(mMessages));
@@ -35,7 +35,7 @@ void ApiHandler::messages(Socket *socket)
}
void ApiHandler::messagesNew(Socket *socket)
void ApiHandler::messagesNew(QHttpEngine::Socket *socket)
{
QJsonDocument document;
if (socket->readJson(document)) {
@@ -49,5 +49,5 @@ void ApiHandler::messagesNew(Socket *socket)
}
// If execution reaches this point, malformed data was supplied
socket->writeError(Socket::BadRequest);
socket->writeError(QHttpEngine::Socket::BadRequest);
}

View File

@@ -34,8 +34,8 @@ class ApiHandler : public QObject
public Q_SLOTS:
void messages(Socket *socket);
void messagesNew(Socket *socket);
void messages(QHttpEngine::Socket *socket);
void messagesNew(QHttpEngine::Socket *socket);
private:

View File

@@ -64,16 +64,16 @@ int main(int argc, char * argv[])
quint16 port = parser.value(portOption).toInt();
// Build the hierarchy of handlers
FilesystemHandler handler(":/static");
QHttpEngine::FilesystemHandler handler(":/static");
handler.addRedirect(QRegExp("^$"), "/index.html");
ApiHandler renameMe;
QObjectHandler apiHandler;
QHttpEngine::QObjectHandler apiHandler;
apiHandler.registerMethod("messages", &renameMe, &ApiHandler::messages);
apiHandler.registerMethod("messages/new", &renameMe, &ApiHandler::messagesNew);
handler.addSubHandler(QRegExp("api/"), &apiHandler);
Server server(&handler);
QHttpEngine::Server server(&handler);
// Attempt to listen on the specified port
if (!server.listen(address, port)) {

View File

@@ -68,8 +68,8 @@ int main(int argc, char * argv[])
QString dir = parser.value(dirOption);
// Create the filesystem handler and server
FilesystemHandler handler(dir);
Server server(&handler);
QHttpEngine::FilesystemHandler handler(dir);
QHttpEngine::Server server(&handler);
// Attempt to listen on the specified port
if (!server.listen(address, port)) {

View File

@@ -27,6 +27,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT BasicAuthMiddlewarePrivate;
/**
@@ -79,4 +82,6 @@ private:
BasicAuthMiddlewarePrivate *const d;
};
}
#endif // QHTTPENGINE_BASICAUTHMIDDLEWARE_H

View File

@@ -27,6 +27,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT FilesystemHandlerPrivate;
/**
@@ -82,4 +85,6 @@ private:
friend class FilesystemHandlerPrivate;
};
}
#endif // QHTTPENGINE_FILESYSTEMHANDLER_H

View File

@@ -28,6 +28,10 @@
#include "qhttpengine_global.h"
class QRegExp;
namespace QHttpEngine
{
class Middleware;
class Socket;
@@ -128,4 +132,6 @@ private:
friend class HandlerPrivate;
};
}
#endif // QHTTPENGINE_HANDLER_H

View File

@@ -29,6 +29,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
/**
* @brief Case-insensitive subclass of QByteArray
*
@@ -94,4 +97,6 @@ inline bool operator>=(const IByteArray &a1, const QByteArray &a2) { return a1.t
inline bool operator>=(const QByteArray &a1, const IByteArray &a2) { return a1.toLower() >= a2.toLower(); }
inline bool operator>=(const IByteArray &a1, const IByteArray &a2) { return a1.toLower() >= a2.toLower(); }
}
#endif // QHTTPENGINE_IBYTEARRAY_H

View File

@@ -29,6 +29,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT LocalAuthMiddlewarePrivate;
/**
@@ -98,4 +101,6 @@ private:
LocalAuthMiddlewarePrivate *const d;
};
}
#endif // QHTTPENGINE_LOCALAUTHMIDDLEWARE_H

View File

@@ -27,6 +27,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT LocalFilePrivate;
/**
@@ -75,4 +78,6 @@ private:
friend class LocalFilePrivate;
};
}
#endif // QHTTPENGINE_LOCALFILE_H

View File

@@ -27,6 +27,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class Socket;
/**
@@ -56,4 +59,6 @@ public:
virtual bool process(Socket *socket) = 0;
};
}
#endif // QHTTPENGINE_MIDDLEWARE_H

View File

@@ -29,6 +29,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
/**
* @brief Utility methods for parsing HTTP requests and responses
*
@@ -86,4 +89,6 @@ public:
static bool parseResponseHeaders(const QByteArray &data, int &statusCode, QByteArray &statusReason, Socket::HeaderMap &headers);
};
}
#endif // QHTTPENGINE_PARSER_H

View File

@@ -29,6 +29,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT ProxyHandlerPrivate;
/**
@@ -57,4 +60,6 @@ private:
ProxyHandlerPrivate *const d;
};
}
#endif // QHTTPENGINE_PROXYHANDLER_H

View File

@@ -28,6 +28,10 @@
#include "qhttpengine_global.h"
class QIODevice;
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT QIODeviceCopierPrivate;
/**
@@ -126,4 +130,6 @@ private:
friend class QIODeviceCopierPrivate;
};
}
#endif // QHTTPENGINE_QIODEVICECOPIER_H

View File

@@ -27,7 +27,11 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class Socket;
class QHTTPENGINE_EXPORT QObjectHandlerPrivate;
/**
@@ -185,4 +189,6 @@ private:
friend class QObjectHandlerPrivate;
};
}
#endif // QHTTPENGINE_QOBJECTHANDLER_H

View File

@@ -27,6 +27,9 @@
#include "qhttpengine_global.h"
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT RangePrivate;
/**
@@ -266,4 +269,6 @@ private:
RangePrivate *const d;
};
}
#endif // QHTTPENGINE_RANGE_H

View File

@@ -33,7 +33,11 @@
class QSslConfiguration;
#endif
namespace QHttpEngine
{
class Handler;
class QHTTPENGINE_EXPORT ServerPrivate;
/**
@@ -104,4 +108,6 @@ private:
friend class ServerPrivate;
};
}
#endif // QHTTPENGINE_SERVER_H

View File

@@ -33,6 +33,10 @@
class QJsonDocument;
class QTcpSocket;
namespace QHttpEngine
{
class QHTTPENGINE_EXPORT SocketPrivate;
/**
@@ -358,4 +362,6 @@ private:
friend class SocketPrivate;
};
}
#endif // QHTTPENGINE_SOCKET_H

View File

@@ -27,6 +27,8 @@
#include "basicauthmiddleware_p.h"
using namespace QHttpEngine;
BasicAuthMiddlewarePrivate::BasicAuthMiddlewarePrivate(QObject *parent, const QString &realm)
: QObject(parent),
realm(realm)

View File

@@ -26,6 +26,9 @@
#include <QMap>
#include <QObject>
namespace QHttpEngine
{
class BasicAuthMiddlewarePrivate : public QObject
{
Q_OBJECT
@@ -38,4 +41,6 @@ public:
QMap<QString, QString> map;
};
}
#endif // QHTTPENGINE_BASICAUTHMIDDLEWARE_P_H

View File

@@ -32,6 +32,8 @@
#include "filesystemhandler_p.h"
using namespace QHttpEngine;
// Template for listing directory contents
const QString ListTemplate =
"<!DOCTYPE html>"

View File

@@ -27,6 +27,9 @@
#include <QMimeDatabase>
#include <QObject>
namespace QHttpEngine
{
class FilesystemHandler;
class Socket;
@@ -48,4 +51,6 @@ public:
QMimeDatabase database;
};
}
#endif // QHTTPENGINE_FILESYSTEMHANDLER_P_H

View File

@@ -26,6 +26,8 @@
#include "handler_p.h"
using namespace QHttpEngine;
HandlerPrivate::HandlerPrivate(Handler *handler)
: QObject(handler),
q(handler)

View File

@@ -30,6 +30,9 @@
#include <qhttpengine/handler.h>
namespace QHttpEngine
{
typedef QPair<QRegExp, QString> Redirect;
typedef QPair<QRegExp, Handler*> SubHandler;
@@ -50,4 +53,6 @@ private:
Handler *const q;
};
}
#endif // QHTTPENGINE_HANDLER_P_H

View File

@@ -29,6 +29,8 @@
#include "localauthmiddleware_p.h"
using namespace QHttpEngine;
LocalAuthMiddlewarePrivate::LocalAuthMiddlewarePrivate(QObject *parent)
: QObject(parent),
tokenHeader("X-Auth-Token"),

View File

@@ -28,6 +28,9 @@
#include <qhttpengine/localfile.h>
namespace QHttpEngine
{
class LocalAuthMiddlewarePrivate : public QObject
{
Q_OBJECT
@@ -44,4 +47,6 @@ public:
QString token;
};
}
#endif // QHTTPENGINE_LOCALAUTHMIDDLEWARE_P_H

View File

@@ -34,6 +34,8 @@
#include "localfile_p.h"
using namespace QHttpEngine;
LocalFilePrivate::LocalFilePrivate(LocalFile *localFile)
: QObject(localFile),
q(localFile)

View File

@@ -25,6 +25,9 @@
#include <QObject>
namespace QHttpEngine
{
class LocalFile;
class LocalFilePrivate : public QObject
@@ -40,7 +43,9 @@ public:
private:
LocalFile*const q;
LocalFile *const q;
};
}
#endif // QHTTPENGINE_LOCALFILE_P_H

View File

@@ -26,6 +26,8 @@
#include <qhttpengine/parser.h>
using namespace QHttpEngine;
void Parser::split(const QByteArray &data, const QByteArray &delim, int maxSplit, QByteArrayList &parts)
{
int index = 0;

View File

@@ -25,6 +25,8 @@
#include "proxyhandler_p.h"
#include "proxysocket.h"
using namespace QHttpEngine;
ProxyHandlerPrivate::ProxyHandlerPrivate(QObject *parent, const QHostAddress &address, quint16 port)
: QObject(parent),
address(address),

View File

@@ -28,6 +28,9 @@
#include <qhttpengine/socket.h>
namespace QHttpEngine
{
class ProxyHandlerPrivate : public QObject
{
Q_OBJECT
@@ -40,4 +43,6 @@ public:
quint16 port;
};
}
#endif // QHTTPENGINE_PROXYHANDLER_P_H

View File

@@ -24,6 +24,8 @@
#include "proxysocket.h"
using namespace QHttpEngine;
QProxySocket::QProxySocket(Socket *socket, const QString &path, const QHostAddress &address, quint16 port)
: QObject(socket),
mDownstreamSocket(socket),

View File

@@ -29,6 +29,8 @@
#include <qhttpengine/socket.h>
using namespace QHttpEngine;
/**
* @brief HTTP socket for connecting to a proxy
*/

View File

@@ -27,6 +27,8 @@
#include "qiodevicecopier_p.h"
using namespace QHttpEngine;
// Default value for the bufferSize property
const qint64 DefaultBufferSize = 65536;

View File

@@ -26,6 +26,10 @@
#include <QObject>
class QIODevice;
namespace QHttpEngine
{
class QIODeviceCopier;
class QIODeviceCopierPrivate : public QObject
@@ -56,4 +60,6 @@ private:
QIODeviceCopier *const q;
};
}
#endif // QHTTPENGINE_QIODEVICECOPIER_P_H

View File

@@ -28,6 +28,8 @@
#include "qobjecthandler_p.h"
using namespace QHttpEngine;
QObjectHandlerPrivate::QObjectHandlerPrivate(QObjectHandler *handler)
: QObject(handler),
q(handler)

View File

@@ -26,6 +26,9 @@
#include <QMap>
#include <QObject>
namespace QHttpEngine
{
class Socket;
class QObjectHandler;
@@ -69,4 +72,6 @@ private:
QObjectHandler *const q;
};
}
#endif // QHTTPENGINE_QOBJECTHANDLER_P_H

View File

@@ -26,6 +26,8 @@
#include "range_p.h"
using namespace QHttpEngine;
RangePrivate::RangePrivate(Range *range)
: q(range)
{

View File

@@ -25,6 +25,9 @@
#include <qhttpengine/range.h>
namespace QHttpEngine
{
class RangePrivate
{
public:
@@ -40,4 +43,6 @@ private:
Range *const q;
};
}
#endif // QHTTPENGINE_RANGE_P_H

View File

@@ -29,6 +29,8 @@
#include "server_p.h"
using namespace QHttpEngine;
ServerPrivate::ServerPrivate(Server *httpServer)
: QObject(httpServer),
q(httpServer),

View File

@@ -32,6 +32,9 @@
#include <qhttpengine/server.h>
namespace QHttpEngine
{
class Handler;
class ServerPrivate : public QObject
@@ -55,4 +58,6 @@ private:
Server *const q;
};
}
#endif // QHTTPENGINE_SERVER_P_H

View File

@@ -30,6 +30,8 @@
#include "socket_p.h"
using namespace QHttpEngine;
// Predefined error response requires a simple HTML template to be returned to
// the client describing the error condition
const QString ErrorTemplate =

View File

@@ -27,6 +27,9 @@
class QTcpSocket;
namespace QHttpEngine
{
class SocketPrivate : public QObject
{
Q_OBJECT
@@ -79,4 +82,6 @@ private:
Socket*const q;
};
}
#endif // QHTTPENGINE_SOCKET_P_H

View File

@@ -72,22 +72,22 @@ void TestQFilesystemHandler::testRequests_data()
QTest::newRow("nonexistent resource")
<< "nonexistent"
<< static_cast<int>(Socket::NotFound)
<< static_cast<int>(QHttpEngine::Socket::NotFound)
<< QByteArray();
QTest::newRow("outside document root")
<< "../outside"
<< static_cast<int>(Socket::NotFound)
<< static_cast<int>(QHttpEngine::Socket::NotFound)
<< QByteArray();
QTest::newRow("inside document root")
<< "inside"
<< static_cast<int>(Socket::OK)
<< static_cast<int>(QHttpEngine::Socket::OK)
<< Data;
QTest::newRow("directory listing")
<< ""
<< static_cast<int>(Socket::OK)
<< static_cast<int>(QHttpEngine::Socket::OK)
<< QByteArray();
}
@@ -97,13 +97,13 @@ void TestQFilesystemHandler::testRequests()
QFETCH(int, statusCode);
QFETCH(QByteArray, data);
FilesystemHandler handler(QDir(dir.path()).absoluteFilePath("root"));
QHttpEngine::FilesystemHandler handler(QDir(dir.path()).absoluteFilePath("root"));
QSocketPair pair;
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
handler.route(&socket, path);
@@ -124,37 +124,37 @@ void TestQFilesystemHandler::testRangeRequests_data()
QTest::newRow("full file")
<< "inside" << ""
<< static_cast<int>(Socket::OK)
<< static_cast<int>(QHttpEngine::Socket::OK)
<< ""
<< Data;
QTest::newRow("range 0-2")
<< "inside" << "0-2"
<< static_cast<int>(Socket::PartialContent)
<< static_cast<int>(QHttpEngine::Socket::PartialContent)
<< "bytes 0-2/4"
<< Data.mid(0, 3);
QTest::newRow("range 1-2")
<< "inside" << "1-2"
<< static_cast<int>(Socket::PartialContent)
<< static_cast<int>(QHttpEngine::Socket::PartialContent)
<< "bytes 1-2/4"
<< Data.mid(1, 2);
QTest::newRow("skip first 1 byte")
<< "inside" << "1-"
<< static_cast<int>(Socket::PartialContent)
<< static_cast<int>(QHttpEngine::Socket::PartialContent)
<< "bytes 1-3/4"
<< Data.mid(1);
QTest::newRow("last 2 bytes")
<< "inside" << "-2"
<< static_cast<int>(Socket::PartialContent)
<< static_cast<int>(QHttpEngine::Socket::PartialContent)
<< "bytes 2-3/4"
<< Data.mid(2);
QTest::newRow("bad range request")
<< "inside" << "abcd"
<< static_cast<int>(Socket::OK)
<< static_cast<int>(QHttpEngine::Socket::OK)
<< ""
<< Data;
}
@@ -167,16 +167,16 @@ void TestQFilesystemHandler::testRangeRequests()
QFETCH(QString, contentRange);
QFETCH(QByteArray, data);
FilesystemHandler handler(QDir(dir.path()).absoluteFilePath("root"));
QHttpEngine::FilesystemHandler handler(QDir(dir.path()).absoluteFilePath("root"));
QSocketPair pair;
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
if (!range.isEmpty()) {
Socket::HeaderMap inHeaders;
QHttpEngine::Socket::HeaderMap inHeaders;
inHeaders.insert("Range", QByteArray("bytes=") + range.toUtf8());
client.sendHeaders("GET", path.toUtf8(), inHeaders);
QTRY_VERIFY(socket.isHeadersParsed());

View File

@@ -49,7 +49,7 @@ private Q_SLOTS:
private:
BasicAuthMiddleware auth;
QHttpEngine::BasicAuthMiddleware auth;
};
void TestQHttpBasicAuth::initTestCase()
@@ -68,19 +68,19 @@ void TestQHttpBasicAuth::testProcess_data()
<< false
<< QString()
<< QString()
<< static_cast<int>(Socket::Unauthorized);
<< static_cast<int>(QHttpEngine::Socket::Unauthorized);
QTest::newRow("invalid credentials")
<< true
<< Username
<< QString()
<< static_cast<int>(Socket::Unauthorized);
<< static_cast<int>(QHttpEngine::Socket::Unauthorized);
QTest::newRow("valid credentials")
<< true
<< Username
<< Password
<< static_cast<int>(Socket::NotFound);
<< static_cast<int>(QHttpEngine::Socket::NotFound);
}
void TestQHttpBasicAuth::testProcess()
@@ -94,9 +94,9 @@ void TestQHttpBasicAuth::testProcess()
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
Socket::HeaderMap headers;
QHttpEngine::Socket::HeaderMap headers;
if (header) {
headers.insert(
@@ -108,7 +108,7 @@ void TestQHttpBasicAuth::testProcess()
client.sendHeaders("GET", "/", headers);
QTRY_VERIFY(socket.isHeadersParsed());
Handler handler;
QHttpEngine::Handler handler;
handler.addMiddleware(&auth);
handler.route(&socket, "/");

View File

@@ -29,13 +29,13 @@
#include "common/qsimplehttpclient.h"
#include "common/qsocketpair.h"
class DummyHandler : public Handler
class DummyHandler : public QHttpEngine::Handler
{
Q_OBJECT
public:
virtual void process(Socket *socket, const QString &path) {
virtual void process(QHttpEngine::Socket *socket, const QString &path) {
mPathRemainder = path;
socket->writeHeaders();
socket->close();
@@ -69,20 +69,20 @@ void TestQHttpHandler::testRedirect_data()
<< QRegExp("\\w+")
<< QString("/two")
<< QByteArray("one")
<< static_cast<int>(Socket::Found)
<< static_cast<int>(QHttpEngine::Socket::Found)
<< QByteArray("/two");
QTest::newRow("no match")
<< QRegExp("\\d+")
<< QString("")
<< QByteArray("test")
<< static_cast<int>(Socket::NotFound);
<< static_cast<int>(QHttpEngine::Socket::NotFound);
QTest::newRow("captured texts")
<< QRegExp("(\\d+)")
<< QString("/path/%1")
<< QByteArray("123")
<< static_cast<int>(Socket::Found)
<< static_cast<int>(QHttpEngine::Socket::Found)
<< QByteArray("/path/123");
}
@@ -97,18 +97,18 @@ void TestQHttpHandler::testRedirect()
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
client.sendHeaders("GET", path);
QTRY_VERIFY(socket.isHeadersParsed());
Handler handler;
QHttpEngine::Handler handler;
handler.addRedirect(pattern, destination);
handler.route(&socket, socket.path());
QTRY_COMPARE(client.statusCode(), statusCode);
if (statusCode == Socket::Found) {
if (statusCode == QHttpEngine::Socket::Found) {
QFETCH(QByteArray, location);
QCOMPARE(client.headers().value("Location"), location);
}
@@ -125,19 +125,19 @@ void TestQHttpHandler::testSubHandler_data()
<< QRegExp("\\w+")
<< QByteArray("test")
<< QString("")
<< static_cast<int>(Socket::OK);
<< static_cast<int>(QHttpEngine::Socket::OK);
QTest::newRow("no match")
<< QRegExp("\\d+")
<< QByteArray("test")
<< QString("")
<< static_cast<int>(Socket::NotFound);
<< static_cast<int>(QHttpEngine::Socket::NotFound);
QTest::newRow("path")
<< QRegExp("one/")
<< QByteArray("one/two")
<< QString("two")
<< static_cast<int>(Socket::OK);
<< static_cast<int>(QHttpEngine::Socket::OK);
}
void TestQHttpHandler::testSubHandler()
@@ -151,13 +151,13 @@ void TestQHttpHandler::testSubHandler()
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
client.sendHeaders("GET", path);
QTRY_VERIFY(socket.isHeadersParsed());
DummyHandler subHandler;
Handler handler;
QHttpEngine::Handler handler;
handler.addSubHandler(pattern, &subHandler);
handler.route(&socket, socket.path());

View File

@@ -29,15 +29,15 @@
#include "common/qsimplehttpclient.h"
#include "common/qsocketpair.h"
class DummyMiddleware : public Middleware
class DummyMiddleware : public QHttpEngine::Middleware
{
Q_OBJECT
public:
virtual bool process(Socket *socket)
virtual bool process(QHttpEngine::Socket *socket)
{
socket->writeError(Socket::Forbidden);
socket->writeError(QHttpEngine::Socket::Forbidden);
return false;
}
};
@@ -57,17 +57,17 @@ void TestQHttpMiddleware::testProcess()
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
client.sendHeaders("GET", "/");
QTRY_VERIFY(socket.isHeadersParsed());
DummyMiddleware middleware;
Handler handler;
QHttpEngine::Handler handler;
handler.addMiddleware(&middleware);
handler.route(&socket, "/");
QTRY_COMPARE(client.statusCode(), static_cast<int>(Socket::Forbidden));
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::Forbidden));
}
QTEST_MAIN(TestQHttpMiddleware)

View File

@@ -30,15 +30,15 @@
typedef QList<QByteArray> QByteArrayList;
Q_DECLARE_METATYPE(Socket::Method)
Q_DECLARE_METATYPE(Socket::QueryStringMap)
Q_DECLARE_METATYPE(Socket::HeaderMap)
Q_DECLARE_METATYPE(QHttpEngine::Socket::Method)
Q_DECLARE_METATYPE(QHttpEngine::Socket::QueryStringMap)
Q_DECLARE_METATYPE(QHttpEngine::Socket::HeaderMap)
const IByteArray Key1 = "a";
const QHttpEngine::IByteArray Key1 = "a";
const QByteArray Value1 = "b";
const QByteArray Line1 = Key1 + ": " + Value1;
const IByteArray Key2 = "c";
const QHttpEngine::IByteArray Key2 = "c";
const QByteArray Value2 = "d";
const QByteArray Line2 = Key2 + ": " + Value2;
@@ -72,7 +72,7 @@ private Q_SLOTS:
private:
Socket::HeaderMap headers;
QHttpEngine::Socket::HeaderMap headers;
};
TestQHttpParser::TestQHttpParser()
@@ -127,7 +127,7 @@ void TestQHttpParser::testSplit()
QFETCH(QByteArrayList, parts);
QByteArrayList outParts;
Parser::split(data, delim, maxSplit, outParts);
QHttpEngine::Parser::split(data, delim, maxSplit, outParts);
QCOMPARE(outParts, parts);
}
@@ -136,29 +136,29 @@ void TestQHttpParser::testParsePath_data()
{
QTest::addColumn<QByteArray>("rawPath");
QTest::addColumn<QString>("path");
QTest::addColumn<Socket::QueryStringMap>("map");
QTest::addColumn<QHttpEngine::Socket::QueryStringMap>("map");
QTest::newRow("no query string")
<< QByteArray("/path")
<< QString("/path")
<< Socket::QueryStringMap();
<< QHttpEngine::Socket::QueryStringMap();
QTest::newRow("single parameter")
<< QByteArray("/path?a=b")
<< QString("/path")
<< Socket::QueryStringMap{{"a", "b"}};
<< QHttpEngine::Socket::QueryStringMap{{"a", "b"}};
}
void TestQHttpParser::testParsePath()
{
QFETCH(QByteArray, rawPath);
QFETCH(QString, path);
QFETCH(Socket::QueryStringMap, map);
QFETCH(QHttpEngine::Socket::QueryStringMap, map);
QString outPath;
Socket::QueryStringMap outMap;
QHttpEngine::Socket::QueryStringMap outMap;
QVERIFY(Parser::parsePath(rawPath, outPath, outMap));
QVERIFY(QHttpEngine::Parser::parsePath(rawPath, outPath, outMap));
QCOMPARE(path, outPath);
QCOMPARE(map, outMap);
@@ -168,7 +168,7 @@ void TestQHttpParser::testParseHeaderList_data()
{
QTest::addColumn<bool>("success");
QTest::addColumn<QByteArrayList>("lines");
QTest::addColumn<Socket::HeaderMap>("headers");
QTest::addColumn<QHttpEngine::Socket::HeaderMap>("headers");
QTest::newRow("empty line")
<< false
@@ -185,11 +185,11 @@ void TestQHttpParser::testParseHeaderList()
QFETCH(bool, success);
QFETCH(QByteArrayList, lines);
Socket::HeaderMap outHeaders;
QCOMPARE(Parser::parseHeaderList(lines, outHeaders), success);
QHttpEngine::Socket::HeaderMap outHeaders;
QCOMPARE(QHttpEngine::Parser::parseHeaderList(lines, outHeaders), success);
if (success) {
QFETCH(Socket::HeaderMap, headers);
QFETCH(QHttpEngine::Socket::HeaderMap, headers);
QCOMPARE(outHeaders, headers);
}
}
@@ -216,9 +216,9 @@ void TestQHttpParser::testParseHeaders()
QFETCH(QByteArray, data);
QByteArrayList outParts;
Socket::HeaderMap outHeaders;
QHttpEngine::Socket::HeaderMap outHeaders;
QCOMPARE(Parser::parseHeaders(data, outParts, outHeaders), success);
QCOMPARE(QHttpEngine::Parser::parseHeaders(data, outParts, outHeaders), success);
if (success) {
QFETCH(QByteArrayList, parts);
@@ -230,7 +230,7 @@ void TestQHttpParser::testParseRequestHeaders_data()
{
QTest::addColumn<bool>("success");
QTest::addColumn<QByteArray>("data");
QTest::addColumn<Socket::Method>("method");
QTest::addColumn<QHttpEngine::Socket::Method>("method");
QTest::addColumn<QByteArray>("path");
QTest::newRow("bad HTTP version")
@@ -240,7 +240,7 @@ void TestQHttpParser::testParseRequestHeaders_data()
QTest::newRow("GET request")
<< true
<< QByteArray("GET / HTTP/1.0")
<< Socket::GET
<< QHttpEngine::Socket::GET
<< QByteArray("/");
}
@@ -249,14 +249,14 @@ void TestQHttpParser::testParseRequestHeaders()
QFETCH(bool, success);
QFETCH(QByteArray, data);
Socket::Method outMethod;
QHttpEngine::Socket::Method outMethod;
QByteArray outPath;
Socket::HeaderMap outHeaders;
QHttpEngine::Socket::HeaderMap outHeaders;
QCOMPARE(Parser::parseRequestHeaders(data, outMethod, outPath, outHeaders), success);
QCOMPARE(QHttpEngine::Parser::parseRequestHeaders(data, outMethod, outPath, outHeaders), success);
if (success) {
QFETCH(Socket::Method, method);
QFETCH(QHttpEngine::Socket::Method, method);
QFETCH(QByteArray, path);
QCOMPARE(method, outMethod);
@@ -289,9 +289,9 @@ void TestQHttpParser::testParseResponseHeaders()
int outStatusCode;
QByteArray outStatusReason;
Socket::HeaderMap outHeaders;
QHttpEngine::Socket::HeaderMap outHeaders;
QCOMPARE(Parser::parseResponseHeaders(data, outStatusCode, outStatusReason, outHeaders), success);
QCOMPARE(QHttpEngine::Parser::parseResponseHeaders(data, outStatusCode, outStatusReason, outHeaders), success);
if (success) {
QFETCH(int, statusCode);

View File

@@ -58,15 +58,15 @@ TestQHttpRange::TestQHttpRange()
void TestQHttpRange::testDefaultConstructor()
{
Range range;
QHttpEngine::Range range;
QCOMPARE(range.isValid(), false);
}
void TestQHttpRange::testAssignmentOperator()
{
Range range;
Range otherRange(100, 200, -1);
QHttpEngine::Range range;
QHttpEngine::Range otherRange(100, 200, -1);
range = otherRange;
@@ -110,7 +110,7 @@ void TestQHttpRange::testFromToLength()
QFETCH(int, to);
QFETCH(int, length);
Range range(inFrom, inTo, inDataSize);
QHttpEngine::Range range(inFrom, inTo, inDataSize);
QCOMPARE(range.from(), from);
QCOMPARE(range.to(), to);
@@ -162,7 +162,7 @@ void TestQHttpRange::testIsValid()
QFETCH(int, dataSize);
QFETCH(bool, valid);
Range range(from, to, dataSize);
QHttpEngine::Range range(from, to, dataSize);
QCOMPARE(range.isValid(), valid);
}
@@ -235,7 +235,7 @@ void TestQHttpRange::testParseFromString()
QFETCH(int, dataSize);
QFETCH(bool, valid);
Range range(data, dataSize);
QHttpEngine::Range range(data, dataSize);
QCOMPARE(range.isValid(), valid);
@@ -281,7 +281,7 @@ void TestQHttpRange::testContentRange()
QFETCH(int, dataSize);
QFETCH(QString, contentRange);
Range range(from, to, dataSize);
QHttpEngine::Range range(from, to, dataSize);
QCOMPARE(range.contentRange(), contentRange);
}

View File

@@ -37,7 +37,7 @@
#include "common/qsimplehttpclient.h"
class TestHandler : public Handler
class TestHandler : public QHttpEngine::Handler
{
Q_OBJECT
@@ -45,12 +45,12 @@ public:
TestHandler() : mSocket(0) {}
virtual void process(Socket *socket, const QString &path) {
virtual void process(QHttpEngine::Socket *socket, const QString &path) {
mSocket = socket;
mPath = path;
}
Socket *mSocket;
QHttpEngine::Socket *mSocket;
QString mPath;
};
@@ -70,7 +70,7 @@ private Q_SLOTS:
void TestQHttpServer::testServer()
{
TestHandler handler;
Server server(&handler);
QHttpEngine::Server server(&handler);
QVERIFY(server.listen(QHostAddress::LocalHost));
@@ -102,7 +102,7 @@ void TestQHttpServer::testSsl()
config.setPrivateKey(key);
config.setLocalCertificateChain(certs);
Server server;
QHttpEngine::Server server;
server.setSslConfiguration(config);
QVERIFY(server.listen(QHostAddress::LocalHost));

View File

@@ -32,7 +32,7 @@
#include "common/qsimplehttpclient.h"
#include "common/qsocketpair.h"
Q_DECLARE_METATYPE(Socket::QueryStringMap)
Q_DECLARE_METATYPE(QHttpEngine::Socket::QueryStringMap)
// Utility macro (avoids duplication) that creates a pair of connected
// sockets, a QSimpleHttpClient for the client and a QHttpSocket for the
@@ -41,7 +41,7 @@ Q_DECLARE_METATYPE(Socket::QueryStringMap)
QSocketPair pair; \
QTRY_VERIFY(pair.isConnected()); \
QSimpleHttpClient client(pair.client()); \
Socket server(pair.server())
QHttpEngine::Socket server(pair.server())
const QByteArray Method = "POST";
const QByteArray Path = "/test";
@@ -67,7 +67,7 @@ private Q_SLOTS:
private:
Socket::HeaderMap headers;
QHttpEngine::Socket::HeaderMap headers;
};
TestQHttpSocket::TestQHttpSocket()
@@ -82,7 +82,7 @@ void TestQHttpSocket::testProperties()
client.sendHeaders(Method, Path, headers);
QTRY_COMPARE(server.method(), Socket::POST);
QTRY_COMPARE(server.method(), QHttpEngine::Socket::POST);
QCOMPARE(server.rawPath(), Path);
QCOMPARE(server.headers(), headers);
@@ -120,7 +120,7 @@ void TestQHttpSocket::testRedirect()
server.writeRedirect(Path, true);
QTRY_COMPARE(client.statusCode(), static_cast<int>(Socket::MovedPermanently));
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::MovedPermanently));
QCOMPARE(client.headers().value("Location"), Path);
QTRY_COMPARE(disconnectedSpy.count(), 1);
}
@@ -170,7 +170,7 @@ void TestQHttpSocket::testJson()
QJsonObject object{{"a", "b"}, {"c", 123}};
QByteArray data = QJsonDocument(object).toJson();
client.sendHeaders(Method, Path, Socket::HeaderMap{
client.sendHeaders(Method, Path, QHttpEngine::Socket::HeaderMap{
{"Content-Length", QByteArray::number(data.length())},
{"Content-Type", "application/json"}
});

View File

@@ -31,8 +31,8 @@ const char *Value2 = "TEST";
// Helpful macros to cut down on the amount of duplicated code
#define TEST_OPERATOR(tn,t,on,o,v) void test##tn##on() \
{ \
QCOMPARE(IByteArray(Value1) o static_cast<t>(Value2), v); \
QCOMPARE(static_cast<t>(Value1) o IByteArray(Value1), v); \
QCOMPARE(QHttpEngine::IByteArray(Value1) o static_cast<t>(Value2), v); \
QCOMPARE(static_cast<t>(Value1) o QHttpEngine::IByteArray(Value1), v); \
}
#define TEST_TYPE(tn,t) \
TEST_OPERATOR(tn, t, Equals, ==, true) \
@@ -50,7 +50,7 @@ private Q_SLOTS:
TEST_TYPE(ConstChar, const char *)
TEST_TYPE(QByteArray, QByteArray)
TEST_TYPE(IByteArray, IByteArray)
TEST_TYPE(IByteArray, QHttpEngine::IByteArray)
TEST_TYPE(QString, QString)
void testContains();
@@ -58,7 +58,7 @@ private Q_SLOTS:
void TestQIByteArray::testContains()
{
IByteArray v(Value1);
QHttpEngine::IByteArray v(Value1);
QVERIFY(v.contains('t'));
QVERIFY(v.contains(Value2));

View File

@@ -55,7 +55,7 @@ void TestQIODeviceCopier::testQBuffer()
QByteArray destData;
QBuffer dest(&destData);
QIODeviceCopier copier(&src, &dest);
QHttpEngine::QIODeviceCopier copier(&src, &dest);
copier.setBufferSize(2);
QSignalSpy errorSpy(&copier, SIGNAL(error(QString)));
@@ -76,7 +76,7 @@ void TestQIODeviceCopier::testQTcpSocket()
QByteArray destData;
QBuffer dest(&destData);
QIODeviceCopier copier(pair.server(), &dest);
QHttpEngine::QIODeviceCopier copier(pair.server(), &dest);
copier.setBufferSize(2);
QSignalSpy errorSpy(&copier, SIGNAL(error(QString)));
@@ -100,7 +100,7 @@ void TestQIODeviceCopier::testStop()
QByteArray destData;
QBuffer dest(&destData);
QIODeviceCopier copier(pair.server(), &dest);
QHttpEngine::QIODeviceCopier copier(pair.server(), &dest);
copier.start();
@@ -141,7 +141,7 @@ void TestQIODeviceCopier::testRange()
QByteArray destData;
QBuffer dest(&destData);
QIODeviceCopier copier(&src, &dest);
QHttpEngine::QIODeviceCopier copier(&src, &dest);
copier.setBufferSize(bufferSize);
copier.setRange(from, to);

View File

@@ -51,9 +51,9 @@ void TestQLocalAuth::testAuth()
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
LocalAuthMiddleware localAuth;
QHttpEngine::LocalAuthMiddleware localAuth;
localAuth.setData(QVariantMap{
{CustomName, CustomData}
});
@@ -67,7 +67,7 @@ void TestQLocalAuth::testAuth()
QVERIFY(data.contains("token"));
QCOMPARE(data.value(CustomName).toByteArray(), CustomData);
client.sendHeaders("GET", "/", Socket::HeaderMap{
client.sendHeaders("GET", "/", QHttpEngine::Socket::HeaderMap{
{HeaderName, data.value("token").toByteArray()}
});
QTRY_VERIFY(socket.isHeadersParsed());

View File

@@ -46,7 +46,7 @@ void TestQLocalFile::initTestCase()
void TestQLocalFile::testOpen()
{
LocalFile file;
QHttpEngine::LocalFile file;
QVERIFY(file.open());
QVERIFY(file.remove());
}

View File

@@ -37,8 +37,8 @@ public Q_SLOTS:
void wrongArgumentCount() {}
void wrongArgumentType(int) {}
void valid(Socket *socket) {
socket->writeError(Socket::OK);
void valid(QHttpEngine::Socket *socket) {
socket->writeError(QHttpEngine::Socket::OK);
}
};
@@ -60,19 +60,19 @@ void TestQObjectHandler::testOldConnection_data()
QTest::newRow("invalid slot")
<< QByteArray(SLOT(invalid()))
<< static_cast<int>(Socket::InternalServerError);
<< static_cast<int>(QHttpEngine::Socket::InternalServerError);
QTest::newRow("wrong argument count")
<< QByteArray(SLOT(wrongArgumentCount()))
<< static_cast<int>(Socket::InternalServerError);
<< static_cast<int>(QHttpEngine::Socket::InternalServerError);
QTest::newRow("wrong argument type")
<< QByteArray(SLOT(wrongArgumentType(int)))
<< static_cast<int>(Socket::InternalServerError);
<< static_cast<int>(QHttpEngine::Socket::InternalServerError);
QTest::newRow("valid")
<< QByteArray(SLOT(valid(Socket*)))
<< static_cast<int>(Socket::OK);
<< static_cast<int>(QHttpEngine::Socket::OK);
}
void TestQObjectHandler::testOldConnection()
@@ -80,7 +80,7 @@ void TestQObjectHandler::testOldConnection()
QFETCH(QByteArray, slot);
QFETCH(int, statusCode);
QObjectHandler handler;
QHttpEngine::QObjectHandler handler;
DummyAPI api;
handler.registerMethod("test", &api, slot.constData());
@@ -89,7 +89,7 @@ void TestQObjectHandler::testOldConnection()
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
client.sendHeaders("GET", "test");
QTRY_VERIFY(socket.isHeadersParsed());
@@ -100,18 +100,18 @@ void TestQObjectHandler::testOldConnection()
void TestQObjectHandler::testNewConnection()
{
QObjectHandler handler;
QHttpEngine::QObjectHandler handler;
DummyAPI api;
// Connect to object slot
handler.registerMethod("0", &api, &DummyAPI::valid);
// Connect to functor
handler.registerMethod("1", [](Socket *socket) {
socket->writeError(Socket::OK);
handler.registerMethod("1", [](QHttpEngine::Socket *socket) {
socket->writeError(QHttpEngine::Socket::OK);
});
handler.registerMethod("2", &api, [](Socket *socket) {
socket->writeError(Socket::OK);
handler.registerMethod("2", &api, [](QHttpEngine::Socket *socket) {
socket->writeError(QHttpEngine::Socket::OK);
});
for (int i = 0; i < 3; ++i) {
@@ -119,13 +119,13 @@ void TestQObjectHandler::testNewConnection()
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server(), &pair);
QHttpEngine::Socket socket(pair.server(), &pair);
client.sendHeaders("GET", QByteArray::number(i));
QTRY_VERIFY(socket.isHeadersParsed());
handler.route(&socket, socket.path());
QTRY_COMPARE(client.statusCode(), static_cast<int>(Socket::OK));
QTRY_COMPARE(client.statusCode(), static_cast<int>(QHttpEngine::Socket::OK));
}
}

View File

@@ -47,27 +47,27 @@ private Q_SLOTS:
void TestQProxyHandler::testDataPassthrough()
{
// Create the upstream handler (simple echo)
QObjectHandler upstreamHandler;
upstreamHandler.registerMethod(Path, [](Socket *socket) {
QHttpEngine::QObjectHandler upstreamHandler;
upstreamHandler.registerMethod(Path, [](QHttpEngine::Socket *socket) {
socket->write(socket->readAll());
socket->close();
}, true);
// Create the upstream server and begin listening
Server upstreamServer(&upstreamHandler);
QHttpEngine::Server upstreamServer(&upstreamHandler);
QVERIFY(upstreamServer.listen(QHostAddress::LocalHost));
// Create the proxy handler
ProxyHandler handler(upstreamServer.serverAddress(), upstreamServer.serverPort());
QHttpEngine::ProxyHandler handler(upstreamServer.serverAddress(), upstreamServer.serverPort());
QSocketPair pair;
QTRY_VERIFY(pair.isConnected());
QSimpleHttpClient client(pair.client());
Socket socket(pair.server());
QHttpEngine::Socket socket(pair.server());
// Send the headers and wait for them to be parsed
Socket::HeaderMap headers{
QHttpEngine::Socket::HeaderMap headers{
{"Content-Length", QByteArray::number(Data.length())}
};
client.sendHeaders("POST", QString("/%1").arg(Path).toUtf8(), headers);

View File

@@ -33,7 +33,7 @@ QSimpleHttpClient::QSimpleHttpClient(QTcpSocket *socket)
onReadyRead();
}
void QSimpleHttpClient::sendHeaders(const QByteArray &method, const QByteArray &path, const Socket::HeaderMap &headers)
void QSimpleHttpClient::sendHeaders(const QByteArray &method, const QByteArray &path, const QHttpEngine::Socket::HeaderMap &headers)
{
QByteArray data = method + " " + path + " HTTP/1.0\r\n";
for (auto i = headers.constBegin(); i != headers.constEnd(); ++i) {
@@ -59,7 +59,7 @@ void QSimpleHttpClient::onReadyRead()
// Parse the headers if the double CRLF sequence was found
int index = mBuffer.indexOf("\r\n\r\n");
if (index != -1) {
Parser::parseResponseHeaders(mBuffer.left(index), mStatusCode, mStatusReason, mHeaders);
QHttpEngine::Parser::parseResponseHeaders(mBuffer.left(index), mStatusCode, mStatusReason, mHeaders);
mHeadersParsed = true;
mData.append(mBuffer.mid(index + 4));

View File

@@ -45,7 +45,7 @@ public:
QSimpleHttpClient(QTcpSocket *socket);
void sendHeaders(const QByteArray &method, const QByteArray &path, const Socket::HeaderMap &headers=Socket::HeaderMap());
void sendHeaders(const QByteArray &method, const QByteArray &path, const QHttpEngine::Socket::HeaderMap &headers = QHttpEngine::Socket::HeaderMap());
void sendData(const QByteArray &data);
int statusCode() const {
@@ -56,7 +56,7 @@ public:
return mStatusReason;
}
Socket::HeaderMap headers() const {
QHttpEngine::Socket::HeaderMap headers() const {
return mHeaders;
}
@@ -79,7 +79,7 @@ private:
int mStatusCode;
QByteArray mStatusReason;
Socket::HeaderMap mHeaders;
QHttpEngine::Socket::HeaderMap mHeaders;
QByteArray mData;
};