acl/app/wizard/tmpl/http/main_threads.cpp
2023-05-21 22:10:02 +08:00

193 lines
5.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "stdafx.h"
#include "master_service.h"
#include "http_service.h"
#include "websocket.h"
#if __cplusplus >= 201103L // Support c++11 ?
# define USE_LAMBDA
#endif
#ifndef USE_LAMBDA
static bool http_get_default(const char* path, HttpRequest& req, HttpResponse& res)
{
acl::string buf, method_buf;
acl::http_method_t method = req.getMethod(&method_buf);
buf.format("%s: hello world!, method=%d, %s\r\n",
path, (int) method, method_buf.c_str());
res.setContentLength(buf.size());
return res.write(buf);
}
#endif
static bool http_get_root(HttpRequest&, HttpResponse& res)
{
acl::string buf("hello world!\r\n");
res.setContentLength(buf.size());
return res.write(buf);
}
static bool http_get_ok(HttpRequest&, HttpResponse& res)
{
acl::string buf("ok: hello world!\r\n");
res.setContentLength(buf.size());
return res.write(buf);
}
static bool http_post_ok(HttpRequest& req, HttpResponse& res)
{
acl::string buf;
if (!req.getBody(buf)) {
printf("getBody error!\r\n");
return false;
}
printf("body: %s\r\n", buf.c_str());
res.setContentLength(buf.size());
return res.write(buf);
}
static bool http_get_json(HttpRequest&, HttpResponse& res)
{
acl::json json;
acl::json_node& root = json.get_root();
root.add_number("code", 200)
.add_text("status", "+ok")
.add_child("data",
json.create_node()
.add_text("name", "value")
.add_bool("success", true)
.add_number("number", 100));
return res.write(json);
}
static bool http_get_xml(HttpRequest&, HttpResponse& res)
{
acl::xml1 xml;
acl::xml_node& root = xml.get_root();
root.add_child("test6", true, "text6")
.add_child("test61", true, "text61")
.add_attr("name61_1", "value61_1")
.add_attr("name61_2", "value61_2")
.add_attr("name61_3", "value61_3")
.add_child("test611", true, "text611")
.add_attr("name611_1", "value611_1")
.add_attr("name611_2", "value611_2")
.add_attr("name611_3", "value611_3")
.get_parent()
.get_parent()
.add_child("test62", true, "text62")
.add_attr("name62_1", "value62_1")
.add_attr("name62_2", "value62_2")
.add_attr("name62_3", "value62_3")
.get_parent()
.add_attr("name6_1", "value6_1")
.add_attr("name6_2", "value6_2")
.add_attr("name6_3", "value6_3");
return res.write(xml);
}
int main(int argc, char* argv[])
{
// <20><>ʼ<EFBFBD><CABC> acl <20><>
acl::acl_cpp_init();
master_service ms;
http_service& service = ms.get_service();;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>
ms.set_cfg_int(var_conf_int_tab)
.set_cfg_int64(var_conf_int64_tab)
.set_cfg_str(var_conf_str_tab)
.set_cfg_bool(var_conf_bool_tab);
// Register http handlers according different url path
service.Get("/", http_get_root)
.Get("/ok", http_get_ok)
.Post("/ok", http_post_ok)
.Get("/json", http_get_json)
.Get("/xml", http_get_xml)
#ifdef USE_LAMBDA
.Get("/test1", [](HttpRequest&, HttpResponse& res) {
acl::string buf("test1: hello world!\r\n");
res.setContentLength(buf.size());
return res.write(buf);
}).Get("/test2", [&](HttpRequest&, HttpResponse& res) {
acl::string buf("test2: hello world!\r\n");
res.setContentLength(buf.size());
return res.write(buf);
}).Default([](const char* path, HttpRequest&, HttpResponse& res) {
acl::string buf;
buf.format("Default(%s): hello world!\r\n", path);
res.setContentLength(buf.size());
return res.write(buf);
}).Websocket("/", [](HttpRequest& req, HttpResponse& res) {
return websocket_run(req, res);
});
#else
.Websocket("/", websocket_run)
.Default(http_get_default);
#endif
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
if (argc == 1 || (argc >= 2 && strcmp(argv[1], "alone") == 0)) {
// <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
acl::log::stdout_open(true);
// <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD> acl_master.log <20><>־
acl::master_log_enable(false);
// <20><><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ip|port1,ip|port2,...
const char* addrs = "|8888";
printf("listen on: %s\r\n", addrs);
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ø<EFBFBD>ֵ > 0 <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9>̵<EFBFBD>
// <20><EFBFBD><E1BBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Ӵӽ<D3B4><D3BD>յ<EFBFBD><D5B5>رճ<D8B1>֮Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><E1BBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻỰ<D3BB><E1BBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9>̽<EFBFBD><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
// Ϊ 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int count = 0;
// <20><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>̳߳<DFB3><CCB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯߳<DFB3><CCB8><EFBFBD>
unsigned int max_threads = 100;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD>ʽ
if (argc >= 3) {
ms.run_alone(addrs, argv[2], count, max_threads);
} else {
ms.run_alone(addrs, NULL, count, max_threads);
}
printf("Enter any key to exit now\r\n");
getchar();
} else {
#if defined(_WIN32) || defined(_WIN64)
// <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>
acl::log::stdout_open(true);
// <20><><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ip:port1,ip:port2,...
const char* addrs = "127.0.0.1:8888";
printf("listen on: %s\r\n", addrs);
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ø<EFBFBD>ֵ > 0 <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9>̵<EFBFBD>
// <20><EFBFBD><E1BBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Ӵӽ<D3B4><D3BD>յ<EFBFBD><D5B5>رճ<D8B1>֮Ϊһ<CEAA><D2BB><EFBFBD><EFBFBD><E1BBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻỰ<D3BB><E1BBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9>̽<EFBFBD><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
// Ϊ 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned int count = 0;
// <20><><EFBFBD>Թ<EFBFBD><D4B9><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>̳߳<DFB3><CCB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯߳<DFB3><CCB8><EFBFBD>
unsigned int max_threads = 100;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD>ʽ
ms.run_alone(addrs, NULL, count, max_threads);
printf("Enter any key to exit now\r\n");
getchar();
#else
// acl_master <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>
ms.run_daemon(argc, argv);
#endif
}
return 0;
}