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-web” 44*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