WebSocketImplSerenity.cpp 2.5 KB

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