HttpServerPage.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "HttpServerPage.h"
  2. #include <QBoxLayout>
  3. #include "mainwindow.h"
  4. HttpServerPage::HttpServerPage(QWidget *parent) : QWidget(parent)
  5. {
  6. server = nullptr;
  7. service = nullptr;
  8. ws = nullptr;
  9. initUI();
  10. initConnect();
  11. }
  12. HttpServerPage::~HttpServerPage()
  13. {
  14. stop();
  15. }
  16. void HttpServerPage::initUI()
  17. {
  18. QHBoxLayout* hbox = new QHBoxLayout;
  19. // host
  20. hbox->addWidget(new QLabel("host:"));
  21. hostEdt = new QLineEdit("0.0.0.0");
  22. hbox->addWidget(hostEdt);
  23. // port
  24. hbox->addWidget(new QLabel("port:"));
  25. portEdt = new QLineEdit("8080");
  26. hbox->addWidget(portEdt);
  27. // start
  28. startBtn = new QPushButton("start");
  29. hbox->addWidget(startBtn);
  30. // stop
  31. stopBtn = new QPushButton("stop");
  32. stopBtn->setEnabled(false);
  33. hbox->addWidget(stopBtn);
  34. setLayout(hbox);
  35. }
  36. void HttpServerPage::initConnect()
  37. {
  38. connect(startBtn, &QPushButton::clicked, [this]() {
  39. std::string host = hostEdt->text().toStdString();
  40. int port = portEdt->text().toInt();
  41. if (start(port, host.c_str())) {
  42. startBtn->setEnabled(false);
  43. stopBtn->setEnabled(true);
  44. g_mainwnd->appendMessage(QString::asprintf("HTTP server running on %s:%d ...", host.c_str(), port));
  45. } else {
  46. g_mainwnd->appendMessage(QString::asprintf("HTTP server start failed!"));
  47. }
  48. });
  49. connect(stopBtn, &QPushButton::clicked, [this]() {
  50. stop();
  51. startBtn->setEnabled(true);
  52. stopBtn->setEnabled(false);
  53. g_mainwnd->appendMessage("HTTP server stopped!");
  54. });
  55. }
  56. bool HttpServerPage::start(int port, const char* host)
  57. {
  58. service = new hv::HttpService;
  59. service->document_root = ".";
  60. service->home_page = "index.html";
  61. service->preprocessor = [](HttpRequest* req, HttpResponse* resp) {
  62. g_mainwnd->postMessage(QString("received http request:\n") + QString::fromStdString(req->Dump(true, true)));
  63. return 0;
  64. };
  65. service->POST("/echo", [](const HttpContextPtr& ctx) {
  66. // echo
  67. return ctx->send(ctx->body(), ctx->type());
  68. });
  69. service->postprocessor = [](HttpRequest* req, HttpResponse* resp) {
  70. g_mainwnd->postMessage(QString("send http response:\n") + QString::fromStdString(resp->Dump(true, true)));
  71. return 0;
  72. };
  73. ws = new hv::WebSocketService;
  74. ws->onopen = [](const WebSocketChannelPtr& channel, const HttpRequestPtr& req) {
  75. g_mainwnd->postMessage(QString("ws onopen: ") + QString::fromStdString(req->Path()));
  76. };
  77. ws->onmessage = [](const WebSocketChannelPtr& channel, const std::string& msg) {
  78. g_mainwnd->postMessage(QString("ws onmessage: ") + QString::fromStdString(msg));
  79. // echo
  80. channel->send(msg);
  81. };
  82. ws->onclose = [](const WebSocketChannelPtr& channel) {
  83. g_mainwnd->postMessage("ws onclose");
  84. };
  85. server = new hv::WebSocketServer;
  86. server->registerHttpService(service);
  87. server->registerWebSocketService(ws);
  88. server->setHost(host);
  89. server->setPort(port);
  90. server->setThreadNum(1);
  91. return server->start() == 0;
  92. }
  93. void HttpServerPage::stop()
  94. {
  95. SAFE_DELETE(server);
  96. SAFE_DELETE(service);
  97. SAFE_DELETE(ws);
  98. }