Skip to content

Commit 5355e91

Browse files
committed
Merge branch 'listenercloseissue' into staging
2 parents 76150d8 + ce65bc8 commit 5355e91

File tree

10 files changed

+145
-102
lines changed

10 files changed

+145
-102
lines changed

Release/include/cpprest/filestream.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ namespace details {
111111
typedef typename basic_streambuf<_CharType>::pos_type pos_type;
112112
typedef typename basic_streambuf<_CharType>::off_type off_type;
113113

114-
virtual ~basic_file_buffer() {
114+
virtual ~basic_file_buffer()
115+
{
115116
if( this->can_read() )
116117
{
117118
this->_close_read().wait();
@@ -122,6 +123,7 @@ namespace details {
122123
this->_close_write().wait();
123124
}
124125
}
126+
125127
protected:
126128

127129
/// <summary>

Release/include/cpprest/http_client_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ class _http_client_communicator
388388

389389
// Queue used to guarantee ordering of requests, when applicable.
390390
std::queue<std::shared_ptr<request_context>> m_requests_queue;
391-
int m_scheduled;
391+
int m_scheduled;
392392
};
393393

394394
inline void request_context::finish()

Release/include/cpprest/http_listener.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ class http_listener_impl
157157
/// Handler for all requests. The HTTP host uses this to dispatch a message to the pipeline.
158158
/// </summary>
159159
/// <remarks>Only HTTP server implementations should call this API.</remarks>
160-
_ASYNCRTIMP pplx::task<http::http_response> handle_request(http::http_request msg);
160+
_ASYNCRTIMP void handle_request(http::http_request msg);
161161

162162
const http::uri & uri() const { return m_uri; }
163163

Release/include/cpprest/http_msg.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -344,10 +344,10 @@ class _http_response : public http::details::http_msg_base
344344

345345
_http_server_context * _get_server_context() const { return m_server_context.get(); }
346346

347-
void _set_server_context(std::shared_ptr<details::_http_server_context> server_context) { m_server_context = std::move(server_context); }
347+
void _set_server_context(std::unique_ptr<details::_http_server_context> server_context) { m_server_context = std::move(server_context); }
348348

349349
private:
350-
std::shared_ptr<_http_server_context> m_server_context;
350+
std::unique_ptr<_http_server_context> m_server_context;
351351

352352
unsigned long m_error_code;
353353

@@ -611,7 +611,7 @@ class http_response
611611
std::shared_ptr<http::details::_http_response> _get_impl() const { return _m_impl; }
612612

613613
http::details::_http_server_context * _get_server_context() const { return _m_impl->_get_server_context(); }
614-
void _set_server_context(std::shared_ptr<http::details::_http_server_context> server_context) { _m_impl->_set_server_context(std::move(server_context)); }
614+
void _set_server_context(std::unique_ptr<http::details::_http_server_context> server_context) { _m_impl->_set_server_context(std::move(server_context)); }
615615

616616
private:
617617

@@ -638,9 +638,9 @@ class _http_request : public http::details::http_msg_base, public std::enable_sh
638638

639639
_ASYNCRTIMP _http_request(http::method mtd);
640640

641-
_ASYNCRTIMP _http_request(std::shared_ptr<http::details::_http_server_context> server_context);
641+
_ASYNCRTIMP _http_request(std::unique_ptr<http::details::_http_server_context> server_context);
642642

643-
virtual ~_http_request() { }
643+
virtual ~_http_request() {}
644644

645645
http::method &method() { return m_method; }
646646

@@ -686,7 +686,7 @@ class _http_request : public http::details::http_msg_base, public std::enable_sh
686686

687687
http::details::_http_server_context * _get_server_context() const { return m_server_context.get(); }
688688

689-
void _set_server_context(std::shared_ptr<http::details::_http_server_context> server_context) { m_server_context = std::move(server_context); }
689+
void _set_server_context(std::unique_ptr<http::details::_http_server_context> server_context) { m_server_context = std::move(server_context); }
690690

691691
void _set_listener_path(const utility::string_t &path) { m_listener_path = path; }
692692

@@ -707,7 +707,7 @@ class _http_request : public http::details::http_msg_base, public std::enable_sh
707707
http::uri m_base_uri;
708708
http::uri m_uri;
709709
utility::string_t m_listener_path;
710-
std::shared_ptr<http::details::_http_server_context> m_server_context;
710+
std::unique_ptr<http::details::_http_server_context> m_server_context;
711711

712712
concurrency::streams::ostream m_response_stream;
713713

@@ -1134,8 +1134,8 @@ class http_request
11341134
/// <summary>
11351135
/// These are used for the initial creation of the HTTP request.
11361136
/// </summary>
1137-
static http_request _create_request(std::shared_ptr<http::details::_http_server_context> server_context) { return http_request(std::move(server_context)); }
1138-
void _set_server_context(std::shared_ptr<http::details::_http_server_context> server_context) { _m_impl->_set_server_context(std::move(server_context)); }
1137+
static http_request _create_request(std::unique_ptr<http::details::_http_server_context> server_context) { return http_request(std::move(server_context)); }
1138+
void _set_server_context(std::unique_ptr<http::details::_http_server_context> server_context) { _m_impl->_set_server_context(std::move(server_context)); }
11391139

11401140
void _set_listener_path(const utility::string_t &path) { _m_impl->_set_listener_path(path); }
11411141

@@ -1160,7 +1160,7 @@ class http_request
11601160
friend class http::details::_http_request;
11611161
friend class http::client::http_client;
11621162

1163-
http_request(std::shared_ptr<http::details::_http_server_context> server_context) : _m_impl(std::shared_ptr<details::_http_request>(new details::_http_request(std::move(server_context)))) {}
1163+
http_request(std::unique_ptr<http::details::_http_server_context> server_context) : _m_impl(std::make_shared<details::_http_request>(std::move(server_context))) {}
11641164
http_request(std::shared_ptr<http::details::_http_request> message) : _m_impl(message) {}
11651165

11661166
/// <summary>

Release/include/cpprest/http_windows_server.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ struct windows_request_context : http::details::_http_server_context
102102
void async_process_request(HTTP_REQUEST_ID request_id, http::http_request msg, const unsigned long headers_size);
103103

104104
// Dispatch request to the provided http_listener.
105-
void dispatch_request_to_listener(http_request& request, _In_ web::http::experimental::listener::details::http_listener_impl *pListener);
105+
void dispatch_request_to_listener(_In_ web::http::experimental::listener::details::http_listener_impl *pListener);
106106

107107
// Read in a portion of the request body.
108108
void read_request_body_chunk();
@@ -128,6 +128,8 @@ struct windows_request_context : http::details::_http_server_context
128128
void cancel_request_io_completion(DWORD error_code, DWORD bytes_read);
129129

130130
// TCE that indicates the completion of response
131+
// Workaround for ppl task_completion_event bug.
132+
std::mutex m_responseCompletedLock;
131133
pplx::task_completion_event<void> m_response_completed;
132134

133135
// Id of the currently processed request on this connection.

Release/src/http/common/http_msg.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ details::_http_request::_http_request(http::method mtd)
534534
}
535535
}
536536

537-
details::_http_request::_http_request(std::shared_ptr<http::details::_http_server_context> server_context)
537+
details::_http_request::_http_request(std::unique_ptr<http::details::_http_server_context> server_context)
538538
: m_initiated_response(0),
539539
m_server_context(std::move(server_context)),
540540
m_cancellationToken(pplx::cancellation_token::none())

Release/src/http/listener/http_listener.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ pplx::task<void> details::http_listener_impl::close()
137137
return web::http::experimental::details::http_server_api::unregister_listener(this);
138138
}
139139

140-
pplx::task<http_response> details::http_listener_impl::handle_request(http_request msg)
140+
void details::http_listener_impl::handle_request(http_request msg)
141141
{
142142
// Specific method handler takes priority over general.
143143
const method &mtd = msg.method();
@@ -165,8 +165,6 @@ pplx::task<http_response> details::http_listener_impl::handle_request(http_reque
165165
response.headers().add(U("Allow"), get_supported_methods());
166166
msg.reply(response);
167167
}
168-
169-
return msg.get_response();
170168
}
171169

172170
utility::string_t details::http_listener_impl::get_supported_methods() const

Release/src/http/listener/http_msg_listen.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,10 @@ pplx::task<void> details::_http_request::_reply_impl(http_response response)
6060
#if !defined(__cplusplus_winrt)
6161
auto server_api = experimental::details::http_server_api::server_api();
6262

63-
if ( m_server_context && server_api )
63+
if (m_server_context && server_api)
6464
{
6565
// Add a task-based continuation so no exceptions thrown from the task go 'unobserved'.
66-
response._set_server_context(m_server_context);
66+
response._set_server_context(std::move(m_server_context));
6767
response_completed = experimental::details::http_server_api::server_api()->respond(response);
6868
response_completed.then([](pplx::task<void> t)
6969
{

0 commit comments

Comments
 (0)