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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy