1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "networkcontroller.h"
NetworkController::NetworkController(QObject *parent) :
QObject(parent)
{
QObject::connect(&m_server, &QTcpServer::newConnection, this, &NetworkController::newConnection);
if (!m_server.listen(QHostAddress::Any, 8080)) {
qDebug() << "Failed to run http server";
}
}
void NetworkController::newConnection()
{
QTcpSocket *socket = m_server.nextPendingConnection();
if (!socket)
return;
QObject::connect(socket, &QAbstractSocket::disconnected, this, &NetworkController::disconnected);
QObject::connect(socket, &QIODevice::readyRead, this, &NetworkController::readyRead);
}
void NetworkController::disconnected()
{
QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
if (!socket)
return;
socket->disconnect();
socket->deleteLater();
}
void NetworkController::readyRead()
{
QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
if (!socket || socket->state() == QTcpSocket::ClosingState)
return;
QString requestData = socket->readAll();
QStringList list = requestData.split(' ');
QString path = list[1];
list = path.split('/');
QByteArray reply;
if (list.count() == 3) {
socket->write("HTTP/1.1 200 OK\r\n");
reply = QStringLiteral("Command accepted: %1 %2").arg(list[1], list[2]).toUtf8();
emit commandAccepted(list[1], list[2]);
} else {
socket->write("HTTP/1.1 404 Not Found\r\n");
reply = "Command rejected";
}
socket->write("Content-Type: text/plain\r\n");
socket->write(QStringLiteral("Content-Length: %1\r\n").arg(reply.size()).toUtf8());
socket->write("Connection: close\r\n");
socket->write("\r\n");
socket->write(reply);
socket->disconnectFromHost();
}
|