Есть ли способ ответить на неудачу рукопожатия boost :: asio :: ssl :: stream? - PullRequest
0 голосов
/ 21 декабря 2018

Скажите, что кто-то пытается получить доступ к моему маршруту https с помощью http, или его клиент не имеет надлежащего сертификата.Я хотел бы, чтобы мой сервер мог отправить обратно код ошибки.Это не возможно?

Когда у клиента будет правильный сертификат, я могу отправить ему любой ответ, какой захочу, после того, как рукопожатие пройдет успешно.Но когда попытка записи в сокет после сбоя рукопожатия, клиент не получает ничего из этого, и попытка закрыть соединение после этого, кажется, не сообщает клиенту, который все еще «обновляет» ожидание указанного ответа.Если я попытаюсь закрыть сокет после сбоя рукопожатия без записи, клиент увидит его и просто скажет, что получил ERR_EMPTY_RESPONSE

Так что, если рукопожатие не удалось, нет ли хорошего способа сообщитьклиент?

void Server::Accept()
{
    std::shared_ptr<socket> sk = CreateSocket();
    acceptor_.async_accept(sk->lowest_layer(),
    [this, sk](boost::system::error_code ec)
    {
        if(ec) { return; }
        Connection connection = std::make_shared<Connection>(sk, *this);
        if (!connection.IsValid())
        {
            return;
        }

        boost::asio::ip::tcp::no_delay option(true);
        boost::system::error_code resultCode;
        connection->GetSocket().lowest_layer().set_option(option, resultCode);
        if (resultCode)
        {
            StopConnection(_connection);
            return;
        }

        connection->GetSocket().async_handshake(boost::asio::ssl::stream_base::server, 
[this, connection](const boost::system::error_code &resultCode) {
        if (resultCode)
        {
            // Failed handshake! Doing a Write here, then a close behaves weird on the client.
            // If I just close here, the client just says he didn't get a response.
            connection->Write(errorCode512);
        }
        else
        {
            // Success, I can write whatever I want.
            connection->Start();
        }

    });
}

void Connection::Write(HttpReply reply)
{
    auto self(shared_from_this());
    boost::asio::async_write(*m_Socket, ToBuffers(reply),
        [this, self](boost::system::error_code ec, std::size_t)
    {

        boost::system::error_code errorCode;
        m_Socket->lowest_layer().shutdown(boost::asio::ip::tcp::socket::shutdown_both,
        errorCode);
        if(errorCode)
        {
            Log(errorCode.data());
        }

        m_Socket->lowest_layer().close(errorCode);
        if(errorCode)
        {
             Log(errorCode.data());
        }
    });
}
...