55// Distributed under the Boost Software License, Version 1.0.
66// (See accompanying file LICENSE_1_0.txt or copy at
77// http://www.boost.org/LICENSE_1_0.txt)
8- //
98
109#ifndef BOOST_NETWORK_HTTP_SERVER_HPP_
1110#define BOOST_NETWORK_HTTP_SERVER_HPP_
1211
13- #include < boost/shared_ptr.hpp>
14- #include < boost/bind.hpp>
15- #include < boost/asio/ip/tcp.hpp>
1612#include < boost/network/protocol/http/response.hpp>
1713#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>
2016
2117namespace boost {namespace network {namespace http {
2218
2319template <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+ {};
2831
29- basic_server (string_typeconst & address,
30- string_typeconst & 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::resolverresolver (service_);
39- tcp::resolver::queryquery (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_codeconst & 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+ {};
7535
7636template <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;
7940
8041server (typename server_base::string_typeconst & address,
8142typename server_base::string_typeconst & port,
@@ -84,6 +45,19 @@ namespace boost { namespace network { namespace http {
8445
8546 };
8647
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_typeconst & address,
55+ typename server_base::string_typeconst & port,
56+ Handler & handler,
57+ utils::thread_pool & thread_pool)
58+ : server_base(address, port, handler, thread_pool) {}
59+ };
60+
8761}// namespace http
8862
8963}// namespace network