RequestServerAdapter.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCore/File.h>
  7. #include <LibProtocol/Request.h>
  8. #include <LibProtocol/RequestClient.h>
  9. #include <LibWebView/RequestServerAdapter.h>
  10. namespace WebView {
  11. ErrorOr<NonnullRefPtr<RequestServerRequestAdapter>> RequestServerRequestAdapter::try_create(NonnullRefPtr<Protocol::Request> request)
  12. {
  13. return adopt_nonnull_ref_or_enomem(new (nothrow) RequestServerRequestAdapter(move(request)));
  14. }
  15. RequestServerRequestAdapter::RequestServerRequestAdapter(NonnullRefPtr<Protocol::Request> request)
  16. : m_request(request)
  17. {
  18. request->on_buffered_request_finish = [weak_this = make_weak_ptr()](auto success, auto total_size, auto const& response_headers, auto response_code, auto payload) {
  19. if (auto strong_this = weak_this.strong_ref())
  20. if (strong_this->on_buffered_request_finish)
  21. strong_this->on_buffered_request_finish(success, total_size, response_headers, response_code, move(payload));
  22. };
  23. request->on_finish = [weak_this = make_weak_ptr()](bool success, u32 total_size) {
  24. if (auto strong_this = weak_this.strong_ref())
  25. if (strong_this->on_finish)
  26. strong_this->on_finish(success, total_size);
  27. };
  28. request->on_progress = [weak_this = make_weak_ptr()](Optional<u32> total_size, u32 downloaded_size) {
  29. if (auto strong_this = weak_this.strong_ref())
  30. if (strong_this->on_progress)
  31. strong_this->on_progress(total_size, downloaded_size);
  32. };
  33. request->on_certificate_requested = [weak_this = make_weak_ptr()]() {
  34. if (auto strong_this = weak_this.strong_ref()) {
  35. if (strong_this->on_certificate_requested) {
  36. auto certificate_and_key = strong_this->on_certificate_requested();
  37. return Protocol::Request::CertificateAndKey {
  38. .certificate = move(certificate_and_key.certificate),
  39. .key = move(certificate_and_key.key),
  40. };
  41. }
  42. }
  43. return Protocol::Request::CertificateAndKey {};
  44. };
  45. }
  46. RequestServerRequestAdapter::~RequestServerRequestAdapter() = default;
  47. void RequestServerRequestAdapter::set_should_buffer_all_input(bool should_buffer_all_input)
  48. {
  49. m_request->set_should_buffer_all_input(should_buffer_all_input);
  50. }
  51. bool RequestServerRequestAdapter::stop()
  52. {
  53. return m_request->stop();
  54. }
  55. void RequestServerRequestAdapter::stream_into(Core::Stream::Stream& stream)
  56. {
  57. m_request->stream_into(stream);
  58. }
  59. ErrorOr<NonnullRefPtr<RequestServerAdapter>> RequestServerAdapter::try_create()
  60. {
  61. auto protocol_client = TRY(Protocol::RequestClient::try_create());
  62. return adopt_nonnull_ref_or_enomem(new (nothrow) RequestServerAdapter(move(protocol_client)));
  63. }
  64. RequestServerAdapter::RequestServerAdapter(NonnullRefPtr<Protocol::RequestClient> protocol_client)
  65. : m_protocol_client(protocol_client)
  66. {
  67. }
  68. RequestServerAdapter::~RequestServerAdapter() = default;
  69. RefPtr<Web::ResourceLoaderConnectorRequest> RequestServerAdapter::start_request(String const& method, URL const& url, HashMap<String, String> const& headers, ReadonlyBytes body, Core::ProxyData const& proxy)
  70. {
  71. auto protocol_request = m_protocol_client->start_request(method, url, headers, body, proxy);
  72. if (!protocol_request)
  73. return {};
  74. return RequestServerRequestAdapter::try_create(protocol_request.release_nonnull()).release_value_but_fixme_should_propagate_errors();
  75. }
  76. void RequestServerAdapter::prefetch_dns(AK::URL const& url)
  77. {
  78. m_protocol_client->ensure_connection(url, RequestServer::CacheLevel::ResolveOnly);
  79. }
  80. void RequestServerAdapter::preconnect(AK::URL const& url)
  81. {
  82. m_protocol_client->ensure_connection(url, RequestServer::CacheLevel::CreateConnection);
  83. }
  84. }