blob: 6524157b075c70c99637175a232dc9f66d752ff9 [file] [log] [blame]
// Copyright 2015 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.
[DartPackage="mojo_services"]
module mojo;
import "mojo/public/interfaces/network/url_request.mojom";
import "mojo/public/interfaces/network/url_response.mojom";
// Factory for |URLLoaderInterceptor|. The factory is called once per URLLoader
// and will be associated to it.
interface URLLoaderInterceptorFactory {
Create(URLLoaderInterceptor& interceptor);
};
// An |URLLoaderInterceptor| is associated to a single URLLoader. It will be
// able to intercept requests sent to the URLLoader and transform these or
// directly respond to it. It will also intercept responses and transform them
// or ask the network to continue with another request instead.
// In case of redirect, the behavior is the following:
// - If in the request |auto_follow_redirects| is true, the interceptor doesn't
// have access to any of the intermediate request(s) or response(s).
// Otherwise, it has access to intermediate responses as they are sent to the
// client and it is also notified when the client asks to follow a redirect.
interface URLLoaderInterceptor {
// Intercept a request before it is sent to the network. This method can
// transform the request by returning the new requests to consider, or
// respond to the request itself by returning a response.
InterceptRequest(URLRequest request) =>
(URLLoaderInterceptorResponse response);
// Intercept |URLLoader.FollowRedirect()| calls. This method can either
// return null to let the call through, return a request to change the
// redirect, or respond to the redirect itself by returning a response.
InterceptFollowRedirect() => (URLLoaderInterceptorResponse? response);
// Intercept a response before it is sent to the loader client. This method
// can transform the response by returning the new response to send, ask
// the loader to load a new request instead by returning the request to load,
// or if the response is a redirect, follow it by returning null.
InterceptResponse(URLResponse response) =>
(URLLoaderInterceptorResponse? response);
};
// Response for the intercept methods. One and only one of the two fields
// must be set. If |request| is set, the url loader will execute the request.
// If |response| is set, the url loader will send it to its client. It is the
// responsibility of the interceptor not to create infinite loops.
// TODO(qsr): Change this to an union.
struct URLLoaderInterceptorResponse {
URLRequest? request;
URLResponse? response;
};