5
5
// Distributed under the Boost Software License, Version 1.0.
6
6
// (See accompanying file LICENSE_1_0.txt or copy at
7
7
// http://www.boost.org/LICENSE_1_0.txt)
8
- //
9
8
10
9
#ifndef BOOST_NETWORK_HTTP_SERVER_HPP_
11
10
#define BOOST_NETWORK_HTTP_SERVER_HPP_
12
11
13
- #include < boost/shared_ptr.hpp>
14
- #include < boost/bind.hpp>
15
- #include < boost/asio/ip/tcp.hpp>
16
12
#include < boost/network/protocol/http/response.hpp>
17
13
#include < boost/network/protocol/http/request.hpp>
18
- #include < boost/network/protocol/http/connection .hpp>
19
- #include < boost/network/traits/string .hpp>
14
+ #include < boost/network/protocol/http/server/sync_server .hpp>
15
+ #include < boost/network/protocol/http/server/async_server .hpp>
20
16
21
17
namespace boost { namespace network { namespace http {
22
18
23
19
template <class Tag , class Handler >
24
- struct basic_server {
25
- typedef typename string<Tag>::type string_type;
26
- typedef basic_request<Tag> request;
27
- typedef basic_response<Tag> response;
20
+ struct server_base :
21
+ mpl::if_<
22
+ is_async<Tag>
23
+ , async_server_base<Tag, Handler>
24
+ , typename mpl::if_<
25
+ is_sync<Tag>
26
+ , sync_server_base<Tag, Handler>
27
+ , unsupported_tag<Tag>
28
+ >::type
29
+ >
30
+ {};
28
31
29
- basic_server (string_type const & address,
30
- string_type const & port,
31
- Handler & handler)
32
- : handler_(handler)
33
- , service_()
34
- , acceptor_(service_)
35
- , new_connection(new connection<Tag,Handler>(service_, handler))
36
- {
37
- using boost::asio::ip::tcp;
38
- tcp::resolver resolver (service_);
39
- tcp::resolver::query query (address, port);
40
- tcp::endpoint endpoint = *resolver.resolve (query);
41
- acceptor_.open (endpoint.protocol ());
42
- acceptor_.bind (endpoint);
43
- acceptor_.listen ();
44
- acceptor_.async_accept (new_connection->socket (),
45
- boost::bind (&basic_server<Tag,Handler>::handle_accept,
46
- this , boost::asio::placeholders::error));
47
- }
48
-
49
- void run () {
50
- service_.run ();
51
- }
52
-
53
- void stop () {
54
- // TODO Graceful stop here?
55
- service_.stop ();
56
- }
57
-
58
- private:
59
-
60
- Handler & handler_;
61
- boost::asio::io_service service_;
62
- boost::asio::ip::tcp::acceptor acceptor_;
63
- boost::shared_ptr<connection<Tag,Handler> > new_connection;
64
-
65
- void handle_accept (boost::system::error_code const & ec) {
66
- if (!ec) {
67
- new_connection->start ();
68
- new_connection.reset (new connection<Tag,Handler>(service_, handler_));
69
- acceptor_.async_accept (new_connection->socket (),
70
- boost::bind (&basic_server<Tag,Handler>::handle_accept,
71
- this , boost::asio::placeholders::error));
72
- }
73
- }
74
- };
32
+ template <class Tag , class Handler >
33
+ struct basic_server : server_base<Tag, Handler>::type
34
+ {};
75
35
76
36
template <class Handler >
77
- struct server : basic_server<tags::http_server, Handler> {
78
- typedef basic_server<tags::http_server, Handler> server_base;
37
+ struct server : server_base<tags::http_server, Handler>::type {
38
+ typedef typename server_base<tags::http_server, Handler>::type
39
+ server_base;
79
40
80
41
server (typename server_base::string_type const & address,
81
42
typename server_base::string_type const & port,
@@ -84,6 +45,19 @@ namespace boost { namespace network { namespace http {
84
45
85
46
};
86
47
48
+ template <class Handler >
49
+ struct async_server : server_base<tags::http_async_server, Handler>::type
50
+ {
51
+ typedef typename server_base<tags::http_async_server, Handler>::type
52
+ server_base;
53
+
54
+ async_server (typename server_base::string_type const & address,
55
+ typename server_base::string_type const & port,
56
+ Handler & handler,
57
+ utils::thread_pool & thread_pool)
58
+ : server_base(address, port, handler, thread_pool) {}
59
+ };
60
+
87
61
} // namespace http
88
62
89
63
} // namespace network
0 commit comments