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();
26 resp->set_http_version(
"HTTP/1.1");
27 resp->set_status_code(
"200");
28 resp->set_reason_phrase(
"OK");
30 const char* buf = req->get_request_uri();
33 while (*buf && *buf !=
'/') buf++;
36 const char* exten = p - 1;
37 while (*exten && *exten !=
'.') 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";
44 std::string abs_path(buf, p - buf);
45 abs_path =
m_root + abs_path;
47 resp->set_header_pair(
"Content-Type", content_type);
49 int fd = open(abs_path.c_str(), O_RDONLY);
51 size_t size = lseek(fd, 0, SEEK_END);
52 void* buf = malloc(size);
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();
58 protocol::HttpResponse* resp = (protocol::HttpResponse*)task->user_data;
63 resp->set_status_code(
"503");
64 resp->append_output_body(
"<html>503 Internal Server Error.</html>");
66 resp->append_output_body(args->buf, ret);
71 pread_task->user_data = resp;
72 server_task->user_data = buf;
73 server_task->set_callback([](WFHttpTask* t) { free(t->user_data); });
74 series_of(server_task)->push_back(pread_task);
76 resp->set_status_code(
"404");
77 resp->append_output_body(
"<html>404 Not Found.</html>");
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");
91 fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic,
92 "[ info ] server successfully started.\n");
94 perror(
"Cannot start server");