Skip to content

Commit 2012b58

Browse files
committed
Fixed crash in HTTP client, 'get' now only returns an empty response.
1 parent 44b9185 commit 2012b58

File tree

4 files changed

+39
-140
lines changed

4 files changed

+39
-140
lines changed

http/src/http/v2/client/client.cpp

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,23 @@ namespace network {
7070

7171
void client::impl::connect(const boost::system::error_code &ec,
7272
tcp::resolver::iterator endpoint_iterator) {
73+
if (ec) {
74+
if (endpoint_iterator == tcp::resolver::iterator()) {
75+
response_promise_.set_exception(std::make_exception_ptr(
76+
connection_error(client_error::host_not_found)));
77+
return;
78+
}
79+
80+
response_promise_.set_exception(std::make_exception_ptr(
81+
boost::system::system_error(ec)));
82+
return;
83+
}
84+
7385
tcp::endpoint endpoint(*endpoint_iterator);
74-
//connection_.async_connect(endpoint,
75-
// [=] (const boost::system::error_code &ec) {
76-
// if (ec) {
77-
// return;
78-
// }
79-
//
80-
// //response_promise_.set_value(v2::response());
81-
// //write_request(ec);
82-
// });
86+
connection_->async_connect(endpoint,
87+
[=] (const boost::system::error_code &ec) {
88+
write_request(ec);
89+
});
8390
}
8491

8592
void client::impl::write_request(const boost::system::error_code &ec) {
@@ -117,7 +124,7 @@ namespace network {
117124
std::size_t) {
118125
if (ec) {
119126
response_promise_.set_exception(std::make_exception_ptr(
120-
boost::system::system_error(ec)));
127+
boost::system::system_error(ec)));
121128
return;
122129
}
123130

@@ -126,6 +133,7 @@ namespace network {
126133
[=] (const boost::system::error_code &ec,
127134
std::size_t bytes_read) {
128135
// um...
136+
response_promise_.set_value(response());
129137
});
130138
}
131139

@@ -162,30 +170,12 @@ namespace network {
162170
uri::string_type(std::begin(*auth.host()), std::end(*auth.host())) : uri::string_type();
163171
auto port = auth.port<std::uint16_t>()? *auth.port<std::uint16_t>() : 80;
164172

165-
//resolver_->async_resolve(host, port,
166-
// [=](const boost::system::error_code &ec,
167-
// tcp::resolver::iterator endpoint_iterator) {
168-
// std::cout << "!!!" << std::endl;
169-
// if (ec) {
170-
// if (endpoint_iterator == tcp::resolver::iterator()) {
171-
// response_promise_.set_exception(
172-
// std::make_exception_ptr(
173-
// connection_error(client_error::host_not_found)));
174-
// return;
175-
// }
176-
//
177-
// std::cout << "!!!" << std::endl;
178-
// //response_promise_.set_exception(
179-
// // std::make_exception_ptr(
180-
// // boost::system::system_error(ec)));
181-
// return;
182-
// }
183-
//
184-
// connect(ec, endpoint_iterator);
185-
// });
186-
187-
response_promise_.set_exception(std::make_exception_ptr(
188-
connection_error(client_error::host_not_found)));
173+
resolver_->async_resolve(host, port,
174+
[=](const boost::system::error_code &ec,
175+
tcp::resolver::iterator endpoint_iterator) {
176+
connect(ec, endpoint_iterator);
177+
});
178+
189179
return res;
190180
}
191181

http/src/network/http/v2/client/connection/tcp_resolver.hpp

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include <cstdint>
1313
#include <string>
1414
#include <boost/asio/io_service.hpp>
15-
#include <boost/asio/strand.hpp>
1615
#include <boost/asio/ip/tcp.hpp>
1716
#include <boost/exception/all.hpp>
1817
#include <network/config.hpp>
@@ -42,7 +41,6 @@ namespace network {
4241
*/
4342
tcp_resolver(boost::asio::io_service &service, bool cache_resolved = false)
4443
: resolver_(service)
45-
, resolver_strand_(new boost::asio::io_service::strand(service))
4644
, cache_resolved_(cache_resolved) {
4745

4846
}
@@ -54,7 +52,8 @@ namespace network {
5452

5553
}
5654

57-
virtual void async_resolve(const std::string &host, std::uint16_t port, resolve_callback handler) {
55+
virtual void async_resolve(const std::string &host, std::uint16_t port,
56+
resolve_callback handler) {
5857
if (cache_resolved_) {
5958
auto it = endpoint_cache_.find(host);
6059
if (it != endpoint_cache_.end()) {
@@ -66,19 +65,18 @@ namespace network {
6665

6766
resolver::query query(host, std::to_string(port));
6867
resolver_.async_resolve(query,
69-
resolver_strand_->wrap(
70-
[&host, &handler, this](const boost::system::error_code &ec,
71-
resolver_iterator endpoint_iterator) {
72-
if (ec) {
73-
handler(ec, resolver_iterator());
74-
}
75-
else {
76-
if (cache_resolved_) {
77-
endpoint_cache_.insert(host, endpoint_iterator);
78-
}
79-
handler(ec, endpoint_iterator);
80-
}
81-
}));
68+
[host, handler, this](const boost::system::error_code &ec,
69+
resolver_iterator endpoint_iterator) {
70+
if (ec) {
71+
handler(ec, resolver_iterator());
72+
}
73+
else {
74+
if (cache_resolved_) {
75+
endpoint_cache_.insert(host, endpoint_iterator);
76+
}
77+
handler(ec, endpoint_iterator);
78+
}
79+
});
8280
}
8381

8482
virtual void clear_resolved_cache() {
@@ -87,10 +85,7 @@ namespace network {
8785

8886
private:
8987

90-
typedef boost::asio::io_service::strand strand;
91-
9288
resolver resolver_;
93-
std::unique_ptr<strand> resolver_strand_;
9489
bool cache_resolved_;
9590
endpoint_cache endpoint_cache_;
9691

http/test/v2/features/client/client_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Describe(http_client) {
2424
request
2525
.method(http::method::GET)
2626
.path("/LICENSE_1_0.txt")
27-
.version("1.0")
27+
.version("1.1")
2828
.append_header("Host", "www.boost.org")
2929
.append_header("User-Agent", "cpp-netlib client_test")
3030
.append_header("Connection", "close");

http/test/v2/features/client/ssl_connection_test.cpp

Lines changed: 0 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -45,92 +45,6 @@ Describe(https_connection) {
4545
Assert::That(ec, Equals(boost::system::error_code()));
4646
}
4747

48-
/*
49-
It(writes_to_localhost) {
50-
// Resolve the host.
51-
boost::system::error_code ec;
52-
tcp::resolver::query query("127.0.0.1", "80");
53-
auto it = resolver_->resolve(query, ec);
54-
Assert::That(ec, Equals(boost::system::error_code()));
55-
56-
// Make sure that the connection is successful.
57-
tcp::endpoint endpoint(it->endpoint());
58-
connection_->async_connect(endpoint, "127.0.0.1",
59-
[&ec] (const boost::system::error_code &ec_) {
60-
Assert::That(ec_, Equals(boost::system::error_code()));
61-
});
62-
63-
// Create an HTTPS request.
64-
http::request request{network::uri{"http://127.0.0.1/"}};
65-
request.set_method(http::method::GET);
66-
request.set_version("1.0");
67-
request.append_header("User-Agent", "ssl_connection_test");
68-
request.append_header("Connection", "close");
69-
70-
// Write the HTTP request to the socket, sending it to the server.
71-
boost::asio::streambuf request_;
72-
std::ostream request_stream(&request_);
73-
request_stream << request;
74-
std::size_t bytes_written = 0;
75-
connection_->async_write(request_,
76-
[&bytes_written] (const boost::system::error_code &ec_,
77-
std::size_t bytes_written_) {
78-
Assert::That(ec_, Equals(boost::system::error_code()));
79-
bytes_written = bytes_written_;
80-
});
81-
io_service_->run();
82-
Assert::That(bytes_written, IsGreaterThan(0));
83-
}
84-
85-
It(reads_from_localhost) {
86-
// Resolve the host.
87-
boost::system::error_code ec;
88-
tcp::resolver::query query("127.0.0.1", "80");
89-
auto it = resolver_->resolve(query, ec);
90-
Assert::That(ec, Equals(boost::system::error_code()));
91-
92-
// Make sure that the connection is successful.
93-
tcp::endpoint endpoint(it->endpoint());
94-
connection_->async_connect(endpoint, "127.0.0.1",
95-
[] (const boost::system::error_code &ec_) {
96-
Assert::That(ec_, Equals(boost::system::error_code()));
97-
});
98-
99-
// Create an HTTP request.
100-
http::request request{network::uri{"http://127.0.0.1/"}};
101-
request.set_method(http::method::GET);
102-
request.set_version("1.0");
103-
request.append_header("User-Agent", "ssl_connection_test");
104-
request.append_header("Connection", "close");
105-
106-
// Write the HTTP request to the socket, sending it to the server.
107-
boost::asio::streambuf request_;
108-
std::ostream request_stream(&request_);
109-
request_stream << request;
110-
std::size_t bytes_written = 0;
111-
connection_->async_write(request_,
112-
[&bytes_written] (const boost::system::error_code &ec_,
113-
std::size_t bytes_written_) {
114-
Assert::That(ec_, Equals(boost::system::error_code()));
115-
bytes_written = bytes_written_;
116-
});
117-
118-
// Read the HTTP response on the socket from the server.
119-
char output[8192];
120-
std::memset(output, 0, sizeof(output));
121-
std::size_t bytes_read = 0;
122-
connection_->async_read_some(boost::asio::mutable_buffers_1(output, sizeof(output)),
123-
[&bytes_read] (const boost::system::error_code &ec_,
124-
std::size_t bytes_read_) {
125-
Assert::That(ec_, Equals(boost::system::error_code()));
126-
bytes_read = bytes_read_;
127-
});
128-
129-
io_service_->run();
130-
Assert::That(bytes_read, IsGreaterThan(0));
131-
}
132-
*/
133-
13448
std::unique_ptr<boost::asio::io_service> io_service_;
13549
std::unique_ptr<tcp::resolver> resolver_;
13650
std::unique_ptr<http::client_options> options_;

0 commit comments

Comments
 (0)