blob: 5a6a81caa32e9fd19250c9c10390f2fad0b8dd63 [file] [log] [blame]
The Chrome-Proxy header is used to convey client credentials and capabilities
to the Data Reduction Proxy and to receive instructions from it.
Background
----------
The Data Reduction Proxy is operated by Google for Chrome. Chrome is
configured to connect to it via TLS at proxy.googlezip.net:443 and via HTTP
at compress.googlezip.net:80. The Data Reduction Proxy only proxies HTTP
traffic from non-incognito tabs.
Chrome-Proxy Response Header
----------------------------
The Data Reduction Proxy uses the Chrome-Proxy response header to instruct
Chrome to bypass the proxy for a period of time and retry the request directly.
It may do so to shed load, when the requested URL is on a blacklist of
malicious or illegal resources, or when the request is for video, which the
proxy does not currently serve. Bypasses may be issued for other reasons as
well.
In order to bypass a proxy and make decisions about when requests should be
proxied and which proxy they should use, some proxies serve PAC scripts
themselves with a low HTTP cache timeout, and dynamically update the scripts
to direct users. This is the current state of the art, but the approach has many
drawbacks. Some clients ignore the HTTP caching headers for the PAC script. The
client's performance suffers because new PAC scripts must be interpreted after
every invalidation. Clients must also store (large) blacklists. Server design is
complicated by needing to decouple a request from the mechanism that would
bypass it (a PAC). Bypass fidelity is coarse meaning that bypass decisions can't
be made on a per-request basis. And bypass decisions must be made before the
request is sent, which isn't always possible, e.g., for domains the proxy hasn't
served before.
Instead, the Data Reduction Proxy sends one of a set of bypass directives in the
"Chrome-Proxy" header if it wants the client not to use it. Upon reception of
this header, the client may decide to retry the request with the proxy disabled
or cancel the request. Chrome cancels instead of retrying non-idempotent
requests.
The "Chrome-Proxy" response header has the following format:
chrome-proxy = "Chrome-Proxy" ":" 1#chrome-proxy-directive
chrome-proxy-directive = token [ "=" ( token / quoted-string ) ]
The header uses the definition of 'token' and 'quoted-string' from
https://datatracker.ietf.org/doc/rfc7230/
The directives have the following meanings:
bypass: Argument syntax: delta-seconds
delta-seconds = 1*DIGIT (see: 1.2.1 of rfc7234)
Bypass the currently configured proxy for specified number of
seconds. If zero is specified, Chrome should use its default
proxy bypass timeout, which is a random duration between 1 and 5
minutes. If the TLS proxy is bypassed, Chrome will downgrade to
using HTTP to connect to the Data Reduction Proxy. If the HTTP
proxy is bypassed, Chrome will downgrade to using a DIRECT
connection.
block: Argument syntax: delta-seconds
Bypass all Data Reduction Proxies for the specified number of
seconds. If zero is specified, Chrome will use the default block
timeout, which is a random time between 1 and 5 minutes.
block-once: Bypass all Data Reductions Proxies for this request only.
Currently, the directives are mutually exclusive, but the header format does
not require this. With "block-once", no token is expected.
If more than one directive is contained the header, then Chrome reacts to only
the highest priority directive. Priorities from highest to lowest are:
block > bypass > block-once.
Examples that respectively bypass the current proxy for seven seconds, bypass
both the TLS and HTTP proxies for Chrome's default proxy bypass duration, and
bypass the TLS and HTTP proxies only for the current request:
Chrome-Proxy: bypass=7
Chrome-Proxy: block=0
Chrome-Proxy: block-once
The Chrome-Proxy header is NOT hop-by-hop, and thus transparent proxies and
other intermediaries should not modify it. Further, only the Data Reduction
Proxy should add this header to responses.
Chrome-Proxy Request Header
---------------------------
The Chrome-Proxy request header is used to specify client capabilities and
credentials. It has the same form as the response header. The directives have
the following names and meanings:
ps: Argument syntax: token
A User-Agent-selected pseudorandom session ID.
sid: Argument syntax: token
A credential string.
b: Argument syntax: 1*DIGIT
The Chrome build number of the client
p: Argument syntax: 1*DIGIT
The Chrome patch number of the client
c: Argument syntax: "android" / "ios" / "mac" / "win" / "linux" /
"chromeos" / "webview"
The type of client.
The values of the 'b', 'p', and 'c' directives can often be gleaned from the
user agent string, but not always, so they are sent explicitly. Each request
sent from Chrome to a Data Reduction Proxy contains a Chrome-Proxy header with
values for all five of these directives.
For example, for Chrome 38 on Android with a version 38.0.2125.114 (note the
'ps' and 'sid' values are representative):
Chrome-Proxy: ps=484343-123-4-9484, sid=he9wj3gjd03, b=2125, p=114, c=android