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_
17
16
#include < boost/network/protocol/http/request.hpp>
18
17
#include < boost/network/protocol/http/connection.hpp>
19
18
#include < boost/network/traits/string.hpp>
19
+ #include < boost/network/protocol/http/server/sync_server.hpp>
20
+ #include < boost/network/protocol/http/server/async_server.hpp>
20
21
21
22
namespace boost { namespace network { namespace http {
22
23
23
24
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;
25
+ struct server_base :
26
+ mpl::if_<
27
+ is_async<Tag>
28
+ , async_server_base<Tag, Handler>
29
+ , typename mpl::if_<
30
+ is_sync<Tag>
31
+ , sync_server_base<Tag, Handler>
32
+ , unsupported_tag<Tag>
33
+ >::type
34
+ >
35
+ {};
28
36
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
- };
37
+ template <class Tag , class Handler >
38
+ struct basic_server : server_base<Tag, Handler>::type
39
+ {};
75
40
76
41
template <class Handler >
77
- struct server : basic_server<tags::http_server, Handler> {
78
- typedef basic_server<tags::http_server, Handler> server_base;
42
+ struct server : server_base<tags::http_server, Handler>::type {
43
+ typedef typename server_base<tags::http_server, Handler>::type
44
+ server_base;
79
45
80
46
server (typename server_base::string_type const & address,
81
47
typename server_base::string_type const & port,
@@ -84,6 +50,19 @@ namespace boost { namespace network { namespace http {
84
50
85
51
};
86
52
53
+ template <class Handler >
54
+ struct async_server : server_base<tags::http_async_server, Handler>::type
55
+ {
56
+ typedef typename server_base<tags::http_async_server, Handler>::type
57
+ server_base;
58
+
59
+ async_server (typename server_base::string_type const & address,
60
+ typename server_base::string_type const & port,
61
+ Handler & handler,
62
+ utils::thread_pool & thread_pool)
63
+ : server_base(address, port, handler, thread_pool) {}
64
+ };
65
+
87
66
} // namespace http
88
67
89
68
} // namespace network
0 commit comments