Skip to content

Commit 73d4024

Browse files
HighCommander4deanberris
authored andcommitted
Do not wrap exceptions passed to boost::promise::set_exception in std::exception_ptr (fixes #815)
boost::promise only knows about boost::exception_ptr, and handles wrapping of concrete exception types into that itself. If passed std::exception_ptr, it will wrap it a second time and later throw the std::exception_ptr itself.
1 parent cf240bf commit 73d4024

File tree

3 files changed

+37
-38
lines changed

3 files changed

+37
-38
lines changed

boost/network/protocol/http/client/connection/async_normal.hpp

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,13 @@ struct http_async_connection
123123
private:
124124
void set_errors(boost::system::error_code const& ec, body_callback_function_type callback) {
125125
boost::system::system_error error(ec);
126-
this->version_promise.set_exception(std::make_exception_ptr(error));
127-
this->status_promise.set_exception(std::make_exception_ptr(error));
128-
this->status_message_promise.set_exception(std::make_exception_ptr(error));
129-
this->headers_promise.set_exception(std::make_exception_ptr(error));
130-
this->source_promise.set_exception(std::make_exception_ptr(error));
131-
this->destination_promise.set_exception(std::make_exception_ptr(error));
132-
this->body_promise.set_exception(std::make_exception_ptr(error));
126+
this->version_promise.set_exception(error);
127+
this->status_promise.set_exception(error);
128+
this->status_message_promise.set_exception(error);
129+
this->headers_promise.set_exception(error);
130+
this->source_promise.set_exception(error);
131+
this->destination_promise.set_exception(error);
132+
this->body_promise.set_exception(error);
133133
if ( callback )
134134
callback( char_const_range(), ec );
135135
this->timer_.cancel();
@@ -456,28 +456,27 @@ struct http_async_connection
456456
} else {
457457
boost::system::error_code report_code = is_timedout_ ? boost::asio::error::timed_out : ec;
458458
boost::system::system_error error(report_code);
459-
this->source_promise.set_exception(std::make_exception_ptr(error));
460-
this->destination_promise.set_exception(std::make_exception_ptr(error));
459+
this->source_promise.set_exception(error);
460+
this->destination_promise.set_exception(error);
461461
switch (state) {
462462
case version:
463-
this->version_promise.set_exception(std::make_exception_ptr(error));
463+
this->version_promise.set_exception(error);
464464
// fall-through
465465
case status:
466-
this->status_promise.set_exception(std::make_exception_ptr(error));
466+
this->status_promise.set_exception(error);
467467
// fall-through
468468
case status_message:
469-
this->status_message_promise.set_exception(
470-
std::make_exception_ptr(error));
469+
this->status_message_promise.set_exception(error);
471470
// fall-through
472471
case headers:
473-
this->headers_promise.set_exception(std::make_exception_ptr(error));
472+
this->headers_promise.set_exception(error);
474473
// fall-through
475474
case body:
476475
if (!callback) {
477476
// N.B. if callback is non-null, then body_promise has already been
478477
// set to value "" to indicate body is handled by streaming handler
479478
// so no exception should be set
480-
this->body_promise.set_exception(std::make_exception_ptr(error));
479+
this->body_promise.set_exception(error);
481480
}
482481
else
483482
callback( char_const_range(), report_code );

boost/network/protocol/http/client/connection/async_protocol_handler.hpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,13 @@ struct http_async_protocol_handler {
128128
<< "\"");
129129
#endif
130130
std::runtime_error error("Invalid Version Part.");
131-
version_promise.set_exception(std::make_exception_ptr(error));
132-
status_promise.set_exception(std::make_exception_ptr(error));
133-
status_message_promise.set_exception(std::make_exception_ptr(error));
134-
headers_promise.set_exception(std::make_exception_ptr(error));
135-
source_promise.set_exception(std::make_exception_ptr(error));
136-
destination_promise.set_exception(std::make_exception_ptr(error));
137-
body_promise.set_exception(std::make_exception_ptr(error));
131+
version_promise.set_exception(error);
132+
status_promise.set_exception(error);
133+
status_message_promise.set_exception(error);
134+
headers_promise.set_exception(error);
135+
source_promise.set_exception(error);
136+
destination_promise.set_exception(error);
137+
body_promise.set_exception(error);
138138
} else {
139139
partial_parsed.append(std::begin(result_range),
140140
std::end(result_range));
@@ -175,12 +175,12 @@ struct http_async_protocol_handler {
175175
<< "\"");
176176
#endif
177177
std::runtime_error error("Invalid status part.");
178-
status_promise.set_exception(std::make_exception_ptr(error));
179-
status_message_promise.set_exception(std::make_exception_ptr(error));
180-
headers_promise.set_exception(std::make_exception_ptr(error));
181-
source_promise.set_exception(std::make_exception_ptr(error));
182-
destination_promise.set_exception(std::make_exception_ptr(error));
183-
body_promise.set_exception(std::make_exception_ptr(error));
178+
status_promise.set_exception(error);
179+
status_message_promise.set_exception(error);
180+
headers_promise.set_exception(error);
181+
source_promise.set_exception(error);
182+
destination_promise.set_exception(error);
183+
body_promise.set_exception(error);
184184
} else {
185185
partial_parsed.append(std::begin(result_range),
186186
std::end(result_range));
@@ -221,11 +221,11 @@ struct http_async_protocol_handler {
221221
<< "\"");
222222
#endif
223223
std::runtime_error error("Invalid status message part.");
224-
status_message_promise.set_exception(std::make_exception_ptr(error));
225-
headers_promise.set_exception(std::make_exception_ptr(error));
226-
source_promise.set_exception(std::make_exception_ptr(error));
227-
destination_promise.set_exception(std::make_exception_ptr(error));
228-
body_promise.set_exception(std::make_exception_ptr(error));
224+
status_message_promise.set_exception(error);
225+
headers_promise.set_exception(error);
226+
source_promise.set_exception(error);
227+
destination_promise.set_exception(error);
228+
body_promise.set_exception(error);
229229
} else {
230230
partial_parsed.append(std::begin(result_range),
231231
std::end(result_range));
@@ -323,10 +323,10 @@ struct http_async_protocol_handler {
323323
<< boost::distance(result_range));
324324
#endif
325325
std::runtime_error error("Invalid header part.");
326-
headers_promise.set_exception(std::make_exception_ptr(error));
327-
body_promise.set_exception(std::make_exception_ptr(error));
328-
source_promise.set_exception(std::make_exception_ptr(error));
329-
destination_promise.set_exception(std::make_exception_ptr(error));
326+
headers_promise.set_exception(error);
327+
body_promise.set_exception(error);
328+
source_promise.set_exception(error);
329+
destination_promise.set_exception(error);
330330
} else {
331331
partial_parsed.append(std::begin(result_range),
332332
std::end(result_range));

libs/network/test/http/client_get_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ TYPED_TEST(HTTPClientTest, GetRequestSNI) {
5555
// trying without setting sni_hostname
5656
ASSERT_NO_THROW(response = client().get(request));
5757
// raise "tlsv1 alert internal error"
58-
ASSERT_THROW(response.status(), std::exception_ptr);
58+
ASSERT_THROW(response.status(), boost::system::system_error);
5959

6060
// setting sni_hostname
6161
request.sni_hostname(request.host());

0 commit comments

Comments
 (0)