Serenity Operating System
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}