// 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_
