acl  3.5.3.0
http_server_impl.hpp
浏览该文件的文档.
1 #pragma once
2 
3 #include "../master_fiber.hpp"
4 #include "../http_servlet.hpp"
5 #include "../go_fiber.hpp"
6 
7 namespace acl {
8 
9 typedef std::function<void()> proc_jail_t;
10 typedef std::function<void()> proc_init_t;
11 typedef std::function<void()> proc_exit_t;
12 typedef std::function<bool(acl::string&)> proc_sighup_t;
13 typedef std::function<void()> thread_init_t;
14 typedef std::function<bool(acl::socket_stream&)> thread_accept_t;
15 
17 public:
18  http_server_impl(const char* addr, bool use_redis) {
19  if (use_redis) {
21  redis_->init(NULL, addr, 0, 10, 10);
22  redis_->bind_thread(true);
23  }
24  }
25 
26  virtual ~http_server_impl(void) {}
27 
28 protected:
29  void Service(int type, const char* path, http_handler_t fn) {
30  if (type >= http_handler_get && type < http_handler_max
31  && path && *path) {
32 
33  // The path should lookup like as "/xxx/" with
34  // lower charactors.
35 
36  acl::string buf(path);
37  if (buf[buf.size() - 1] != '/') {
38  buf += '/';
39  }
40  buf.lower();
41  handlers_[type][buf] = std::move(fn);
42  }
43  }
44 
45 protected:
54 
55  // @override
56  void on_accept(socket_stream& conn) {
57  if (thread_accept_ && !thread_accept_(conn)) {
58  return;
59  }
60 
62  if (redis_) {
63  session = new redis_session(*redis_, 0);
64  } else {
65  session = new memcache_session("127.0.0.1|11211");
66  }
67 
68  http_servlet servlet(handlers_, &conn, session);
69  servlet.setLocalCharset("utf-8");
70 
71  while (servlet.doRun()) {}
72 
73  delete session;
74  }
75 
76  // @override
77  void proc_pre_jail(void) {
78  if (proc_jail_) {
79  proc_jail_();
80  }
81  }
82 
83  // @override
84  void proc_on_init(void) {
85  if (proc_init_) {
86  proc_init_();
87  }
88  }
89 
90  // @override
91  void proc_on_exit(void) {
92  if (proc_exit_) {
93  proc_exit_();
94  }
95  }
96 
97  // @override
99  if (proc_sighup_) {
100  return proc_sighup_(s);
101  }
102  return true;
103  }
104 
105  // @override
106  void thread_on_init(void) {
107  if (thread_init_) {
108  thread_init_();
109  }
110  }
111 };
112 
113 } // namespace acl
string & lower(void)
http_server_impl(const char *addr, bool use_redis)
std::function< void()> proc_jail_t
std::function< bool(HttpRequest &, HttpResponse &)> http_handler_t
void on_accept(socket_stream &conn)
http_handlers_t handlers_[http_handler_max]
std::function< void()> thread_init_t
std::function< void()> proc_init_t
std::map< acl::string, http_handler_t > http_handlers_t
redis_client_cluster * redis_
thread_accept_t thread_accept_
size_t size() const
void Service(int type, const char *path, http_handler_t fn)
HttpServlet & setLocalCharset(const char *charset)
void bind_thread(bool yes)
void init(const char *default_addr, const char *addr_list, size_t count, int conn_timeout=30, int rw_timeout=30)
virtual bool doRun(void)
std::function< bool(acl::socket_stream &)> thread_accept_t
bool proc_on_sighup(acl::string &s)
std::function< bool(acl::string &)> proc_sighup_t
virtual ~http_server_impl(void)
std::function< void()> proc_exit_t