httpserver.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #ifndef HTTPSERVER_H
  2. #define HTTPSERVER_H
  3. #include <QObject>
  4. #include <QTcpServer>
  5. #include <map>
  6. const QString HTTP_ACTUAL_ETAG {"2021-12-24"}; // Change it if svg, css or ico was modified
  7. class HttpServer : public QObject
  8. {
  9. Q_OBJECT
  10. public:
  11. explicit HttpServer(const QString& address, quint16 port, const QString& logFolder, const QString& mainChannel, QObject *parent = nullptr);
  12. ~HttpServer();
  13. private:
  14. QString convertToClickableLink(const QString &httpLine);
  15. std::pair<QString,QString> splitUserNameAndMessage(const QString& rawLine);
  16. QString getRequestPath(const QString &req);
  17. QString getWordFromPath(const QString& path);
  18. void writeMainPage(QTcpSocket* socket, QString& urlPath, bool isHeadRequest);
  19. void writeErrorPage(QTcpSocket*);
  20. void removeBrakelineSymbols(QString& line);
  21. void replaceTag(QString& page, const QString& tag, const QString& payload);
  22. void consoleLog(const QString &message);
  23. void debugLog(const QString &url);
  24. QTcpServer* m_TcpServer;
  25. QString m_mainChannel;
  26. QString m_logFolder;
  27. std::map<QString, std::map<QString, QStringList>> m_onlineUsers; // server, {channel, users}
  28. std::map<QString, std::map<QString, QString>> m_channelsTopic; // server, {channel, topic}
  29. std::map<QString, bool> m_serversOnline;
  30. std::map<QString, QString> m_botsNick;
  31. const QString HEADER_HTML = "\
  32. HTTP/1.1 200 OK\r\n\
  33. Content-Type: text/html; charset=utf-8\r\n\
  34. Content-Length: {{SIZE}}\r\n\r\n";
  35. const QString HEADER_TEXT = "\
  36. HTTP/1.1 200 OK\r\n\
  37. Content-Type: text/plain; charset=utf-8\r\n\
  38. Content-Length: {{SIZE}}\r\n\r\n";
  39. const QString HEADER_CSS = "\
  40. HTTP/1.1 200 OK\r\n\
  41. Content-Type: text/css\r\n\
  42. Cache-Control: public, max-age=31536000\r\n\
  43. ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\
  44. Content-Length: {{SIZE}}\r\n\r\n";
  45. const QString HEADER_SVG = "\
  46. HTTP/1.1 200 OK\r\n\
  47. Content-Type: image/svg+xml\r\n\
  48. Cache-Control: public, max-age=31536000\r\n\
  49. ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\
  50. Content-Length: {{SIZE}}\r\n\r\n";
  51. const QString HEADER_ICO = "\
  52. HTTP/1.1 200 OK\r\n\
  53. Content-Type: image/ico\r\n\
  54. Cache-Control: public, max-age=31536000\r\n\
  55. ETag: \""+HTTP_ACTUAL_ETAG+"\"\r\n\
  56. Content-Length: {{SIZE}}\r\n\r\n";
  57. const QString HEADER_304 = "HTTP/1.1 304 Not Modified\r\nContent-Length: 0\r\n\r\n";
  58. const QString HEADER_404 = "HTTP/1.1 404 Not found\r\n\r\n";
  59. const QString HTML_SERVER_SECTION = "\
  60. <div class=\"left_menu__item\">\n\
  61. <div class=\"left_menu__item_title\">\n\
  62. <span style=\"font-size: 17px;\">{{ONLINE_STATUS}}</span>{{SERVER_NAME}}\n\
  63. </div>\n\
  64. <div class=\"left_menu__item_rooms\">\n\
  65. {{CHANNELS}}\
  66. </div>\n\
  67. </div>\n";
  68. const QString HTML_SERVER_ONLINE_MARKER = "&#9989;";
  69. const QString HTML_SERVER_OFFLINE_MARKER = "&#10060;";
  70. const QString HTML_SERVER_SECTION_CHANNEL = "\
  71. <a href=\"{{CHANNEL_LINK}}\" class=\"left_menu__item_link\">{{CHANNEL_NAME}}</a>\n";
  72. const QString HTML_SERVER_SECTION_CHANNEL_SELECTED = "\
  73. <a href=\"{{CHANNEL_LINK}}\" class=\"left_menu__item_link__selected\">{{CHANNEL_NAME}}</a>\n";
  74. const QString HTML_ONLINE_POINT = "\
  75. <div class=\"main_middle__online_point\">\n\
  76. {{NICKNAME}}\n\
  77. </div>\n";
  78. const QString HTML_PAYLOAD_LIST_POINT_FOLDER = "\
  79. <a href=\"{{POINT_LINK}}\" class=\"main_payload__block\">\n\
  80. <div class=\"main_payload__block_folder\">\n\
  81. </div>\n\
  82. <div class=\"main_payload__block_text\">\n\
  83. {{POINT_CONTENT}}\n\
  84. </div>\n\
  85. </a>\n";
  86. const QString HTML_PAYLOAD_LIST_POINT_MESSAGE = "\
  87. <a href=\"{{POINT_LINK}}\" class=\"main_payload__block\">\n\
  88. <div class=\"main_payload__block_message\">\n\
  89. </div>\n\
  90. <div class=\"main_payload__block_text\">\n\
  91. {{POINT_CONTENT}}\n\
  92. </div>\n\
  93. </a>\n";
  94. const QString HTML_PAYLOAD_LIST_CHAT_MESSAGE = "\
  95. <div class=\"main_payload__chat\">\n\
  96. <div class=\"main_payload__chat_username\">\n\
  97. {{USERNAME}}\n\
  98. </div>\n\
  99. <div class=\"main_payload__chat_mail\">\n\
  100. {{MESSAGE_TEXT}}\n\
  101. </div>\n\
  102. </div>\n";
  103. const QString HTML_PAYLOAD_ERROR = "\
  104. <div class=\"main_payload__error\">\n\
  105. <span style=\"color: red; display: block; font-size: 24px;\">{{ERROR_TITLE}}</span><br>\n\
  106. {{ERROR_TEXT}}\n\
  107. </div>";
  108. private slots:
  109. void acceptor();
  110. void reader();
  111. public slots:
  112. void ircBotFirstInfo(QString server, QStringList channels); // needed for permanent offline servers
  113. void ircUsersOnline(QString server, QString channel, QStringList users);
  114. void ircChannelTopic(QString server, QString channel, QString topic);
  115. void ircServerOnline(QString server, quint8 status /*0 or 1*/);
  116. void ircBotNick(QString server, QString nickname);
  117. };
  118. #endif // HTTPSERVER_H