Serenity Operating System
at master 93 lines 3.8 kB view raw
1/* 2 * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibProtocol/Request.h> 8#include <LibProtocol/RequestClient.h> 9 10namespace Protocol { 11 12RequestClient::RequestClient(NonnullOwnPtr<Core::LocalSocket> socket) 13 : IPC::ConnectionToServer<RequestClientEndpoint, RequestServerEndpoint>(*this, move(socket)) 14{ 15} 16 17void RequestClient::ensure_connection(URL const& url, ::RequestServer::CacheLevel cache_level) 18{ 19 async_ensure_connection(url, cache_level); 20} 21 22template<typename RequestHashMapTraits> 23RefPtr<Request> RequestClient::start_request(DeprecatedString const& method, URL const& url, HashMap<DeprecatedString, DeprecatedString, RequestHashMapTraits> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const& proxy_data) 24{ 25 IPC::Dictionary header_dictionary; 26 for (auto& it : request_headers) 27 header_dictionary.add(it.key, it.value); 28 29 auto body_result = ByteBuffer::copy(request_body); 30 if (body_result.is_error()) 31 return nullptr; 32 33 auto response = IPCProxy::start_request(method, url, header_dictionary, body_result.release_value(), proxy_data); 34 auto request_id = response.request_id(); 35 if (request_id < 0 || !response.response_fd().has_value()) 36 return nullptr; 37 auto response_fd = response.response_fd().value().take_fd(); 38 auto request = Request::create_from_id({}, *this, request_id); 39 request->set_request_fd({}, response_fd); 40 m_requests.set(request_id, request); 41 return request; 42} 43 44bool RequestClient::stop_request(Badge<Request>, Request& request) 45{ 46 if (!m_requests.contains(request.id())) 47 return false; 48 return IPCProxy::stop_request(request.id()); 49} 50 51bool RequestClient::set_certificate(Badge<Request>, Request& request, DeprecatedString certificate, DeprecatedString key) 52{ 53 if (!m_requests.contains(request.id())) 54 return false; 55 return IPCProxy::set_certificate(request.id(), move(certificate), move(key)); 56} 57 58void RequestClient::request_finished(i32 request_id, bool success, u32 total_size) 59{ 60 RefPtr<Request> request; 61 if ((request = m_requests.get(request_id).value_or(nullptr))) { 62 request->did_finish({}, success, total_size); 63 } 64 m_requests.remove(request_id); 65} 66 67void RequestClient::request_progress(i32 request_id, Optional<u32> const& total_size, u32 downloaded_size) 68{ 69 if (auto request = const_cast<Request*>(m_requests.get(request_id).value_or(nullptr))) { 70 request->did_progress({}, total_size, downloaded_size); 71 } 72} 73 74void RequestClient::headers_became_available(i32 request_id, IPC::Dictionary const& response_headers, Optional<u32> const& status_code) 75{ 76 if (auto request = const_cast<Request*>(m_requests.get(request_id).value_or(nullptr))) { 77 HashMap<DeprecatedString, DeprecatedString, CaseInsensitiveStringTraits> headers; 78 response_headers.for_each_entry([&](auto& name, auto& value) { headers.set(name, value); }); 79 request->did_receive_headers({}, headers, status_code); 80 } 81} 82 83void RequestClient::certificate_requested(i32 request_id) 84{ 85 if (auto request = const_cast<Request*>(m_requests.get(request_id).value_or(nullptr))) { 86 request->did_request_certificates({}); 87 } 88} 89 90} 91 92template RefPtr<Protocol::Request> Protocol::RequestClient::start_request(DeprecatedString const& method, URL const&, HashMap<DeprecatedString, DeprecatedString> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&); 93template RefPtr<Protocol::Request> Protocol::RequestClient::start_request(DeprecatedString const& method, URL const&, HashMap<DeprecatedString, DeprecatedString, CaseInsensitiveStringTraits> const& request_headers, ReadonlyBytes request_body, Core::ProxyData const&);