Скажите, что кто-то пытается получить доступ к моему маршруту 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());
}
});
}