RequestServerAdapter.cpp 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "WebSocketClientAdapter.h"
  7. #include <LibRequests/Request.h>
  8. #include <LibRequests/RequestClient.h>
  9. #include <LibWebView/RequestServerAdapter.h>
  10. namespace WebView {
  11. ErrorOr<NonnullRefPtr<RequestServerRequestAdapter>> RequestServerRequestAdapter::try_create(NonnullRefPtr<Requests::Request> request)
  12. {
  13. return adopt_nonnull_ref_or_enomem(new (nothrow) RequestServerRequestAdapter(move(request)));
  14. }
  15. RequestServerRequestAdapter::RequestServerRequestAdapter(NonnullRefPtr<Requests::Request> request)
  16. : m_request(request)
  17. {
  18. request->on_certificate_requested = [weak_this = make_weak_ptr()]() {
  19. if (auto strong_this = weak_this.strong_ref()) {
  20. if (strong_this->on_certificate_requested) {
  21. auto certificate_and_key = strong_this->on_certificate_requested();
  22. return Requests::Request::CertificateAndKey {
  23. .certificate = move(certificate_and_key.certificate),
  24. .key = move(certificate_and_key.key),
  25. };
  26. }
  27. }
  28. return Requests::Request::CertificateAndKey {};
  29. };
  30. }
  31. RequestServerRequestAdapter::~RequestServerRequestAdapter() = default;
  32. void RequestServerRequestAdapter::set_buffered_request_finished_callback(Requests::Request::BufferedRequestFinished on_buffered_request_finished)
  33. {
  34. m_request->set_buffered_request_finished_callback(move(on_buffered_request_finished));
  35. }
  36. void RequestServerRequestAdapter::set_unbuffered_request_callbacks(Requests::Request::HeadersReceived on_headers_received, Requests::Request::DataReceived on_data_received, Requests::Request::RequestFinished on_finished)
  37. {
  38. m_request->set_unbuffered_request_callbacks(move(on_headers_received), move(on_data_received), move(on_finished));
  39. }
  40. bool RequestServerRequestAdapter::stop()
  41. {
  42. return m_request->stop();
  43. }
  44. ErrorOr<NonnullRefPtr<RequestServerAdapter>> RequestServerAdapter::try_create(NonnullRefPtr<Requests::RequestClient> protocol_client)
  45. {
  46. return try_make_ref_counted<RequestServerAdapter>(move(protocol_client));
  47. }
  48. ErrorOr<NonnullRefPtr<RequestServerAdapter>> RequestServerAdapter::try_create()
  49. {
  50. auto protocol_client = TRY(Requests::RequestClient::try_create());
  51. return try_make_ref_counted<RequestServerAdapter>(move(protocol_client));
  52. }
  53. RequestServerAdapter::RequestServerAdapter(NonnullRefPtr<Requests::RequestClient> protocol_client)
  54. : m_protocol_client(protocol_client)
  55. {
  56. }
  57. RequestServerAdapter::~RequestServerAdapter() = default;
  58. RefPtr<Web::ResourceLoaderConnectorRequest> RequestServerAdapter::start_request(ByteString const& method, URL::URL const& url, HTTP::HeaderMap const& headers, ReadonlyBytes body, Core::ProxyData const& proxy)
  59. {
  60. auto protocol_request = m_protocol_client->start_request(method, url, headers, body, proxy);
  61. if (!protocol_request)
  62. return {};
  63. return RequestServerRequestAdapter::try_create(protocol_request.release_nonnull()).release_value_but_fixme_should_propagate_errors();
  64. }
  65. RefPtr<Web::WebSockets::WebSocketClientSocket> RequestServerAdapter::websocket_connect(URL::URL const& url, AK::ByteString const& origin, Vector<AK::ByteString> const& protocols)
  66. {
  67. auto underlying_websocket = m_protocol_client->websocket_connect(url, origin, protocols);
  68. if (!underlying_websocket)
  69. return {};
  70. return WebSocketClientSocketAdapter::create(underlying_websocket.release_nonnull());
  71. }
  72. void RequestServerAdapter::prefetch_dns(URL::URL const& url)
  73. {
  74. m_protocol_client->ensure_connection(url, RequestServer::CacheLevel::ResolveOnly);
  75. }
  76. void RequestServerAdapter::preconnect(URL::URL const& url)
  77. {
  78. m_protocol_client->ensure_connection(url, RequestServer::CacheLevel::CreateConnection);
  79. }
  80. }