提交 ad4d09a1 编写于 作者: Y youngwolf

Maintain the ssl::context in ssl::single_client_base.

Fix ssl graceful shutdown monitoring.
上级 8b2de2c0
Subproject commit 147f7225a96d45a2807a64e443177f621844e51c
Subproject commit a71f5232d207b4f3bbd253eb1041e30b5e4ea606
......@@ -27,7 +27,7 @@ private:
protected:
timed_object_pool(service_pump& service_pump_) : ObjectPool(service_pump_) {}
timed_object_pool(service_pump& service_pump_, asio::ssl::context::method&& m) : ObjectPool(service_pump_, std::forward<asio::ssl::context::method>(m)) {}
timed_object_pool(service_pump& service_pump_, const asio::ssl::context::method& m) : ObjectPool(service_pump_, m) {}
void start()
{
......
......@@ -57,13 +57,13 @@ int main(int argc, const char* argv[])
/*
//method #2
//to use single_client, we must construct ssl context first.
asio::ssl::context ctx(asio::ssl::context::sslv23_client);
ctx.set_options(asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | asio::ssl::context::single_dh_use);
ctx.set_verify_mode(asio::ssl::context::verify_peer | asio::ssl::context::verify_fail_if_no_peer_cert);
ctx.load_verify_file("certs/server.crt");
ctx.use_certificate_chain_file("client_certs/server.crt");
ctx.use_private_key_file("client_certs/server.key", asio::ssl::context::pem);
ctx.use_tmp_dh_file("client_certs/dh2048.pem");
auto ctx = std::make_shared<asio::ssl::context>(asio::ssl::context::sslv23_client);
ctx->set_options(asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | asio::ssl::context::single_dh_use);
ctx->set_verify_mode(asio::ssl::context::verify_peer | asio::ssl::context::verify_fail_if_no_peer_cert);
ctx->load_verify_file("certs/server.crt");
ctx->use_certificate_chain_file("client_certs/server.crt");
ctx->use_private_key_file("client_certs/server.key", asio::ssl::context::pem);
ctx->use_tmp_dh_file("client_certs/dh2048.pem");
single_client client_(sp, ctx);
*/
......
......@@ -41,6 +41,7 @@ protected:
else
this->show_info(ec, nullptr, "handshake failed");
}
virtual void on_recv_error(const asio::error_code& ec) {this->stop_graceful_shutdown_monitoring(); Socket::on_recv_error(ec);}
void shutdown_ssl()
{
......@@ -49,7 +50,9 @@ protected:
this->show_info("ssl link:", "been shutting down.");
this->start_graceful_shutdown_monitoring();
this->next_layer().async_shutdown(this->make_handler_error([this](const asio::error_code& ec) {
this->stop_graceful_shutdown_monitoring();
//do not stop the shutdown monitoring at here, sometimes, this async_shutdown cannot trigger on_recv_error,
//very strange, maybe, there's a bug in Asio. so we stop it in on_recv_error.
//this->stop_graceful_shutdown_monitoring();
if (ec)
this->show_info(ec, "ssl link", "async shutdown failed");
}));
......@@ -125,11 +128,11 @@ private:
typedef ascs::object_pool<Object> super;
public:
object_pool(service_pump& service_pump_, asio::ssl::context::method&& m) : super(service_pump_), ctx(std::forward<asio::ssl::context::method>(m)) {}
object_pool(service_pump& service_pump_, const asio::ssl::context::method& m) : super(service_pump_), ctx(m) {}
asio::ssl::context& context() {return ctx;}
protected:
template<typename Arg> typename object_pool::object_type create_object(Arg&& arg) {return super::create_object(std::forward<Arg>(arg), ctx);}
template<typename Arg> typename super::object_type create_object(Arg&& arg) {return super::create_object(std::forward<Arg>(arg), ctx);}
private:
asio::ssl::context ctx;
......@@ -162,7 +165,7 @@ protected:
return true;
}
virtual void on_unpack_error() {unified_out::info_out(ASCS_LLF " can not unpack msg.", this->id()); this->unpacker()->dump_left_data(); this->force_shutdown();}
virtual void on_unpack_error() {unified_out::info_out(ASCS_LLF " can not unpack msg.", this->id()); this->unpacker()->dump_left_data(); force_shutdown();}
private:
void handle_handshake(const asio::error_code& ec)
......@@ -181,10 +184,13 @@ private:
typedef tcp::single_client_base<Socket> super;
public:
single_client_base(service_pump& service_pump_, asio::ssl::context& ctx_) : super(service_pump_, ctx_) {}
template<typename Arg> single_client_base(service_pump& service_pump_, Arg&& arg) : super(service_pump_, *arg), ctx_holder(std::forward<Arg>(arg)) {}
protected:
virtual bool init() {if (0 == this->get_io_context_refs()) this->reset_next_layer(this->get_context()); return super::init();}
private:
std::shared_ptr<asio::ssl::context> ctx_holder;
};
template<typename Socket, typename Pool = object_pool<Socket>, typename Matrix = i_matrix> using multi_client_base = tcp::multi_client_base<Socket, Pool, Matrix>;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册