RequestClient.cpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/FileStream.h>
  7. #include <LibProtocol/Request.h>
  8. #include <LibProtocol/RequestClient.h>
  9. namespace Protocol {
  10. RequestClient::RequestClient()
  11. : IPC::ServerConnection<RequestClientEndpoint, RequestServerEndpoint>(*this, "/tmp/portal/request")
  12. {
  13. handshake();
  14. }
  15. void RequestClient::handshake()
  16. {
  17. }
  18. template<typename RequestHashMapTraits>
  19. RefPtr<Request> RequestClient::start_request(const String& method, const String& url, const HashMap<String, String, RequestHashMapTraits>& request_headers, ReadonlyBytes request_body)
  20. {
  21. IPC::Dictionary header_dictionary;
  22. for (auto& it : request_headers)
  23. header_dictionary.add(it.key, it.value);
  24. auto response = IPCProxy::start_request(method, url, header_dictionary, ByteBuffer::copy(request_body));
  25. auto request_id = response.request_id();
  26. if (request_id < 0 || !response.response_fd().has_value())
  27. return nullptr;
  28. auto response_fd = response.response_fd().value().take_fd();
  29. auto request = Request::create_from_id({}, *this, request_id);
  30. request->set_request_fd({}, response_fd);
  31. m_requests.set(request_id, request);
  32. return request;
  33. return nullptr;
  34. }
  35. bool RequestClient::stop_request(Badge<Request>, Request& request)
  36. {
  37. if (!m_requests.contains(request.id()))
  38. return false;
  39. return IPCProxy::stop_request(request.id());
  40. }
  41. bool RequestClient::set_certificate(Badge<Request>, Request& request, String certificate, String key)
  42. {
  43. if (!m_requests.contains(request.id()))
  44. return false;
  45. return IPCProxy::set_certificate(request.id(), move(certificate), move(key));
  46. }
  47. void RequestClient::request_finished(i32 request_id, bool success, u32 total_size)
  48. {
  49. RefPtr<Request> request;
  50. if ((request = m_requests.get(request_id).value_or(nullptr))) {
  51. request->did_finish({}, success, total_size);
  52. }
  53. m_requests.remove(request_id);
  54. }
  55. void RequestClient::request_progress(i32 request_id, const Optional<u32>& total_size, u32 downloaded_size)
  56. {
  57. if (auto request = const_cast<Request*>(m_requests.get(request_id).value_or(nullptr))) {
  58. request->did_progress({}, total_size, downloaded_size);
  59. }
  60. }
  61. void RequestClient::headers_became_available(i32 request_id, const IPC::Dictionary& response_headers, const Optional<u32>& status_code)
  62. {
  63. if (auto request = const_cast<Request*>(m_requests.get(request_id).value_or(nullptr))) {
  64. HashMap<String, String, CaseInsensitiveStringTraits> headers;
  65. response_headers.for_each_entry([&](auto& name, auto& value) { headers.set(name, value); });
  66. request->did_receive_headers({}, headers, status_code);
  67. }
  68. }
  69. void RequestClient::certificate_requested(i32 request_id)
  70. {
  71. if (auto request = const_cast<Request*>(m_requests.get(request_id).value_or(nullptr))) {
  72. request->did_request_certificates({});
  73. }
  74. }
  75. }
  76. template RefPtr<Protocol::Request> Protocol::RequestClient::start_request(const String& method, const String& url, const HashMap<String, String>& request_headers, ReadonlyBytes request_body);
  77. template RefPtr<Protocol::Request> Protocol::RequestClient::start_request(const String& method, const String& url, const HashMap<String, String, CaseInsensitiveStringTraits>& request_headers, ReadonlyBytes request_body);