*Fixes #135: memory leak that was introduces Jun 17, 2017 in e1aebba344

This commit is contained in:
eidheim 2017-06-24 13:19:53 +02:00
commit 20d3c44366

View file

@ -93,6 +93,7 @@ namespace SimpleWeb {
query=std::unique_ptr<asio::ip::tcp::resolver::query>(new asio::ip::tcp::resolver::query(proxy_host_port.first, std::to_string(proxy_host_port.second))); query=std::unique_ptr<asio::ip::tcp::resolver::query>(new asio::ip::tcp::resolver::query(proxy_host_port.first, std::to_string(proxy_host_port.second)));
} }
} }
std::string host; std::string host;
unsigned short port; unsigned short port;
Config config; Config config;
@ -161,16 +162,18 @@ namespace SimpleWeb {
void request(const std::string &method, const std::string &path, string_view content, const CaseInsensitiveMultimap& header, void request(const std::string &method, const std::string &path, string_view content, const CaseInsensitiveMultimap& header,
std::function<void(std::shared_ptr<Response>, const error_code&)> &&request_callback_) { std::function<void(std::shared_ptr<Response>, const error_code&)> &&request_callback_) {
auto session=std::make_shared<Session>(io_service, get_connection(), create_request_header(method, path, header)); auto session=std::make_shared<Session>(io_service, get_connection(), create_request_header(method, path, header));
auto connection=session->connection;
auto response=session->response;
auto request_callback=std::make_shared<std::function<void(std::shared_ptr<Response>, const error_code&)>>(std::move(request_callback_)); auto request_callback=std::make_shared<std::function<void(std::shared_ptr<Response>, const error_code&)>>(std::move(request_callback_));
auto connections_mutex=this->connections_mutex; auto connections_mutex=this->connections_mutex;
session->callback=[session, request_callback, connections_mutex](const error_code &ec) { session->callback=[connection, response, request_callback, connections_mutex](const error_code &ec) {
{ {
std::lock_guard<std::mutex> lock(*connections_mutex); std::lock_guard<std::mutex> lock(*connections_mutex);
session->connection->in_use=false; connection->in_use=false;
} }
if(*request_callback) if(*request_callback)
(*request_callback)(session->response, ec); (*request_callback)(response, ec);
}; };
std::ostream write_stream(session->request_buffer.get()); std::ostream write_stream(session->request_buffer.get());
@ -202,16 +205,18 @@ namespace SimpleWeb {
void request(const std::string &method, const std::string &path, std::istream& content, const CaseInsensitiveMultimap& header, void request(const std::string &method, const std::string &path, std::istream& content, const CaseInsensitiveMultimap& header,
std::function<void(std::shared_ptr<Response>, const error_code&)> &&request_callback_) { std::function<void(std::shared_ptr<Response>, const error_code&)> &&request_callback_) {
auto session=std::make_shared<Session>(io_service, get_connection(), create_request_header(method, path, header)); auto session=std::make_shared<Session>(io_service, get_connection(), create_request_header(method, path, header));
auto connection=session->connection;
auto response=session->response;
auto request_callback=std::make_shared<std::function<void(std::shared_ptr<Response>, const error_code&)>>(std::move(request_callback_)); auto request_callback=std::make_shared<std::function<void(std::shared_ptr<Response>, const error_code&)>>(std::move(request_callback_));
auto connections_mutex=this->connections_mutex; auto connections_mutex=this->connections_mutex;
session->callback=[session, request_callback, connections_mutex](const error_code &ec) { session->callback=[connection, response, request_callback, connections_mutex](const error_code &ec) {
{ {
std::lock_guard<std::mutex> lock(*connections_mutex); std::lock_guard<std::mutex> lock(*connections_mutex);
session->connection->in_use=false; connection->in_use=false;
} }
if(*request_callback) if(*request_callback)
(*request_callback)(session->response, ec); (*request_callback)(response, ec);
}; };
content.seekg(0, std::ios::end); content.seekg(0, std::ios::end);