Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: ios/net/request_tracker.h

Issue 994823004: [iOS] Upstream //ios/net (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698