Skip to content

Commit 16a6627

Browse files
committed
Adding explicit calls to close sockets from the client side.
1 parent 4d336e7 commit 16a6627

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

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

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -216,17 +216,23 @@ namespace boost { namespace network { namespace http { namespace impl {
216216

217217
void read_body(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
218218
connection_base::read_body(socket_, response_, response_buffer);
219+
typename headers_range<basic_response<Tag> >::type connection_range =
220+
headers(response_)["Connection"];
221+
if (version_major == 1 && version_minor == 1 && !empty(connection_range) && boost::iequals(begin(connection_range)->second, "close")) {
222+
close_socket();
223+
} else if (version_major == 1 && version_minor == 0) {
224+
close_socket();
225+
}
219226
}
220227

221228
bool is_open() {
222229
return socket_.lowest_layer().is_open();
223230
}
224231

225232
void close_socket() {
226-
if (is_open()) {
227-
boost::system::error_code ignored;
228-
socket_.lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
229-
}
233+
boost::system::error_code ignored;
234+
socket_.lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
235+
socket_.lowest_layer().close(ignored);
230236
}
231237

232238
~https_sync_connection() {
@@ -272,15 +278,21 @@ namespace boost { namespace network { namespace http { namespace impl {
272278

273279
void read_body(basic_response<Tag> & response_, boost::asio::streambuf & response_buffer) {
274280
connection_base::read_body(socket_, response_, response_buffer);
281+
typename headers_range<basic_response<Tag> >::type connection_range =
282+
headers(response_)["Connection"];
283+
if (version_major == 1 && version_minor == 1 && !empty(connection_range) && boost::iequals(begin(connection_range)->second, "close")) {
284+
close_socket();
285+
} else if (version_major == 1 && version_minor == 0) {
286+
close_socket();
287+
}
275288
}
276289

277290
bool is_open() { return socket_.is_open(); }
278291

279292
void close_socket() {
280-
if (is_open()) {
281-
boost::system::error_code ignored;
282-
socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
283-
}
293+
boost::system::error_code ignored;
294+
socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored);
295+
socket_.close(ignored);
284296
}
285297

286298
~http_sync_connection() {

boost/network/protocol/http/policies/pooled_connection.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ namespace boost { namespace network { namespace http {
8888
pimpl->read_body(response_, response_buffer);
8989
}
9090

91+
typename headers_range<basic_response<Tag> >::type connection_range = headers(response_)["Connection"];
92+
if (version_major == 1 && version_minor == 1 && !empty(connection_range) && begin(connection_range)->second == string_type("close")) {
93+
pimpl->close_socket();
94+
} else if (version_major == 1 && version_minor == 0) {
95+
pimpl->close_socket();
96+
}
97+
9198
if (connection_follow_redirect_) {
9299
boost::uint16_t status = response_.status();
93100
if (status >= 300 && status <= 307) {
@@ -103,11 +110,6 @@ namespace boost { namespace network { namespace http {
103110
}
104111
}
105112

106-
typename headers_range<basic_response<Tag> >::type connection_range = headers(response_)["Connection"];
107-
if (!empty(connection_range) && begin(connection_range)->second == string_type("close")) {
108-
pimpl->close_socket();
109-
}
110-
111113
return response_;
112114
} while(true);
113115
}

0 commit comments

Comments
 (0)