#include "../src/MapWidget.h" #include #include #include #include #include #include #include #include int main(int argc, char **argv) { QApplication app(argc, argv); QTcpServer tileServer; assert(tileServer.listen(QHostAddress::LocalHost, 0)); int requestCount = 0; QSet requestedPaths; QObject::connect(&tileServer, &QTcpServer::newConnection, [&]() { while (tileServer.hasPendingConnections()) { QTcpSocket *socket = tileServer.nextPendingConnection(); const auto respond = [&, socket]() { if (!socket->canReadLine()) { return; } const QByteArray requestLine = socket->readLine().trimmed(); const QList fields = requestLine.split(' '); if (fields.size() >= 2) { ++requestCount; requestedPaths.insert(fields[1]); } socket->readAll(); socket->write("HTTP/1.1 503 Service Unavailable\r\n" "Content-Length: 0\r\n" "Connection: close\r\n\r\n"); socket->disconnectFromHost(); }; QObject::connect(socket, &QTcpSocket::readyRead, socket, respond); QObject::connect(socket, &QTcpSocket::disconnected, socket, &QObject::deleteLater); respond(); } }); const QByteArray tileUrl = QByteArray("http://127.0.0.1:") + QByteArray::number(tileServer.serverPort()) + "/{z}/{x}/{y}.png"; qputenv("LOCATION_PLOTTER_TILE_URL_TEMPLATE", tileUrl); { MapWidget map; map.resize(640, 480); map.show(); QElapsedTimer timer; timer.start(); while (timer.elapsed() < 1200) { app.processEvents(QEventLoop::AllEvents, 50); QThread::msleep(5); } // Every URL fails. Seeing any URL more than once proves that a failed // tile schedules a new paint/request instead of remaining a blank // placeholder forever. assert(!requestedPaths.isEmpty()); assert(requestCount > requestedPaths.size()); } qunsetenv("LOCATION_PLOTTER_TILE_URL_TEMPLATE"); return 0; }