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