// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef FUCHSIA_HTTP_URL_LOADER_IMPL_H_ #define FUCHSIA_HTTP_URL_LOADER_IMPL_H_ #include #include #include #include #include "base/message_loop/message_pump_for_io.h" #include "net/base/io_buffer.h" #include "net/url_request/url_request.h" #include "net/url_request/url_request_context.h" // URLLoader implementation. This class manages one network request per // instance. Internally, this class uses a |net::URLRequest| object to handle // the actual request. The lifespan of |URLLoaderImpl| objects is tied to its // |binding_|. // TODO(https://crbug.com/875532): Implement cache-mode. class URLLoaderImpl : public ::fuchsia::net::oldhttp::URLLoader, public net::URLRequest::Delegate, base::MessagePumpForIO::ZxHandleWatcher { public: using Callback = ::fuchsia::net::oldhttp::URLLoader::StartCallback; URLLoaderImpl( std::unique_ptr context, ::fidl::InterfaceRequest<::fuchsia::net::oldhttp::URLLoader> request); ~URLLoaderImpl() override; // Returns the number of active requests. Used for testing. static int GetNumActiveRequestsForTests(); private: // URLLoader methods: void Start(::fuchsia::net::oldhttp::URLRequest request, Callback callback) override; void FollowRedirect(Callback callback) override; void QueryStatus(::fuchsia::net::oldhttp::URLLoader::QueryStatusCallback callback) override; // URLRequest::Delegate methods: void OnReceivedRedirect(net::URLRequest* request, const net::RedirectInfo& redirect_info, bool* defer_redirect) override; void OnAuthRequired(net::URLRequest* request, const net::AuthChallengeInfo& auth_info) override; void OnCertificateRequested( net::URLRequest* request, net::SSLCertRequestInfo* cert_request_info) override; void OnSSLCertificateError(net::URLRequest* request, int net_error, const net::SSLInfo& ssl_info, bool fatal) override; void OnResponseStarted(net::URLRequest* request, int net_error) override; void OnReadCompleted(net::URLRequest* request, int bytes_read) override; // MessagePumpForIO::ZxHandleWatcher method: void OnZxHandleSignalled(zx_handle_t handle, zx_signals_t signals) override; // Reads from the next response buffer available. void ReadNextBuffer(); // If |response_body_mode_| is set to socket mode, |result| bytes in // |buffer_| are written to |write_socket_|. In buffer mode, |buffer_| is // expanded by |result| bytes. // |result| is 0 when all data from the response has been written to // |buffer_| and is negative when an error occurred. // Returns true if the caller should call |net_request_.Read()| again and // false otherwise. bool WriteResponseBytes(int result); // Helper method to build the response. ::fuchsia::net::oldhttp::URLResponse BuildResponse(int net_error); // The corresponding binding, this controls the lifetime of the URLLoaderImpl. ::fidl::Binding<::fuchsia::net::oldhttp::URLLoader> binding_; // Holds the net::URLRequestContext associated with the |net_request_| std::unique_ptr context_; // Holds the net::URLRequest used to perform the network operation. std::unique_ptr net_request_; // Callback from a Start or FollowRedirect call. Callback done_callback_; // Populated from the FIDL URLRequest. Indicates whether to let the client // manually handle redirects. bool auto_follow_redirects_; // Populated from the FIDL URLRequest. Indicates how the response body should // be populated. ::fuchsia::net::oldhttp::ResponseBodyMode response_body_mode_; // The resulting net error. Set after the request has completed and // |OnResponseStarted| has been called. int net_error_; // Used to populate the response body. scoped_refptr buffer_; // If |response_body_mode_| is set to socket mode, the server side of the // socket. The other end is to be read by the client. zx::socket write_socket_; // If |response_body_mode_| is set to socket mode, the watch controller used // to wait for |write_socket_| to be writable. Unused otherwise. base::MessagePumpForIO::ZxHandleWatchController write_watch_; // If |response_body_mode_| is set to socket mode and |write_socket_| is not // writable, |buffered_bytes_| is used to store the number of bytes waiting // in |buffer_|. int buffered_bytes_ = 0; DISALLOW_COPY_AND_ASSIGN(URLLoaderImpl); }; #endif // FUCHSIA_HTTP_URL_LOADER_IMPL_H_