Covalent Bond  0.0.1-alpha
'covalent bond' is a data middle office. As a 2022-2023 Fall SWE final project.
cbWebserver.cpp
Go to the documentation of this file.
1 
11 #include "cbWebserver.hpp"
12 
13 namespace cb {
14 namespace utils {
15 
17 
18 cbWebserver::cbWebserver(const int32_t& port, const std::string& root)
19  : m_port(port), m_root(root) {
20  m_server = new WFHttpServer([=](WFHttpTask* server_task) -> void {
21  protocol::HttpRequest* req = server_task->get_req();
22  protocol::HttpResponse* resp = server_task->get_resp();
23 
24  /* Set response message body. */
25  /* Set status line if you like. */
26  resp->set_http_version("HTTP/1.1");
27  resp->set_status_code("200");
28  resp->set_reason_phrase("OK");
29 
30  const char* buf = req->get_request_uri();
31  const char* p = buf;
32  // printf("Request-UTI: %s\n", buf);
33  while (*buf && *buf != '/') buf++;
34  while (*p) p++;
35 
36  const char* exten = p - 1;
37  while (*exten && *exten != '.') exten--;
38  exten++;
39  std::string file_name_extension(exten, p - exten);
40  if (file_name_extension == "js") file_name_extension = "javascript";
41  std::string content_type = "text/" + file_name_extension;
42  if (file_name_extension == "svg") content_type = "image/" + file_name_extension + "+xml";
43 
44  std::string abs_path(buf, p - buf);
45  abs_path = m_root + abs_path;
46 
47  resp->set_header_pair("Content-Type", content_type);
48 
49  int fd = open(abs_path.c_str(), O_RDONLY);
50  if (fd >= 0) {
51  size_t size = lseek(fd, 0, SEEK_END);
52  void* buf = malloc(size); /* As an example, assert(buf != NULL); */
53  WFFileIOTask* pread_task;
54  pread_task = WFTaskFactory::create_pread_task(fd, buf, size, 0, [=](WFFileIOTask* task) {
55  FileIOArgs* args = task->get_args();
56  long ret = task->get_retval();
57  // std::cout << ret << std::endl;
58  protocol::HttpResponse* resp = (protocol::HttpResponse*)task->user_data;
59 
60  /* close fd only when you created File IO task with **fd** interface. */
61  close(args->fd);
62  if (ret < 0) {
63  resp->set_status_code("503");
64  resp->append_output_body("<html>503 Internal Server Error.</html>");
65  } else /* Use '_nocopy' carefully. */
66  resp->append_output_body(args->buf, ret);
67  });
68 
69  /* To implement a more complicated server, please use series' context
70  * instead of tasks' user_data to pass/store internal data. */
71  pread_task->user_data = resp; /* pass resp pointer to pread task. */
72  server_task->user_data = buf; /* to free() in callback() */
73  server_task->set_callback([](WFHttpTask* t) { free(t->user_data); });
74  series_of(server_task)->push_back(pread_task);
75  } else {
76  resp->set_status_code("404");
77  resp->append_output_body("<html>404 Not Found.</html>");
78  }
79  });
80 }
81 
83  fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
84  "[ info ] Get the ./index.html file. Start HTTP server at {}{}/index.html\n",
85  "http://localhost:", m_port);
86  fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
87  "[ info ] Press ^C to stop server.\n");
88 
89  signal(SIGTERM, signal_kill);
90  if (m_server->start(m_port) == 0) {
91  fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
92  "[ info ] server successfully started.\n");
93  } else {
94  perror("Cannot start server");
95  exit(1);
96  }
97 }
98 
99 void cbWebserver::stopMain() { m_server->stop(); }
100 
101 WFHttpServer* cbWebserver::getServer() { return m_server; }
102 
103 void cbWebserver::signal_kill(int signo) {}
104 
105 } // namespace utils
106 } // namespace cb
cb::utils::cbWebserver::m_root
std::string m_root
Definition: cbWebserver.hpp:86
cb::utils::cbWebserver::~cbWebserver
~cbWebserver()
Definition: cbWebserver.cpp:16
cb::utils::cbWebserver::getServer
WFHttpServer * getServer()
Get the Server object.
Definition: cbWebserver.cpp:101
cb
_WIN32
Definition: api.cpp:4
cb::utils::cbWebserver::stopMain
void stopMain()
Definition: cbWebserver.cpp:99
cbWebserver.hpp
cb::utils::cbWebserver::cbWebserver
cbWebserver()=default
cb::utils::cbWebserver::signal_kill
static void signal_kill(int signo)
Definition: cbWebserver.cpp:103
cb::utils::cbWebserver::execMain
void execMain()
Definition: cbWebserver.cpp:82
cb::utils::cbWebserver::m_port
int32_t m_port
Definition: cbWebserver.hpp:85
cb::utils::cbWebserver::m_server
WFHttpServer * m_server
Definition: cbWebserver.hpp:87