// Copyright (c) 2019 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef ELECTRON_SHELL_BROWSER_NET_URL_PIPE_LOADER_H_ #define ELECTRON_SHELL_BROWSER_NET_URL_PIPE_LOADER_H_ #include #include #include #include "base/values.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/data_pipe_producer.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/cpp/simple_url_loader_stream_consumer.h" #include "services/network/public/mojom/url_loader.mojom.h" namespace network { class SharedURLLoaderFactory; } namespace electron { // Read data from URL and pipe it to NetworkService. // // Different from creating a new loader for the URL directly, protocol handlers // using this loader can work around CORS restrictions. // // This class manages its own lifetime and should delete itself when the // connection is lost or finished. class URLPipeLoader : public network::mojom::URLLoader, public network::SimpleURLLoaderStreamConsumer { public: URLPipeLoader(scoped_refptr factory, std::unique_ptr request, mojo::PendingReceiver loader, mojo::PendingRemote client, const net::NetworkTrafficAnnotationTag& annotation, base::Value::Dict upload_data); // disable copy URLPipeLoader(const URLPipeLoader&) = delete; URLPipeLoader& operator=(const URLPipeLoader&) = delete; private: ~URLPipeLoader() override; void Start(scoped_refptr factory, std::unique_ptr request, const net::NetworkTrafficAnnotationTag& annotation, base::Value::Dict upload_data); void NotifyComplete(int result); void OnResponseStarted(const GURL& final_url, const network::mojom::URLResponseHead& response_head); void OnWrite(base::OnceClosure resume, MojoResult result); // SimpleURLLoaderStreamConsumer: void OnDataReceived(base::StringPiece string_piece, base::OnceClosure resume) override; void OnComplete(bool success) override; void OnRetry(base::OnceClosure start_retry) override; // URLLoader: void FollowRedirect( const std::vector& removed_headers, const net::HttpRequestHeaders& modified_headers, const net::HttpRequestHeaders& modified_cors_exempt_headers, const absl::optional& new_url) override {} void SetPriority(net::RequestPriority priority, int32_t intra_priority_value) override {} void PauseReadingBodyFromNet() override {} void ResumeReadingBodyFromNet() override {} mojo::Receiver url_loader_; mojo::Remote client_; std::unique_ptr producer_; std::unique_ptr loader_; base::WeakPtrFactory weak_factory_{this}; }; } // namespace electron #endif // ELECTRON_SHELL_BROWSER_NET_URL_PIPE_LOADER_H_