14
14
#include < boost/network/protocol/http/response.hpp>
15
15
#include < boost/network/protocol/http/request.hpp>
16
16
#include < boost/network/protocol/http/server/sync_connection.hpp>
17
+ #include < boost/network/protocol/http/server/parameters.hpp>
18
+ #include < boost/network/protocol/http/server/storage_base.hpp>
17
19
#include < boost/network/traits/string.hpp>
18
20
#include < boost/thread/mutex.hpp>
19
21
20
22
namespace boost { namespace network { namespace http {
21
-
23
+
22
24
template <class Tag , class Handler >
23
- struct sync_server_base {
25
+ struct sync_server_base : server_storage_base {
24
26
typedef typename string<Tag>::type string_type;
25
27
typedef basic_request<Tag> request;
26
28
typedef basic_response<Tag> response;
27
29
typedef typename boost::network::http::response_header<Tag>::type response_header;
28
30
29
- sync_server_base (string_type const & address,
30
- string_type const & port,
31
- Handler & handler)
32
- : handler_(handler)
33
- , address_(address)
34
- , port_(port)
35
- , self_service_(new boost::asio::io_service())
36
- , service_(*self_service_)
37
- , acceptor_(service_)
31
+ template <class ArgPack >
32
+ sync_server_base (ArgPack const & args)
33
+ : server_storage_base(args,
34
+ typename mpl::if_<
35
+ is_same<
36
+ typename parameter::value_type<ArgPack, tag::io_service, void >::type,
37
+ void
38
+ >,
39
+ server_storage_base::no_io_service,
40
+ server_storage_base::has_io_service
41
+ >::type())
42
+ , handler_(args[_handler])
43
+ , address_(args[_address])
44
+ , port_(args[_port])
45
+ , acceptor_(server_storage_base::service_)
38
46
, new_connection()
39
47
, listening_mutex_()
40
48
, listening_(false )
41
49
{}
42
50
43
51
void run () {
44
- boost::unique_lock<boost::mutex> listening_lock (listening_mutex_);
45
- if (!listening_) start_listening ();
46
- listening_lock.unlock ();
52
+ listen ();
47
53
service_.run ();
48
54
}
49
55
@@ -52,12 +58,16 @@ namespace boost { namespace network { namespace http {
52
58
acceptor_.cancel ();
53
59
}
54
60
61
+ void listen () {
62
+ boost::unique_lock<boost::mutex> listening_lock (listening_mutex_);
63
+ if (!listening_) start_listening ();
64
+ listening_lock.unlock ();
65
+ }
66
+
55
67
private:
56
68
57
69
Handler & handler_;
58
70
string_type address_, port_;
59
- std::auto_ptr<boost::asio::io_service> self_service_;
60
- boost::asio::io_service & service_;
61
71
boost::asio::ip::tcp::acceptor acceptor_;
62
72
boost::shared_ptr<sync_connection<Tag,Handler> > new_connection;
63
73
boost::mutex listening_mutex_;
0 commit comments