WebSocketImplSerenity.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. if (connection_info.is_secure()) {
  38. TLS::Options options;
  39. options.set_alert_handler([this](auto) {
  40. on_connection_error();
  41. });
  42. return TRY(Core::BufferedSocket<TLS::TLSv12>::create(
  43. TRY(TLS::TLSv12::connect(connection_info.url().host(), connection_info.url().port_or_default(), move(options)))));
  44. }
  45. return TRY(Core::BufferedTCPSocket::create(
  46. TRY(Core::TCPSocket::connect(connection_info.url().host(), connection_info.url().port_or_default()))));
  47. }();
  48. if (socket_result.is_error()) {
  49. Core::deferred_invoke([this] {
  50. on_connection_error();
  51. });
  52. return;
  53. }
  54. m_socket = socket_result.release_value();
  55. m_socket->on_ready_to_read = [this] {
  56. on_ready_to_read();
  57. };
  58. Core::deferred_invoke([this] {
  59. on_connected();
  60. });
  61. }
  62. ErrorOr<ByteBuffer> WebSocketImplSerenity::read(int max_size)
  63. {
  64. auto buffer = TRY(ByteBuffer::create_uninitialized(max_size));
  65. auto read_bytes = TRY(m_socket->read_some(buffer));
  66. return buffer.slice(0, read_bytes.size());
  67. }
  68. ErrorOr<DeprecatedString> WebSocketImplSerenity::read_line(size_t size)
  69. {
  70. auto buffer = TRY(ByteBuffer::create_uninitialized(size));
  71. auto line = TRY(m_socket->read_line(buffer));
  72. return line.to_deprecated_string();
  73. }
  74. }