diff --git a/client_http.hpp b/client_http.hpp index 8d5db7a..40caf75 100644 --- a/client_http.hpp +++ b/client_http.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace SimpleWeb { template @@ -92,13 +93,15 @@ namespace SimpleWeb { if(timer) timer->cancel(); if(ec) { - socket=nullptr; - throw boost::system::system_error(ec); - } + std::lock_guard lock(socket_mutex); + socket=nullptr; + throw boost::system::system_error(ec); + } }); } } else { + std::lock_guard lock(socket_mutex); socket=nullptr; throw boost::system::system_error(ec); } @@ -138,6 +141,7 @@ namespace SimpleWeb { if(timer) timer->cancel(); if(ec) { + std::lock_guard lock(socket_mutex); socket=nullptr; throw boost::system::system_error(ec); } @@ -149,6 +153,7 @@ namespace SimpleWeb { } void close() { + std::lock_guard lock(socket_mutex); if(socket) { boost::system::error_code ec; socket->lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); @@ -162,6 +167,7 @@ namespace SimpleWeb { boost::asio::ip::tcp::resolver resolver; std::unique_ptr socket; + std::mutex socket_mutex; std::string host; unsigned short port; @@ -248,6 +254,7 @@ namespace SimpleWeb { if(timer) timer->cancel(); if(ec) { + std::lock_guard lock(socket_mutex); this->socket=nullptr; throw boost::system::system_error(ec); } @@ -259,6 +266,7 @@ namespace SimpleWeb { } } else { + std::lock_guard lock(socket_mutex); socket=nullptr; throw boost::system::system_error(ec); } @@ -313,6 +321,7 @@ namespace SimpleWeb { post_process(); } else { + std::lock_guard lock(socket_mutex); this->socket=nullptr; throw boost::system::system_error(ec); } @@ -322,6 +331,7 @@ namespace SimpleWeb { post_process(); } else { + std::lock_guard lock(socket_mutex); socket=nullptr; throw boost::system::system_error(ec); } @@ -347,7 +357,10 @@ namespace SimpleWeb { resolver.async_resolve(query, [this](const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it){ if(!ec) { - socket=std::unique_ptr(new HTTP(io_service)); + { + std::lock_guard lock(socket_mutex); + socket=std::unique_ptr(new HTTP(io_service)); + } boost::asio::async_connect(*socket, it, [this] (const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator /*it*/){ @@ -356,12 +369,14 @@ namespace SimpleWeb { this->socket->set_option(option); } else { + std::lock_guard lock(socket_mutex); this->socket=nullptr; throw boost::system::system_error(ec); } }); } else { + std::lock_guard lock(socket_mutex); socket=nullptr; throw boost::system::system_error(ec); } diff --git a/client_https.hpp b/client_https.hpp index 96944cf..378e5d4 100644 --- a/client_https.hpp +++ b/client_https.hpp @@ -40,7 +40,10 @@ namespace SimpleWeb { resolver.async_resolve(query, [this] (const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it){ if(!ec) { - socket=std::unique_ptr(new HTTPS(io_service, context)); + { + std::lock_guard lock(socket_mutex); + socket=std::unique_ptr(new HTTPS(io_service, context)); + } boost::asio::async_connect(socket->lowest_layer(), it, [this] (const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator /*it*/){ @@ -54,18 +57,21 @@ namespace SimpleWeb { if(timer) timer->cancel(); if(ec) { + std::lock_guard lock(socket_mutex); this->socket=nullptr; throw boost::system::system_error(ec); } }); } else { + std::lock_guard lock(socket_mutex); this->socket=nullptr; throw boost::system::system_error(ec); } }); } else { + std::lock_guard lock(socket_mutex); socket=nullptr; throw boost::system::system_error(ec); }