xref: /aosp_15_r20/external/grpc-grpc/doc/PROTOCOL-WEB.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# gRPC Web
2*cc02d7e2SAndroid Build Coastguard Worker
3*cc02d7e2SAndroid Build Coastguard WorkergRPC-Web provides a JS client library that supports the same API
4*cc02d7e2SAndroid Build Coastguard Workeras gRPC-Node to access a gRPC service. Due to browser limitation,
5*cc02d7e2SAndroid Build Coastguard Workerthe Web client library implements a different protocol than the
6*cc02d7e2SAndroid Build Coastguard Worker[native gRPC protocol](PROTOCOL-HTTP2.md).
7*cc02d7e2SAndroid Build Coastguard WorkerThis protocol is designed to make it easy for a proxy to translate
8*cc02d7e2SAndroid Build Coastguard Workerbetween the protocols as this is the most likely deployment model.
9*cc02d7e2SAndroid Build Coastguard Worker
10*cc02d7e2SAndroid Build Coastguard WorkerThis document lists the differences between the two protocols.
11*cc02d7e2SAndroid Build Coastguard WorkerTo help tracking future revisions, this document describes a delta
12*cc02d7e2SAndroid Build Coastguard Workerwith the protocol details specified in the
13*cc02d7e2SAndroid Build Coastguard Worker[native gRPC protocol](PROTOCOL-HTTP2.md).
14*cc02d7e2SAndroid Build Coastguard Worker
15*cc02d7e2SAndroid Build Coastguard Worker# Design goals
16*cc02d7e2SAndroid Build Coastguard Worker
17*cc02d7e2SAndroid Build Coastguard WorkerFor the gRPC-Web protocol, we have decided on the following design goals:
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Worker* adopt the same framing as “application/grpc” whenever possible
20*cc02d7e2SAndroid Build Coastguard Worker* decouple from HTTP/2 framing which is not, and will never be, directly
21*cc02d7e2SAndroid Build Coastguard Workerexposed by browsers
22*cc02d7e2SAndroid Build Coastguard Worker* support text streams (e.g. base64) in order to provide cross-browser
23*cc02d7e2SAndroid Build Coastguard Workersupport (e.g. IE-10)
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard WorkerWhile the new protocol will be published/reviewed publicly, we also
26*cc02d7e2SAndroid Build Coastguard Workerintend to keep the protocol as an internal detail to gRPC-Web.
27*cc02d7e2SAndroid Build Coastguard WorkerMore specifically, we expect the protocol to
28*cc02d7e2SAndroid Build Coastguard Worker
29*cc02d7e2SAndroid Build Coastguard Worker* evolve over time, mainly to optimize for browser clients or support
30*cc02d7e2SAndroid Build Coastguard Workerweb-specific features such as CORS, XSRF
31*cc02d7e2SAndroid Build Coastguard Worker* become optional (in 1-2 years) when browsers are able to speak the native
32*cc02d7e2SAndroid Build Coastguard WorkergRPC protocol via the new [whatwg streams API](https://github.com/whatwg/streams)
33*cc02d7e2SAndroid Build Coastguard Worker
34*cc02d7e2SAndroid Build Coastguard Worker# Protocol differences vs [gRPC over HTTP2](PROTOCOL-HTTP2.md)
35*cc02d7e2SAndroid Build Coastguard Worker
36*cc02d7e2SAndroid Build Coastguard WorkerContent-Type
37*cc02d7e2SAndroid Build Coastguard Worker
38*cc02d7e2SAndroid Build Coastguard Worker1. application/grpc-web
39*cc02d7e2SAndroid Build Coastguard Worker  * e.g. application/grpc-web+[proto, json, thrift]
40*cc02d7e2SAndroid Build Coastguard Worker  * the sender should always specify the message format, e.g. +proto, +json
41*cc02d7e2SAndroid Build Coastguard Worker  * the receiver should assume the default is "+proto" when the message format is missing in Content-Type (as "application/grpc-web")
42*cc02d7e2SAndroid Build Coastguard Worker2. application/grpc-web-text
43*cc02d7e2SAndroid Build Coastguard Worker  * text-encoded streams of “application/grpc-web44*cc02d7e2SAndroid Build Coastguard Worker  * e.g. application/grpc-web-text+[proto, thrift]
45*cc02d7e2SAndroid Build Coastguard Worker
46*cc02d7e2SAndroid Build Coastguard Worker---
47*cc02d7e2SAndroid Build Coastguard Worker
48*cc02d7e2SAndroid Build Coastguard WorkerHTTP wire protocols
49*cc02d7e2SAndroid Build Coastguard Worker
50*cc02d7e2SAndroid Build Coastguard Worker1. support any HTTP/*, with no dependency on HTTP/2 specific framing
51*cc02d7e2SAndroid Build Coastguard Worker2. header names may be upper- or mixed-case over HTTP/1.1, but trailers encoded in
52*cc02d7e2SAndroid Build Coastguard Worker   the last length-prefixed message must always use lower-case names.
53*cc02d7e2SAndroid Build Coastguard Worker3. use EOF (end of body) to close the stream
54*cc02d7e2SAndroid Build Coastguard Worker
55*cc02d7e2SAndroid Build Coastguard Worker---
56*cc02d7e2SAndroid Build Coastguard Worker
57*cc02d7e2SAndroid Build Coastguard WorkerHTTP/2 related behavior (specified in [gRPC over HTTP2](PROTOCOL-HTTP2.md))
58*cc02d7e2SAndroid Build Coastguard Worker
59*cc02d7e2SAndroid Build Coastguard Worker1. stream-id is not supported or used
60*cc02d7e2SAndroid Build Coastguard Worker2. go-away is not supported or used
61*cc02d7e2SAndroid Build Coastguard Worker
62*cc02d7e2SAndroid Build Coastguard Worker---
63*cc02d7e2SAndroid Build Coastguard Worker
64*cc02d7e2SAndroid Build Coastguard WorkerMessage framing (vs. [http2-transport-mapping](PROTOCOL-HTTP2.md#http2-transport-mapping))
65*cc02d7e2SAndroid Build Coastguard Worker
66*cc02d7e2SAndroid Build Coastguard Worker1. Response status encoded as part of the response body
67*cc02d7e2SAndroid Build Coastguard Worker  * Key-value pairs encoded as a HTTP/1 headers block (without the terminating newline), per https://tools.ietf.org/html/rfc7230#section-3.2
68*cc02d7e2SAndroid Build Coastguard Worker  ```
69*cc02d7e2SAndroid Build Coastguard Worker    key1: foo\r\n
70*cc02d7e2SAndroid Build Coastguard Worker    key2: bar\r\n
71*cc02d7e2SAndroid Build Coastguard Worker  ```
72*cc02d7e2SAndroid Build Coastguard Worker2. 8th (MSB) bit of the 1st gRPC frame byte
73*cc02d7e2SAndroid Build Coastguard Worker  * 0: data
74*cc02d7e2SAndroid Build Coastguard Worker  * 1: trailers
75*cc02d7e2SAndroid Build Coastguard Worker  ```
76*cc02d7e2SAndroid Build Coastguard Worker    10000000b: an uncompressed trailer (as part of the body)
77*cc02d7e2SAndroid Build Coastguard Worker    10000001b: a compressed trailer
78*cc02d7e2SAndroid Build Coastguard Worker  ```
79*cc02d7e2SAndroid Build Coastguard Worker3. Trailers must be the last message of the response, as enforced
80*cc02d7e2SAndroid Build Coastguard Workerby the implementation
81*cc02d7e2SAndroid Build Coastguard Worker4. Trailers-only responses: no change to the gRPC protocol spec.
82*cc02d7e2SAndroid Build Coastguard WorkerTrailers may be sent together with response headers, with no message
83*cc02d7e2SAndroid Build Coastguard Workerin the body.
84*cc02d7e2SAndroid Build Coastguard Worker
85*cc02d7e2SAndroid Build Coastguard Worker---
86*cc02d7e2SAndroid Build Coastguard Worker
87*cc02d7e2SAndroid Build Coastguard WorkerUser Agent
88*cc02d7e2SAndroid Build Coastguard Worker
89*cc02d7e2SAndroid Build Coastguard Worker* Do NOT use User-Agent header (which is to be set by browsers, by default)
90*cc02d7e2SAndroid Build Coastguard Worker* Use X-User-Agent: grpc-web-javascript/0.1 (follow the same format as specified in [gRPC over HTTP2](PROTOCOL-HTTP2.md))
91*cc02d7e2SAndroid Build Coastguard Worker
92*cc02d7e2SAndroid Build Coastguard Worker---
93*cc02d7e2SAndroid Build Coastguard Worker
94*cc02d7e2SAndroid Build Coastguard WorkerText-encoded (response) streams
95*cc02d7e2SAndroid Build Coastguard Worker
96*cc02d7e2SAndroid Build Coastguard Worker1. The client library should indicate to the server via the "Accept" header that
97*cc02d7e2SAndroid Build Coastguard Workerthe response stream needs to be text encoded e.g. when XHR is used or due
98*cc02d7e2SAndroid Build Coastguard Workerto security policies with XHR
99*cc02d7e2SAndroid Build Coastguard Worker  * Accept: application/grpc-web-text
100*cc02d7e2SAndroid Build Coastguard Worker2. The default text encoding is base64
101*cc02d7e2SAndroid Build Coastguard Worker  * Note that “Content-Transfer-Encoding: base64” should not be used.
102*cc02d7e2SAndroid Build Coastguard Worker  Due to in-stream base64 padding when delimiting messages, the entire
103*cc02d7e2SAndroid Build Coastguard Worker  response body is not necessarily a valid base64-encoded entity
104*cc02d7e2SAndroid Build Coastguard Worker  * While the server runtime will always base64-encode and flush gRPC messages
105*cc02d7e2SAndroid Build Coastguard Worker  atomically the client library should not assume base64 padding always
106*cc02d7e2SAndroid Build Coastguard Worker  happens at the boundary of message frames. That is, the implementation may send base64-encoded "chunks" with potential padding whenever the runtime needs to flush a byte buffer.
107*cc02d7e2SAndroid Build Coastguard Worker
108*cc02d7e2SAndroid Build Coastguard Worker# Other features
109*cc02d7e2SAndroid Build Coastguard Worker
110*cc02d7e2SAndroid Build Coastguard WorkerRetries, caching
111*cc02d7e2SAndroid Build Coastguard Worker
112*cc02d7e2SAndroid Build Coastguard Worker* Will spec out the support after their respective gRPC spec extensions
113*cc02d7e2SAndroid Build Coastguard Workerare finalized
114*cc02d7e2SAndroid Build Coastguard Worker  * Safe retries: PUT
115*cc02d7e2SAndroid Build Coastguard Worker  * Caching: header encoded request and/or a web specific spec
116*cc02d7e2SAndroid Build Coastguard Worker
117*cc02d7e2SAndroid Build Coastguard Worker---
118*cc02d7e2SAndroid Build Coastguard Worker
119*cc02d7e2SAndroid Build Coastguard WorkerKeep-alive
120*cc02d7e2SAndroid Build Coastguard Worker
121*cc02d7e2SAndroid Build Coastguard Worker* HTTP/2 PING is not supported or used
122*cc02d7e2SAndroid Build Coastguard Worker* Will not support send-beacon (GET)
123*cc02d7e2SAndroid Build Coastguard Worker
124*cc02d7e2SAndroid Build Coastguard Worker---
125*cc02d7e2SAndroid Build Coastguard Worker
126*cc02d7e2SAndroid Build Coastguard WorkerBidi-streaming, with flow-control
127*cc02d7e2SAndroid Build Coastguard Worker
128*cc02d7e2SAndroid Build Coastguard Worker* Pending on [whatwg fetch/streams](https://github.com/whatwg/fetch) to be
129*cc02d7e2SAndroid Build Coastguard Workerfinalized and implemented in modern browsers
130*cc02d7e2SAndroid Build Coastguard Worker* gRPC-Web client will support the native gRPC protocol with modern browsers
131*cc02d7e2SAndroid Build Coastguard Worker
132*cc02d7e2SAndroid Build Coastguard Worker---
133*cc02d7e2SAndroid Build Coastguard Worker
134*cc02d7e2SAndroid Build Coastguard WorkerVersioning
135*cc02d7e2SAndroid Build Coastguard Worker
136*cc02d7e2SAndroid Build Coastguard Worker* Special headers may be introduced to support features that may break compatibility.
137*cc02d7e2SAndroid Build Coastguard Worker
138*cc02d7e2SAndroid Build Coastguard Worker---
139*cc02d7e2SAndroid Build Coastguard Worker
140*cc02d7e2SAndroid Build Coastguard WorkerBrowser-specific features
141*cc02d7e2SAndroid Build Coastguard Worker
142*cc02d7e2SAndroid Build Coastguard Worker* For features that are unique to browser or HTML clients, check the [spec doc](https://github.com/grpc/grpc-web/blob/master/doc/browser-features.md) published in the grpc/grpc-web repo.
143