| Index: content/browser/loader/resource_dispatcher_host_impl.h
 | 
| diff --git a/content/browser/loader/resource_dispatcher_host_impl.h b/content/browser/loader/resource_dispatcher_host_impl.h
 | 
| index 339daec4d5d6a909fe8f05f1e134db52e5d8a370..3e6c504afb634589b9871f15cb33a944968858d9 100644
 | 
| --- a/content/browser/loader/resource_dispatcher_host_impl.h
 | 
| +++ b/content/browser/loader/resource_dispatcher_host_impl.h
 | 
| @@ -107,6 +107,9 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl
 | 
|    void SetDelegate(ResourceDispatcherHostDelegate* delegate) override;
 | 
|    void SetAllowCrossOriginAuthPrompt(bool value) override;
 | 
|    void ClearLoginDelegateForRequest(net::URLRequest* request) override;
 | 
| +  void RegisterInterceptor(const std::string& http_header,
 | 
| +                           const std::string& starts_with,
 | 
| +                           const InterceptorCallback& interceptor) override;
 | 
|  
 | 
|    // Puts the resource dispatcher host in an inactive state (unable to begin
 | 
|    // new requests).  Cancels all pending requests.
 | 
| @@ -325,6 +328,23 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl
 | 
|    // Map from ProcessID+RouteID pair to the "most interesting" LoadState.
 | 
|    typedef std::map<GlobalRoutingID, LoadInfo> LoadInfoMap;
 | 
|  
 | 
| +  // Information about a HTTP header interceptor.
 | 
| +  struct HeaderInterceptorInfo {
 | 
| +    // Structure is sufficiently complicated to require the constructor
 | 
| +    // destructor definitions in the cc file.
 | 
| +    HeaderInterceptorInfo();
 | 
| +    ~HeaderInterceptorInfo();
 | 
| +    HeaderInterceptorInfo(const HeaderInterceptorInfo& other);
 | 
| +
 | 
| +    // Used to prefix match the value of the http header.
 | 
| +    std::string starts_with;
 | 
| +    // The interceptor.
 | 
| +    InterceptorCallback interceptor;
 | 
| +  };
 | 
| +
 | 
| +  // Map from HTTP header to its information HeaderInterceptorInfo.
 | 
| +  typedef std::map<std::string, HeaderInterceptorInfo> HeaderInterceptorMap;
 | 
| +
 | 
|    // ResourceLoaderDelegate implementation:
 | 
|    ResourceDispatcherHostLoginDelegate* CreateLoginDelegate(
 | 
|        ResourceLoader* loader,
 | 
| @@ -454,6 +474,24 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl
 | 
|                      IPC::Message* sync_result,  // only valid for sync
 | 
|                      int route_id);              // only valid for async
 | 
|  
 | 
| +  // There are requests which need decisions to be made like the following:
 | 
| +  // Whether the presence of certain HTTP headers like the Origin header are
 | 
| +  // valid, etc. These requests may need to be aborted based on these
 | 
| +  // decisions which could be time consuming. We allow for these decisions
 | 
| +  // to be made asynchronously. The request proceeds when we hear back from
 | 
| +  // the interceptors about whether to continue or not.
 | 
| +  // The |continue_request| parameter in the function indicates whether the
 | 
| +  // request should be continued or aborted. The |error_code| parameter is set
 | 
| +  // if |continue_request| is false.
 | 
| +  void ContinuePendingBeginRequest(
 | 
| +      int request_id,
 | 
| +      const ResourceRequest& request_data,
 | 
| +      IPC::Message* sync_result,  // only valid for sync
 | 
| +      int route_id,
 | 
| +      const net::HttpRequestHeaders& headers,
 | 
| +      bool continue_request,
 | 
| +      int error_code);
 | 
| +
 | 
|    // Creates a ResourceHandler to be used by BeginRequest() for normal resource
 | 
|    // loading.
 | 
|    std::unique_ptr<ResourceHandler> CreateResourceHandler(
 | 
| @@ -537,6 +575,28 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl
 | 
|  
 | 
|    CertStore* GetCertStore();
 | 
|  
 | 
| +  // This enum holds values which indicate how we want to proceed with a
 | 
| +  // request that is about to be started.
 | 
| +  enum BeginRequestStatus {
 | 
| +    CONTINUE = 0,  // Continue with the request.
 | 
| +    ABORT = 1,     // Abort.
 | 
| +    PENDING = 2,   // Wait for the decision to come back.
 | 
| +    LAST_SERVICE_REQUEST_STATUS = PENDING,
 | 
| +  };
 | 
| +
 | 
| +  // Consults the RendererSecurity policy to determine whether the
 | 
| +  // ResourceDispatcherHostImpl should service this request.  A request might
 | 
| +  // be disallowed if the renderer is not authorized to retrieve the request
 | 
| +  // URL or if the renderer is attempting to upload an unauthorized file.
 | 
| +  BeginRequestStatus ShouldServiceRequest(
 | 
| +      int process_type,
 | 
| +      int child_id,
 | 
| +      const ResourceRequest& request_data,
 | 
| +      const net::HttpRequestHeaders& headers,
 | 
| +      ResourceMessageFilter* filter,
 | 
| +      ResourceContext* resource_context,
 | 
| +      OnHeaderProcessedCallback callback);
 | 
| +
 | 
|    LoaderMap pending_loaders_;
 | 
|  
 | 
|    // Collection of temp files downloaded for child processes via
 | 
| @@ -631,6 +691,9 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl
 | 
|    // outlive this ResourceDispatcherHostImpl.
 | 
|    CertStore* cert_store_for_testing_;
 | 
|  
 | 
| +  // Used to invoke an interceptor for the HTTP header.
 | 
| +  HeaderInterceptorMap http_header_interceptor_map_;
 | 
| +
 | 
|    DISALLOW_COPY_AND_ASSIGN(ResourceDispatcherHostImpl);
 | 
|  };
 | 
|  
 | 
| 
 |