1313#include < openssl/ssl.h>
1414
1515namespace SimpleWeb {
16- typedef asio::ssl::stream<asio::ip::tcp::socket> HTTPS ;
16+ using HTTPS = asio::ssl::stream<asio::ip::tcp::socket>;
1717
1818 template <>
1919 class Server <HTTPS> : public ServerBase<HTTPS> {
20- std::string session_id_context;
2120 bool set_session_id_context = false ;
2221
2322 public:
@@ -33,31 +32,32 @@ namespace SimpleWeb {
3332 }
3433 }
3534
36- void start () override {
35+ protected:
36+ asio::ssl::context context;
37+
38+ void after_bind () override {
3739 if (set_session_id_context) {
3840 // Creating session_id_context from address:port but reversed due to small SSL_MAX_SSL_SESSION_ID_LENGTH
39- session_id_context = std::to_string (config .port ) + ' :' ;
41+ auto session_id_context = std::to_string (acceptor-> local_endpoint () .port () ) + ' :' ;
4042 session_id_context.append (config.address .rbegin (), config.address .rend ());
4143 SSL_CTX_set_session_id_context (context.native_handle (), reinterpret_cast <const unsigned char *>(session_id_context.data ()),
42- std::min<size_t >(session_id_context.size (), SSL_MAX_SSL_SESSION_ID_LENGTH));
44+ std::min<std:: size_t >(session_id_context.size (), SSL_MAX_SSL_SESSION_ID_LENGTH));
4345 }
44- ServerBase::start ();
4546 }
4647
47- protected:
48- asio::ssl::context context;
49-
5048 void accept () override {
51- auto session = std::make_shared<Session>( create_connection (*io_service, context) );
49+ auto connection = create_connection (*io_service, context);
5250
53- acceptor->async_accept (session-> connection ->socket ->lowest_layer (), [this , session ](const error_code &ec) {
54- auto cancel_pair = session-> connection -> cancel_handlers_bool_and_lock ();
55- if (cancel_pair. first )
51+ acceptor->async_accept (connection->socket ->lowest_layer (), [this , connection ](const error_code &ec) {
52+ auto lock = connection-> handler_runner -> continue_lock ();
53+ if (!lock )
5654 return ;
5755
5856 if (ec != asio::error::operation_aborted)
5957 this ->accept ();
6058
59+ auto session = std::make_shared<Session>(config.max_request_streambuf_size , connection);
60+
6161 if (!ec) {
6262 asio::ip::tcp::no_delay option (true );
6363 error_code ec;
@@ -66,11 +66,11 @@ namespace SimpleWeb {
6666 session->connection ->set_timeout (config.timeout_request );
6767 session->connection ->socket ->async_handshake (asio::ssl::stream_base::server, [this , session](const error_code &ec) {
6868 session->connection ->cancel_timeout ();
69- auto cancel_pair = session->connection ->cancel_handlers_bool_and_lock ();
70- if (cancel_pair. first )
69+ auto lock = session->connection ->handler_runner -> continue_lock ();
70+ if (!lock )
7171 return ;
7272 if (!ec)
73- this ->read_request_and_content (session);
73+ this ->read (session);
7474 else if (this ->on_error )
7575 this ->on_error (session->request , ec);
7676 });
0 commit comments