WebSocketImplSerenity.cpp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) 2021, Dex♪ <dexes.ttp@gmail.com>
  3. * Copyright (c) 2022, Ali Mohammad Pur <mpfard@serenityos.org>
  4. * Copyright (c) 2022, the SerenityOS developers.
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include <LibCore/EventLoop.h>
  9. #include <LibCore/Socket.h>
  10. #include <LibWebSocket/Impl/WebSocketImplSerenity.h>
  11. namespace WebSocket {
  12. WebSocketImplSerenity::~WebSocketImplSerenity() = default;
  13. WebSocketImplSerenity::WebSocketImplSerenity() = default;
  14. bool WebSocketImplSerenity::can_read_line()
  15. {
  16. return MUST(m_socket->can_read_line());
  17. }
  18. bool WebSocketImplSerenity::send(ReadonlyBytes bytes)
  19. {
  20. return !m_socket->write_until_depleted(bytes).is_error();
  21. }
  22. bool WebSocketImplSerenity::eof()
  23. {
  24. return m_socket->is_eof();
  25. }
  26. void WebSocketImplSerenity::discard_connection()
  27. {
  28. m_socket = nullptr;
  29. }
  30. void WebSocketImplSerenity::connect(ConnectionInfo const& connection_info)
  31. {
  32. VERIFY(!m_socket);
  33. VERIFY(on_connected);
  34. VERIFY(on_connection_error);
  35. VERIFY(on_ready_to_read);
  36. auto socket_result = [&]() -> ErrorOr<NonnullOwnPtr<Core::BufferedSocketBase>> {
  37. auto host = TRY(connection_info.url().serialized_host()).to_byte_string();
  38. if (connection_info.is_secure()) {
  39. TLS::Options options;
  40. options.set_alert_handler([this](auto) {
  41. on_connection_error();
  42. });
  43. return TRY(Core::BufferedSocket<TLS::TLSv12>::create(
  44. TRY(TLS::TLSv12::connect(host, connection_info.url().port_or_default(), move(options)))));
  45. }
  46. return TRY(Core::BufferedTCPSocket::create(
  47. TRY(Core::TCPSocket::connect(host, connection_info.url().port_or_default()))));
  48. }();
  49. if (socket_result.is_error()) {
  50. Core::deferred_invoke([this] {
  51. on_connection_error();
  52. });
  53. return;
  54. }
  55. m_socket = socket_result.release_value();
  56. m_socket->on_ready_to_read = [this] {
  57. on_ready_to_read();
  58. };
  59. Core::deferred_invoke([this] {
  60. on_connected();
  61. });
  62. }
  63. ErrorOr<ByteBuffer> WebSocketImplSerenity::read(int max_size)
  64. {
  65. auto buffer = TRY(ByteBuffer::create_uninitialized(max_size));
  66. auto read_bytes = TRY(m_socket->read_some(buffer));
  67. return buffer.slice(0, read_bytes.size());
  68. }
  69. ErrorOr<ByteString> WebSocketImplSerenity::read_line(size_t size)
  70. {
  71. auto buffer = TRY(ByteBuffer::create_uninitialized(size));
  72. auto line = TRY(m_socket->read_line(buffer));
  73. return line.to_byte_string();
  74. }
  75. }