Skip to content

Commit ff26d2d

Browse files
committed
Adding support for user-supplied io_service.
This commit adds a constructor for the HTTP client implementation that adds support for taking a user-supplied io_service. This is true for both the synchronous and asynchronous client implementations. Closes cpp-netlib#25
1 parent 3f787c0 commit ff26d2d

File tree

10 files changed

+94
-60
lines changed

10 files changed

+94
-60
lines changed

boost/network/protocol/http/client.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ namespace boost { namespace network { namespace http {
7575
: base_facade_type(), pimpl(new pimpl_type(true, true))
7676
{}
7777

78+
explicit basic_client(boost::asio::io_service & io_service)
79+
: base_facade_type(), pimpl(new pimpl_type(false, false, io_service))
80+
{}
81+
7882
//
7983
// =================================================================
8084

boost/network/protocol/http/client/async_impl.hpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,36 @@ namespace boost { namespace network { namespace http {
3333

3434
async_client(bool cache_resolved, bool follow_redirect)
3535
: connection_base(cache_resolved, follow_redirect),
36-
service_(new boost::asio::io_service),
37-
resolver_(new resolver_type(*service_)),
38-
sentinel_(new boost::asio::io_service::work(*service_))
36+
service_ptr(new boost::asio::io_service),
37+
service_(*service_ptr),
38+
resolver_(service_),
39+
sentinel_(new boost::asio::io_service::work(service_))
3940
{
40-
connection_base::service_ = service_;
4141
connection_base::resolver_strand_.reset(new
42-
boost::asio::io_service::strand(*service_));
42+
boost::asio::io_service::strand(service_));
4343
lifetime_thread_.reset(new boost::thread(
4444
boost::bind(
4545
&boost::asio::io_service::run,
46-
service_
46+
&service_
4747
)));
4848
}
4949

50+
async_client(bool cache_resolved, bool follow_redirect, boost::asio::io_service & service)
51+
: connection_base(cache_resolved, follow_redirect),
52+
service_ptr(),
53+
service_(service),
54+
resolver_(service_),
55+
sentinel_(new boost::asio::io_service::work(service_))
56+
{
57+
}
58+
5059
~async_client() throw ()
5160
{
5261
sentinel_.reset();
53-
lifetime_thread_->join();
54-
lifetime_thread_.reset();
62+
if (lifetime_thread_.get()) {
63+
lifetime_thread_->join();
64+
lifetime_thread_.reset();
65+
}
5566
}
5667

5768
basic_response<Tag> const request_skeleton(
@@ -65,8 +76,9 @@ namespace boost { namespace network { namespace http {
6576
return connection_->send_request(method, request_, get_body);
6677
}
6778

68-
boost::shared_ptr<boost::asio::io_service> service_;
69-
boost::shared_ptr<resolver_type> resolver_;
79+
std::auto_ptr<boost::asio::io_service> service_ptr;
80+
boost::asio::io_service & service_;
81+
resolver_type resolver_;
7082
boost::shared_ptr<boost::asio::io_service::work> sentinel_;
7183
boost::shared_ptr<boost::thread> lifetime_thread_;
7284
};

boost/network/protocol/http/client/pimpl.hpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,21 @@ namespace boost { namespace network { namespace http {
3535
typedef typename resolver<Tag>::type resolver_type;
3636
friend struct basic_client_impl<Tag,version_major,version_minor>;
3737

38-
boost::asio::io_service service_;
38+
std::auto_ptr<boost::asio::io_service> service_ptr;
39+
boost::asio::io_service & service_;
3940
resolver_type resolver_;
4041

4142
sync_client(bool cache_resolved, bool follow_redirect)
4243
: connection_base(cache_resolved, follow_redirect),
43-
service_(),
44+
service_ptr(new boost::asio::io_service),
45+
service_(*service_ptr),
46+
resolver_(service_)
47+
{}
48+
49+
sync_client(bool cache_resolved, bool follow_redirect, boost::asio::io_service & service)
50+
: connection_base(cache_resolved, follow_redirect),
51+
service_ptr(),
52+
service_(service),
4453
resolver_(service_)
4554
{}
4655

@@ -86,6 +95,10 @@ namespace boost { namespace network { namespace http {
8695
: base_type(cache_resolved, follow_redirect)
8796
{}
8897

98+
basic_client_impl(bool cache_resolved, bool follow_redirect, boost::asio::io_service & service)
99+
: base_type(cache_resolved, follow_redirect, service)
100+
{}
101+
89102
~basic_client_impl()
90103
{}
91104
};

boost/network/protocol/http/impl/async_connection_base.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace boost { namespace network { namespace http { namespace impl {
2424
typedef basic_request<Tag> request;
2525
typedef basic_response<Tag> response;
2626

27-
static boost::shared_ptr<async_connection_base<Tag,version_major,version_minor> > new_connection(resolve_function resolve, boost::shared_ptr<resolver_type> resolver, bool follow_redirect, bool https) {
27+
static boost::shared_ptr<async_connection_base<Tag,version_major,version_minor> > new_connection(resolve_function resolve, resolver_type & resolver, bool follow_redirect, bool https) {
2828
boost::shared_ptr<async_connection_base<Tag,version_major,version_minor> > temp;
2929
if (https) {
3030
#ifdef BOOST_NETWORK_ENABLE_HTTPS

boost/network/protocol/http/impl/http_async_connection.hpp

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ namespace boost { namespace network { namespace http { namespace impl {
4646
typedef typename base::resolver_base::resolve_function resolve_function;
4747

4848
http_async_connection(
49-
boost::shared_ptr<resolver_type> resolver,
49+
resolver_type & resolver,
5050
resolve_function resolve,
5151
bool follow_redirect
5252
) :
5353
follow_redirect_(follow_redirect),
5454
resolver_(resolver),
5555
resolve_(resolve),
56-
request_strand_(new boost::asio::io_service::strand(resolver->get_io_service()))
56+
request_strand_(resolver.get_io_service())
5757
{}
5858

5959

@@ -65,7 +65,7 @@ namespace boost { namespace network { namespace http { namespace impl {
6565
boost::uint16_t port_ = port(request);
6666
resolve_(resolver_, host(request),
6767
port_,
68-
request_strand_->wrap(
68+
request_strand_.wrap(
6969
boost::bind(
7070
&http_async_connection<Tag,version_major,version_minor>::handle_resolved,
7171
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -83,10 +83,10 @@ namespace boost { namespace network { namespace http { namespace impl {
8383
port
8484
);
8585
socket_.reset(new boost::asio::ip::tcp::socket(
86-
resolver_->get_io_service()));
86+
resolver_.get_io_service()));
8787
socket_->async_connect(
8888
endpoint,
89-
request_strand_->wrap(
89+
request_strand_.wrap(
9090
boost::bind(
9191
&http_async_connection<Tag,version_major,version_minor>::handle_connected,
9292
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -108,7 +108,7 @@ namespace boost { namespace network { namespace http { namespace impl {
108108
void handle_connected(boost::uint16_t port, bool get_body, resolver_iterator_pair endpoint_range, boost::system::error_code const & ec) {
109109
if (!ec) {
110110
boost::asio::async_write(*socket_, boost::asio::buffer(command_string_.data(), command_string_.size()),
111-
request_strand_->wrap(
111+
request_strand_.wrap(
112112
boost::bind(
113113
&http_async_connection<Tag,version_major,version_minor>::handle_sent_request,
114114
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -124,10 +124,10 @@ namespace boost { namespace network { namespace http { namespace impl {
124124
port
125125
);
126126
socket_.reset(new boost::asio::ip::tcp::socket(
127-
resolver_->get_io_service()));
127+
resolver_.get_io_service()));
128128
socket_->async_connect(
129129
endpoint,
130-
request_strand_->wrap(
130+
request_strand_.wrap(
131131
boost::bind(
132132
&http_async_connection<Tag,version_major,version_minor>::handle_connected,
133133
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -160,7 +160,7 @@ namespace boost { namespace network { namespace http { namespace impl {
160160
boost::asio::mutable_buffers_1(
161161
this->part.c_array(),
162162
this->part.size()),
163-
request_strand_->wrap(
163+
request_strand_.wrap(
164164
boost::bind(
165165
&http_async_connection<Tag,version_major,version_minor>::handle_received_data,
166166
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -187,7 +187,7 @@ namespace boost { namespace network { namespace http { namespace impl {
187187
case version:
188188
parsed_ok =
189189
this->parse_version(*socket_,
190-
request_strand_->wrap(
190+
request_strand_.wrap(
191191
boost::bind(
192192
&http_async_connection<Tag,version_major,version_minor>::handle_received_data,
193193
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -199,7 +199,7 @@ namespace boost { namespace network { namespace http { namespace impl {
199199
case status:
200200
parsed_ok =
201201
this->parse_status(*socket_,
202-
request_strand_->wrap(
202+
request_strand_.wrap(
203203
boost::bind(
204204
&http_async_connection<Tag,version_major,version_minor>::handle_received_data,
205205
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -211,7 +211,7 @@ namespace boost { namespace network { namespace http { namespace impl {
211211
case status_message:
212212
parsed_ok =
213213
this->parse_status_message(*socket_,
214-
request_strand_->wrap(
214+
request_strand_.wrap(
215215
boost::bind(
216216
&http_async_connection<Tag,version_major,version_minor>::handle_received_data,
217217
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -223,7 +223,7 @@ namespace boost { namespace network { namespace http { namespace impl {
223223
case headers:
224224
fusion::tie(parsed_ok, remainder) =
225225
this->parse_headers(*socket_,
226-
request_strand_->wrap(
226+
request_strand_.wrap(
227227
boost::bind(
228228
&http_async_connection<Tag,version_major,version_minor>::handle_received_data,
229229
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -238,7 +238,7 @@ namespace boost { namespace network { namespace http { namespace impl {
238238
}
239239
this->parse_body(
240240
*socket_,
241-
request_strand_->wrap(
241+
request_strand_.wrap(
242242
boost::bind(
243243
&http_async_connection<Tag,version_major,version_minor>::handle_received_data,
244244
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -268,7 +268,7 @@ namespace boost { namespace network { namespace http { namespace impl {
268268
} else {
269269
this->parse_body(
270270
*socket_,
271-
request_strand_->wrap(
271+
request_strand_.wrap(
272272
boost::bind(
273273
&http_async_connection<Tag,version_major,version_minor>::handle_received_data,
274274
http_async_connection<Tag,version_major,version_minor>::shared_from_this(),
@@ -304,10 +304,10 @@ namespace boost { namespace network { namespace http { namespace impl {
304304
}
305305

306306
bool follow_redirect_;
307-
boost::shared_ptr<resolver_type> resolver_;
307+
resolver_type & resolver_;
308308
boost::shared_ptr<boost::asio::ip::tcp::socket> socket_;
309309
resolve_function resolve_;
310-
boost::shared_ptr<boost::asio::io_service::strand> request_strand_;
310+
boost::asio::io_service::strand request_strand_;
311311
string_type command_string_;
312312
string_type method;
313313
};

0 commit comments

Comments
 (0)