| // 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_CRN_HTTP_PROTOCOL_HANDLER_H_ |
| #define IOS_NET_CRN_HTTP_PROTOCOL_HANDLER_H_ |
| |
| #import <Foundation/Foundation.h> |
| |
| #include <memory> |
| |
| #include "base/time/time.h" |
| #include "net/base/load_timing_info.h" |
| #include "net/http/http_response_info.h" |
| |
| namespace net { |
| class URLRequestContextGetter; |
| |
| class HTTPProtocolHandlerDelegate { |
| public: |
| // Sets the global instance of the HTTPProtocolHandlerDelegate. |
| static void SetInstance(HTTPProtocolHandlerDelegate* delegate); |
| |
| virtual ~HTTPProtocolHandlerDelegate() {} |
| |
| // Returns true if CRNHTTPProtocolHandler should handle the request. |
| // Returns false if the request should be passed down the NSURLProtocol chain. |
| virtual bool CanHandleRequest(NSURLRequest* request) = 0; |
| |
| // If IsRequestSupported returns true, |request| will be processed, otherwise |
| // a NSURLErrorUnsupportedURL error is generated. |
| virtual bool IsRequestSupported(NSURLRequest* request) = 0; |
| |
| // Returns the request context used. Must not return null. |
| virtual URLRequestContextGetter* GetDefaultURLRequestContext() = 0; |
| }; |
| |
| // Delegate class which supplies a metrics callback that is invoked when a net |
| // request is stopped. |
| class MetricsDelegate { |
| public: |
| // Simple struct collecting all of the metrics data that is passed through to |
| // the MetricsDelegate callback. |
| struct Metrics { |
| Metrics(); |
| |
| Metrics(const Metrics&) = delete; |
| Metrics& operator=(const Metrics&) = delete; |
| |
| ~Metrics(); |
| |
| NSURLSessionTask* task; |
| LoadTimingInfo load_timing_info; |
| HttpResponseInfo response_info; |
| base::Time response_end_time; |
| }; |
| |
| // Set the global instance of the MetricsDelegate. |
| static void SetInstance(MetricsDelegate* delegate); |
| |
| virtual ~MetricsDelegate() = default; |
| |
| // This is invoked once when the request begins, in order to set up things |
| // which may be needed by OnStopNetRequest. |
| virtual void OnStartNetRequest(NSURLSessionTask* task) = 0; |
| |
| // This is invoked once the request is finally stopped, with metrics data |
| // collect by net passed in as an argument. |
| virtual void OnStopNetRequest(std::unique_ptr<Metrics> metrics) = 0; |
| }; |
| |
| } // namespace net |
| |
| // Custom NSURLProtocol handling HTTP and HTTPS requests. |
| // The HttpProtocolHandler is registered as a NSURLProtocol in the iOS system. |
| // This protocol is called for each NSURLRequest. This allows handling the |
| // requests issued by UIWebView using our own network stack. |
| @interface CRNHTTPProtocolHandler : NSURLProtocol |
| @end |
| |
| #endif // IOS_NET_CRN_HTTP_PROTOCOL_HANDLER_H_ |