mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 07:24:58 +00:00

Similar to POSIX read, the basic read and write functions of AK::Stream do not have a lower limit of how much data they read or write (apart from "none at all"). Rename the functions to "read some [data]" and "write some [data]" (with "data" being omitted, since everything here is reading and writing data) to make them sufficiently distinct from the functions that ensure to use the entire buffer (which should be the go-to function for most usages). No functional changes, just a lot of new FIXMEs.
90 lines
2.4 KiB
C++
90 lines
2.4 KiB
C++
/*
|
|
* Copyright (c) 2021, Dex♪ <dexes.ttp@gmail.com>
|
|
* Copyright (c) 2022, Ali Mohammad Pur <mpfard@serenityos.org>
|
|
* Copyright (c) 2022, the SerenityOS developers.
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibCore/EventLoop.h>
|
|
#include <LibCore/Socket.h>
|
|
#include <LibWebSocket/Impl/WebSocketImplSerenity.h>
|
|
|
|
namespace WebSocket {
|
|
|
|
WebSocketImplSerenity::~WebSocketImplSerenity() = default;
|
|
WebSocketImplSerenity::WebSocketImplSerenity() = default;
|
|
|
|
bool WebSocketImplSerenity::can_read_line()
|
|
{
|
|
return MUST(m_socket->can_read_line());
|
|
}
|
|
|
|
bool WebSocketImplSerenity::send(ReadonlyBytes bytes)
|
|
{
|
|
return !m_socket->write_entire_buffer(bytes).is_error();
|
|
}
|
|
|
|
bool WebSocketImplSerenity::eof()
|
|
{
|
|
return m_socket->is_eof();
|
|
}
|
|
|
|
void WebSocketImplSerenity::discard_connection()
|
|
{
|
|
m_socket = nullptr;
|
|
}
|
|
|
|
void WebSocketImplSerenity::connect(ConnectionInfo const& connection_info)
|
|
{
|
|
VERIFY(!m_socket);
|
|
VERIFY(on_connected);
|
|
VERIFY(on_connection_error);
|
|
VERIFY(on_ready_to_read);
|
|
auto socket_result = [&]() -> ErrorOr<NonnullOwnPtr<Core::BufferedSocketBase>> {
|
|
if (connection_info.is_secure()) {
|
|
TLS::Options options;
|
|
options.set_alert_handler([this](auto) {
|
|
on_connection_error();
|
|
});
|
|
return TRY(Core::BufferedSocket<TLS::TLSv12>::create(
|
|
TRY(TLS::TLSv12::connect(connection_info.url().host(), connection_info.url().port_or_default(), move(options)))));
|
|
}
|
|
|
|
return TRY(Core::BufferedTCPSocket::create(
|
|
TRY(Core::TCPSocket::connect(connection_info.url().host(), connection_info.url().port_or_default()))));
|
|
}();
|
|
|
|
if (socket_result.is_error()) {
|
|
Core::deferred_invoke([this] {
|
|
on_connection_error();
|
|
});
|
|
return;
|
|
}
|
|
|
|
m_socket = socket_result.release_value();
|
|
|
|
m_socket->on_ready_to_read = [this] {
|
|
on_ready_to_read();
|
|
};
|
|
|
|
Core::deferred_invoke([this] {
|
|
on_connected();
|
|
});
|
|
}
|
|
|
|
ErrorOr<ByteBuffer> WebSocketImplSerenity::read(int max_size)
|
|
{
|
|
auto buffer = TRY(ByteBuffer::create_uninitialized(max_size));
|
|
auto read_bytes = TRY(m_socket->read_some(buffer));
|
|
return buffer.slice(0, read_bytes.size());
|
|
}
|
|
|
|
ErrorOr<DeprecatedString> WebSocketImplSerenity::read_line(size_t size)
|
|
{
|
|
auto buffer = TRY(ByteBuffer::create_uninitialized(size));
|
|
auto line = TRY(m_socket->read_line(buffer));
|
|
return line.to_deprecated_string();
|
|
}
|
|
|
|
}
|