| Index: ios/net/request_tracker.h
|
| diff --git a/ios/net/request_tracker.h b/ios/net/request_tracker.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e47b732a2b1ddbfc570747167a9c36f0d5112610
|
| --- /dev/null
|
| +++ b/ios/net/request_tracker.h
|
| @@ -0,0 +1,172 @@
|
| +// Copyright 2012 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 IOS_NET_REQUEST_TRACKER_H_
|
| +#define IOS_NET_REQUEST_TRACKER_H_
|
| +
|
| +#import <Foundation/Foundation.h>
|
| +
|
| +#include "base/callback_forward.h"
|
| +#include "base/mac/scoped_nsobject.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/threading/thread_checker.h"
|
| +
|
| +namespace net {
|
| +class SSLInfo;
|
| +class URLRequest;
|
| +class URLRequestContext;
|
| +}
|
| +
|
| +@class CRNForwardingNetworkClientFactory;
|
| +@class CRNSimpleNetworkClientFactory;
|
| +class GURL;
|
| +
|
| +namespace net {
|
| +
|
| +// RequestTracker can be used to observe the network requests and customize the
|
| +// behavior of the network stack with CRNForwardingNetworkClients.
|
| +// Each network request can be associated with a RequestTracker through the
|
| +// GetRequestTracker().
|
| +// RequestTracker requires a RequestTrackerFactory.
|
| +// The RequestTracker can be created on one thread and used on a different one.
|
| +class RequestTracker {
|
| + public:
|
| + enum CacheMode {
|
| + CACHE_NORMAL,
|
| + CACHE_RELOAD,
|
| + CACHE_HISTORY,
|
| + CACHE_BYPASS,
|
| + CACHE_ONLY,
|
| + };
|
| +
|
| + typedef base::Callback<void(bool)> SSLCallback;
|
| +
|
| + class RequestTrackerFactory {
|
| + public:
|
| + // Returns false if |request| is associated to an invalid tracker and should
|
| + // be cancelled. In this case |tracker| is set to nullptr.
|
| + // Returns true if |request| is associated with a valid tracker or if the
|
| + // request is not associated to any tracker.
|
| + virtual bool GetRequestTracker(NSURLRequest* request,
|
| + base::WeakPtr<RequestTracker>* tracker) = 0;
|
| + };
|
| +
|
| + // Sets the RequestTrackerFactory. The factory has to be set before the
|
| + // GetRequestTracker() function can be called.
|
| + // Does not take ownership of |factory|.
|
| + static void SetRequestTrackerFactory(RequestTrackerFactory* factory);
|
| +
|
| + // Returns false if |request| is associated to an invalid tracker and should
|
| + // be cancelled. In this case |tracker| is set to nullptr.
|
| + // Returns true if |request| is associated with a valid tracker or if the
|
| + // request is not associated to any tracker.
|
| + // Internally calls the RequestTrackerFactory.
|
| + static bool GetRequestTracker(NSURLRequest* request,
|
| + base::WeakPtr<RequestTracker>* tracker);
|
| +
|
| + RequestTracker();
|
| +
|
| + base::WeakPtr<RequestTracker> GetWeakPtr();
|
| +
|
| + // This function has to be called before using the tracker.
|
| + virtual void Init();
|
| +
|
| + // Add a factory that may create network clients for requests going through
|
| + // this tracker.
|
| + void AddNetworkClientFactory(CRNForwardingNetworkClientFactory* factory);
|
| +
|
| + // Registers a factory with the class that will be added to all trackers.
|
| + // Requests without associated trackers can add clients from these factories
|
| + // using GlobalClientsHandlingAnyRequest().
|
| + // Only |-clientHandlingAnyRequest| will be called on |factory|, the other
|
| + // methods are not supported.
|
| + static void AddGlobalNetworkClientFactory(
|
| + CRNForwardingNetworkClientFactory* factory);
|
| +
|
| + // Gets the request context associated with the tracker.
|
| + virtual URLRequestContext* GetRequestContext() = 0;
|
| +
|
| + // Network client generation methods. All of these four ClientsHandling...
|
| + // methods return an array of CRNForwardingNetworkClient instances, according
|
| + // to the CRNForwardingNetworkClientFactories added to the tracker. The array
|
| + // may be empty. The caller is responsible for taking ownership of the clients
|
| + // in the array.
|
| +
|
| + // Static method that returns clients that can handle any request, for use
|
| + // in cases where a request isn't associated with any request_tracker.
|
| + static NSArray* GlobalClientsHandlingAnyRequest();
|
| +
|
| + // Returns clients that can handle any request.
|
| + NSArray* ClientsHandlingAnyRequest();
|
| + // Returns clients that can handle |request|.
|
| + NSArray* ClientsHandlingRequest(const URLRequest& request);
|
| + // Returns clients that can handle |request| with |response|.
|
| + NSArray* ClientsHandlingRequestAndResponse(const URLRequest& request,
|
| + NSURLResponse* response);
|
| + // Returns clients that can handle a redirect of |request| to |new_url| based
|
| + // on |redirect_response|.
|
| + NSArray* ClientsHandlingRedirect(const URLRequest& request,
|
| + const GURL& new_url,
|
| + NSURLResponse* redirect_response);
|
| +
|
| + // Informs the tracker that a request has started.
|
| + virtual void StartRequest(URLRequest* request) = 0;
|
| +
|
| + // Informs the tracker that the headers for the request are available.
|
| + virtual void CaptureHeaders(URLRequest* request) = 0;
|
| +
|
| + // Informs the tracker the expected length of the result, if known.
|
| + virtual void CaptureExpectedLength(const URLRequest* request,
|
| + uint64_t length) = 0;
|
| +
|
| + // Informs the tracker that a request received par_trackert of its data.
|
| + virtual void CaptureReceivedBytes(const URLRequest* request,
|
| + uint64_t byte_count) = 0;
|
| +
|
| + // Informs the tracker that a certificate has been used.
|
| + virtual void CaptureCertificatePolicyCache(
|
| + const URLRequest* request,
|
| + const SSLCallback& should_continue) = 0;
|
| +
|
| + // Notifies of the completion of a request. Success or failure.
|
| + virtual void StopRequest(URLRequest* request) = 0;
|
| +
|
| + // Special case for a redirect as we fully expect another request to follow
|
| + // very shortly.
|
| + virtual void StopRedirectedRequest(URLRequest* request) = 0;
|
| +
|
| + // Called when there is an issue on the SSL certificate. The user must be
|
| + // informed and if |recoverable| is YES the user decision to continue or not
|
| + // will be send back via the |callback|. The callback must be safe to call
|
| + // from any thread. If recoverable is NO, invoking the callback should be a
|
| + // noop.
|
| + virtual void OnSSLCertificateError(const URLRequest* request,
|
| + const SSLInfo& ssl_info,
|
| + bool recoverable,
|
| + const SSLCallback& should_continue) = 0;
|
| +
|
| + // Gets and sets the cache mode.
|
| + CacheMode GetCacheMode() const;
|
| + void SetCacheMode(RequestTracker::CacheMode mode);
|
| +
|
| + protected:
|
| + virtual ~RequestTracker();
|
| +
|
| + void InvalidateWeakPtrs();
|
| +
|
| + private:
|
| + // Array of client factories that may be added by CRNHTTPProtocolHandler. The
|
| + // array lives on the IO thread.
|
| + base::scoped_nsobject<NSMutableArray> client_factories_;
|
| +
|
| + bool initialized_;
|
| + CacheMode cache_mode_;
|
| + base::ThreadChecker thread_checker_;
|
| +
|
| + base::WeakPtrFactory<RequestTracker> weak_ptr_factory_;
|
| +};
|
| +
|
| +} // namespace net
|
| +
|
| +#endif // IOS_NET_REQUEST_TRACKER_H_
|
|
|