chromium/ios/net/crn_http_protocol_handler.h

// Copyright 2012 The Chromium Authors
// 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_