electron_url_loader_factory.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // Copyright (c) 2019 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ELECTRON_SHELL_BROWSER_NET_ELECTRON_URL_LOADER_FACTORY_H_
  5. #define ELECTRON_SHELL_BROWSER_NET_ELECTRON_URL_LOADER_FACTORY_H_
  6. #include <map>
  7. #include <optional>
  8. #include <string>
  9. #include <utility>
  10. #include <vector>
  11. #include "mojo/public/cpp/bindings/pending_remote.h"
  12. #include "mojo/public/cpp/bindings/receiver.h"
  13. #include "mojo/public/cpp/bindings/remote.h"
  14. #include "net/url_request/url_request_job_factory.h"
  15. #include "services/network/public/cpp/resource_request.h"
  16. #include "services/network/public/cpp/self_deleting_url_loader_factory.h"
  17. #include "services/network/public/mojom/url_loader.mojom.h"
  18. #include "services/network/public/mojom/url_loader_factory.mojom.h"
  19. #include "services/network/public/mojom/url_response_head.mojom-forward.h"
  20. #include "v8/include/v8-array-buffer.h"
  21. namespace gin {
  22. class Arguments;
  23. } // namespace gin
  24. namespace gin_helper {
  25. class Dictionary;
  26. } // namespace gin_helper
  27. namespace mojo {
  28. template <typename T>
  29. class PendingReceiver;
  30. } // namespace mojo
  31. namespace electron {
  32. // Old Protocol API can only serve one type of response for one scheme.
  33. enum class ProtocolType {
  34. kBuffer,
  35. kString,
  36. kFile,
  37. kHttp,
  38. kStream,
  39. kFree, // special type for returning arbitrary type of response.
  40. };
  41. using StartLoadingCallback = base::OnceCallback<void(gin::Arguments*)>;
  42. using ProtocolHandler =
  43. base::RepeatingCallback<void(const network::ResourceRequest&,
  44. StartLoadingCallback)>;
  45. // scheme => (type, handler).
  46. using HandlersMap = std::
  47. map<std::string, std::pair<ProtocolType, ProtocolHandler>, std::less<>>;
  48. // Implementation of URLLoaderFactory.
  49. class ElectronURLLoaderFactory : public network::SelfDeletingURLLoaderFactory {
  50. public:
  51. // This class binds a URLLoader receiver in the case of a redirect, waiting
  52. // for |FollowRedirect| to be called at which point the new request will be
  53. // started, and the receiver will be unbound letting a new URLLoader bind it
  54. class RedirectedRequest : public network::mojom::URLLoader {
  55. public:
  56. RedirectedRequest(
  57. const net::RedirectInfo& redirect_info,
  58. mojo::PendingReceiver<network::mojom::URLLoader> loader_receiver,
  59. int32_t request_id,
  60. uint32_t options,
  61. const network::ResourceRequest& request,
  62. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  63. const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
  64. mojo::PendingRemote<network::mojom::URLLoaderFactory>
  65. target_factory_remote);
  66. ~RedirectedRequest() override;
  67. // disable copy
  68. RedirectedRequest(const RedirectedRequest&) = delete;
  69. RedirectedRequest& operator=(const RedirectedRequest&) = delete;
  70. // network::mojom::URLLoader:
  71. void FollowRedirect(
  72. const std::vector<std::string>& removed_headers,
  73. const net::HttpRequestHeaders& modified_headers,
  74. const net::HttpRequestHeaders& modified_cors_exempt_headers,
  75. const std::optional<GURL>& new_url) override;
  76. void SetPriority(net::RequestPriority priority,
  77. int32_t intra_priority_value) override {}
  78. void OnTargetFactoryError();
  79. void DeleteThis();
  80. private:
  81. net::RedirectInfo redirect_info_;
  82. mojo::Receiver<network::mojom::URLLoader> loader_receiver_{this};
  83. int32_t request_id_;
  84. uint32_t options_;
  85. network::ResourceRequest request_;
  86. mojo::PendingRemote<network::mojom::URLLoaderClient> client_;
  87. net::MutableNetworkTrafficAnnotationTag traffic_annotation_;
  88. mojo::Remote<network::mojom::URLLoaderFactory> target_factory_remote_;
  89. };
  90. static mojo::PendingRemote<network::mojom::URLLoaderFactory> Create(
  91. ProtocolType type,
  92. const ProtocolHandler& handler);
  93. // network::mojom::URLLoaderFactory:
  94. void CreateLoaderAndStart(
  95. mojo::PendingReceiver<network::mojom::URLLoader> loader,
  96. int32_t request_id,
  97. uint32_t options,
  98. const network::ResourceRequest& request,
  99. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  100. const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
  101. override;
  102. static void StartLoading(
  103. mojo::PendingReceiver<network::mojom::URLLoader> loader,
  104. int32_t request_id,
  105. uint32_t options,
  106. const network::ResourceRequest& request,
  107. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  108. const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
  109. mojo::PendingRemote<network::mojom::URLLoaderFactory> target_factory,
  110. ProtocolType type,
  111. gin::Arguments* args);
  112. // disable copy
  113. ElectronURLLoaderFactory(const ElectronURLLoaderFactory&) = delete;
  114. ElectronURLLoaderFactory& operator=(const ElectronURLLoaderFactory&) = delete;
  115. private:
  116. ElectronURLLoaderFactory(
  117. ProtocolType type,
  118. const ProtocolHandler& handler,
  119. mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver);
  120. ~ElectronURLLoaderFactory() override;
  121. static void OnComplete(
  122. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  123. int32_t request_id,
  124. const network::URLLoaderCompletionStatus& status);
  125. static void StartLoadingBuffer(
  126. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  127. network::mojom::URLResponseHeadPtr head,
  128. v8::Local<v8::ArrayBufferView> buffer);
  129. static void StartLoadingFile(
  130. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  131. mojo::PendingReceiver<network::mojom::URLLoader> loader,
  132. network::mojom::URLResponseHeadPtr head,
  133. const network::ResourceRequest& original_request,
  134. const base::FilePath& path,
  135. const gin_helper::Dictionary& opts);
  136. static void StartLoadingHttp(
  137. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  138. mojo::PendingReceiver<network::mojom::URLLoader> loader,
  139. const network::ResourceRequest& original_request,
  140. const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
  141. const gin_helper::Dictionary& dict);
  142. static void StartLoadingStream(
  143. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  144. mojo::PendingReceiver<network::mojom::URLLoader> loader,
  145. network::mojom::URLResponseHeadPtr head,
  146. const gin_helper::Dictionary& dict);
  147. // Helper to send string as response.
  148. static void SendContents(
  149. mojo::PendingRemote<network::mojom::URLLoaderClient> client,
  150. network::mojom::URLResponseHeadPtr head,
  151. std::string data);
  152. ProtocolType type_;
  153. ProtocolHandler handler_;
  154. };
  155. } // namespace electron
  156. #endif // ELECTRON_SHELL_BROWSER_NET_ELECTRON_URL_LOADER_FACTORY_H_