#ifndef HTTPSERVER_H #define HTTPSERVER_H #include #include #include const QString HTTP_ACTUAL_ETAG {"2021-12-05"}; // Change it if svg, css or ico was modified class HttpServer : public QObject { Q_OBJECT public: explicit HttpServer(const QString& address, quint16 port, const QString& logFolder, const QString& mainChannel, QObject *parent = nullptr); ~HttpServer(); private: QString convertToClickableLink(const QString &httpLine); std::pair splitUserNameAndMessage(const QString& rawLine); QString getRequestPath(const QString &req); QString getWordFromPath(const QString& path); void writeMainPage(QTcpSocket* socket, QString& urlPath, bool isHeadRequest); void writeErrorPage(QTcpSocket*); void removeBrakelineSymbols(QString& line); void replaceTag(QString& page, const QString& tag, const QString& payload); void consoleLog(const QString &message); void debugLog(const QString &url); QTcpServer* m_TcpServer; QString m_mainChannel; QString m_logFolder; std::map> m_backendInfo; // server, {channel, users} std::map m_serversOnline; std::map m_botsNick; const QString HEADER_HTML = "\ HTTP/1.1 200 OK\r\n\ Content-Type: text/html; charset=utf-8\r\n\ Content-Length: {{SIZE}}\r\n\r\n"; const QString HEADER_TEXT = "\ HTTP/1.1 200 OK\r\n\ Content-Type: text/plain; charset=utf-8\r\n\ Content-Length: {{SIZE}}\r\n\r\n"; const QString HEADER_CSS = "\ HTTP/1.1 200 OK\r\n\ Content-Type: text/css\r\n\ Cache-Control: public, max-age=31536000\r\n\ ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\ Content-Length: {{SIZE}}\r\n\r\n"; const QString HEADER_SVG = "\ HTTP/1.1 200 OK\r\n\ Content-Type: image/svg+xml\r\n\ Cache-Control: public, max-age=31536000\r\n\ ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\ Content-Length: {{SIZE}}\r\n\r\n"; const QString HEADER_ICO = "\ HTTP/1.1 200 OK\r\n\ Content-Type: image/ico\r\n\ Cache-Control: public, max-age=31536000\r\n\ ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\ Content-Length: {{SIZE}}\r\n\r\n"; const QString HEADER_304 = "HTTP/1.1 304 Not Modified\r\nContent-Length: 0\r\n\r\n"; const QString HEADER_404 = "HTTP/1.1 404 Not found\r\n\r\n"; const QString HTML_SERVER_SECTION = "\
\n\
\n\ {{ONLINE_STATUS}}{{SERVER_NAME}}\n\
\n\
\n\ {{CHANNELS}}\
\n\
\n"; const QString HTML_SERVER_ONLINE_MARKER = "✅"; const QString HTML_SERVER_OFFLINE_MARKER = "❌"; const QString HTML_SERVER_SECTION_CHANNEL = "\ {{CHANNEL_NAME}}\n"; const QString HTML_SERVER_SECTION_CHANNEL_SELECTED = "\ {{CHANNEL_NAME}}\n"; const QString HTML_ONLINE_POINT = "\
\n\ {{NICKNAME}}\n\
\n"; const QString HTML_PAYLOAD_LIST_POINT_FOLDER = "\ \n\
\n\
\n\
\n\ {{POINT_CONTENT}}\n\
\n\
\n"; const QString HTML_PAYLOAD_LIST_POINT_MESSAGE = "\ \n\
\n\
\n\
\n\ {{POINT_CONTENT}}\n\
\n\
\n"; const QString HTML_PAYLOAD_LIST_CHAT_MESSAGE = "\
\n\
\n\ {{USERNAME}}\n\
\n\
\n\ {{MESSAGE_TEXT}}\n\
\n\
\n"; const QString HTML_PAYLOAD_ERROR = "\
\n\ {{ERROR_TITLE}}
\n\ {{ERROR_TEXT}}\n\
"; private slots: void acceptor(); void reader(); public slots: void ircBotFirstInfo(QString server, QStringList channels); // needed for permanent offline servers void ircClientAction(QString server, QString channel, QStringList users); void ircServerOnline(QString server, quint8 status /*0 or 1*/); void ircBotNic(QString server, QString nickname); }; #endif // HTTPSERVER_H