
This was caused by a double notifier on the TLS socket, which caused the TLS code to freak out about not being able to read properly. In addition, the existing loop inside of drain_read() has been replaced by code that actually works, and which includes new warnings when the drain method is called before initialization is done or after the websocket gets closed.
96 lines
2.3 KiB
C++
96 lines
2.3 KiB
C++
/*
|
|
* Copyright (c) 2021, Dex♪ <dexes.ttp@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibWebSocket/Impl/TLSv12WebSocketConnectionImpl.h>
|
|
|
|
namespace WebSocket {
|
|
|
|
TLSv12WebSocketConnectionImpl::TLSv12WebSocketConnectionImpl(Core::Object* parent)
|
|
: AbstractWebSocketImpl(parent)
|
|
{
|
|
}
|
|
|
|
TLSv12WebSocketConnectionImpl::~TLSv12WebSocketConnectionImpl()
|
|
{
|
|
discard_connection();
|
|
}
|
|
|
|
void TLSv12WebSocketConnectionImpl::connect(ConnectionInfo const& connection)
|
|
{
|
|
VERIFY(!m_socket);
|
|
VERIFY(on_connected);
|
|
VERIFY(on_connection_error);
|
|
VERIFY(on_ready_to_read);
|
|
m_socket = TLS::TLSv12::construct(this);
|
|
|
|
m_socket->set_root_certificates(DefaultRootCACertificates::the().certificates());
|
|
m_socket->on_tls_error = [this](TLS::AlertDescription) {
|
|
on_connection_error();
|
|
};
|
|
m_socket->on_tls_ready_to_read = [this] {
|
|
on_ready_to_read();
|
|
};
|
|
m_socket->on_tls_ready_to_write = [this] {
|
|
on_connected();
|
|
};
|
|
m_socket->on_tls_finished = [this] {
|
|
on_connection_error();
|
|
};
|
|
m_socket->on_tls_certificate_request = [this](auto&) {
|
|
// FIXME : Once we handle TLS certificate requests, handle it here as well.
|
|
};
|
|
bool success = m_socket->connect(connection.url().host(), connection.url().port());
|
|
if (!success) {
|
|
deferred_invoke([this](auto&) {
|
|
on_connection_error();
|
|
});
|
|
}
|
|
}
|
|
|
|
bool TLSv12WebSocketConnectionImpl::send(ReadonlyBytes data)
|
|
{
|
|
return m_socket->write(data);
|
|
}
|
|
|
|
bool TLSv12WebSocketConnectionImpl::can_read_line()
|
|
{
|
|
return m_socket->can_read_line();
|
|
}
|
|
|
|
String TLSv12WebSocketConnectionImpl::read_line(size_t size)
|
|
{
|
|
return m_socket->read_line(size);
|
|
}
|
|
|
|
bool TLSv12WebSocketConnectionImpl::can_read()
|
|
{
|
|
return m_socket->can_read();
|
|
}
|
|
|
|
ByteBuffer TLSv12WebSocketConnectionImpl::read(int max_size)
|
|
{
|
|
return m_socket->read(max_size);
|
|
}
|
|
|
|
bool TLSv12WebSocketConnectionImpl::eof()
|
|
{
|
|
return m_socket->eof();
|
|
}
|
|
|
|
void TLSv12WebSocketConnectionImpl::discard_connection()
|
|
{
|
|
if (!m_socket)
|
|
return;
|
|
m_socket->on_tls_connected = nullptr;
|
|
m_socket->on_tls_error = nullptr;
|
|
m_socket->on_tls_finished = nullptr;
|
|
m_socket->on_tls_certificate_request = nullptr;
|
|
m_socket->on_ready_to_read = nullptr;
|
|
remove_child(*m_socket);
|
|
m_socket = nullptr;
|
|
}
|
|
|
|
}
|