xref: /aosp_15_r20/external/googleapis/google/api/http.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
1*d5c09012SAndroid Build Coastguard Worker// Copyright 2023 Google LLC
2*d5c09012SAndroid Build Coastguard Worker//
3*d5c09012SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*d5c09012SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*d5c09012SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*d5c09012SAndroid Build Coastguard Worker//
7*d5c09012SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*d5c09012SAndroid Build Coastguard Worker//
9*d5c09012SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*d5c09012SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*d5c09012SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*d5c09012SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*d5c09012SAndroid Build Coastguard Worker// limitations under the License.
14*d5c09012SAndroid Build Coastguard Worker
15*d5c09012SAndroid Build Coastguard Workersyntax = "proto3";
16*d5c09012SAndroid Build Coastguard Worker
17*d5c09012SAndroid Build Coastguard Workerpackage google.api;
18*d5c09012SAndroid Build Coastguard Worker
19*d5c09012SAndroid Build Coastguard Workeroption cc_enable_arenas = true;
20*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/api/annotations;annotations";
21*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true;
22*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "HttpProto";
23*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api";
24*d5c09012SAndroid Build Coastguard Workeroption objc_class_prefix = "GAPI";
25*d5c09012SAndroid Build Coastguard Worker
26*d5c09012SAndroid Build Coastguard Worker// Defines the HTTP configuration for an API service. It contains a list of
27*d5c09012SAndroid Build Coastguard Worker// [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method
28*d5c09012SAndroid Build Coastguard Worker// to one or more HTTP REST API methods.
29*d5c09012SAndroid Build Coastguard Workermessage Http {
30*d5c09012SAndroid Build Coastguard Worker  // A list of HTTP configuration rules that apply to individual API methods.
31*d5c09012SAndroid Build Coastguard Worker  //
32*d5c09012SAndroid Build Coastguard Worker  // **NOTE:** All service configuration rules follow "last one wins" order.
33*d5c09012SAndroid Build Coastguard Worker  repeated HttpRule rules = 1;
34*d5c09012SAndroid Build Coastguard Worker
35*d5c09012SAndroid Build Coastguard Worker  // When set to true, URL path parameters will be fully URI-decoded except in
36*d5c09012SAndroid Build Coastguard Worker  // cases of single segment matches in reserved expansion, where "%2F" will be
37*d5c09012SAndroid Build Coastguard Worker  // left encoded.
38*d5c09012SAndroid Build Coastguard Worker  //
39*d5c09012SAndroid Build Coastguard Worker  // The default behavior is to not decode RFC 6570 reserved characters in multi
40*d5c09012SAndroid Build Coastguard Worker  // segment matches.
41*d5c09012SAndroid Build Coastguard Worker  bool fully_decode_reserved_expansion = 2;
42*d5c09012SAndroid Build Coastguard Worker}
43*d5c09012SAndroid Build Coastguard Worker
44*d5c09012SAndroid Build Coastguard Worker// # gRPC Transcoding
45*d5c09012SAndroid Build Coastguard Worker//
46*d5c09012SAndroid Build Coastguard Worker// gRPC Transcoding is a feature for mapping between a gRPC method and one or
47*d5c09012SAndroid Build Coastguard Worker// more HTTP REST endpoints. It allows developers to build a single API service
48*d5c09012SAndroid Build Coastguard Worker// that supports both gRPC APIs and REST APIs. Many systems, including [Google
49*d5c09012SAndroid Build Coastguard Worker// APIs](https://github.com/googleapis/googleapis),
50*d5c09012SAndroid Build Coastguard Worker// [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC
51*d5c09012SAndroid Build Coastguard Worker// Gateway](https://github.com/grpc-ecosystem/grpc-gateway),
52*d5c09012SAndroid Build Coastguard Worker// and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature
53*d5c09012SAndroid Build Coastguard Worker// and use it for large scale production services.
54*d5c09012SAndroid Build Coastguard Worker//
55*d5c09012SAndroid Build Coastguard Worker// `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies
56*d5c09012SAndroid Build Coastguard Worker// how different portions of the gRPC request message are mapped to the URL
57*d5c09012SAndroid Build Coastguard Worker// path, URL query parameters, and HTTP request body. It also controls how the
58*d5c09012SAndroid Build Coastguard Worker// gRPC response message is mapped to the HTTP response body. `HttpRule` is
59*d5c09012SAndroid Build Coastguard Worker// typically specified as an `google.api.http` annotation on the gRPC method.
60*d5c09012SAndroid Build Coastguard Worker//
61*d5c09012SAndroid Build Coastguard Worker// Each mapping specifies a URL path template and an HTTP method. The path
62*d5c09012SAndroid Build Coastguard Worker// template may refer to one or more fields in the gRPC request message, as long
63*d5c09012SAndroid Build Coastguard Worker// as each field is a non-repeated field with a primitive (non-message) type.
64*d5c09012SAndroid Build Coastguard Worker// The path template controls how fields of the request message are mapped to
65*d5c09012SAndroid Build Coastguard Worker// the URL path.
66*d5c09012SAndroid Build Coastguard Worker//
67*d5c09012SAndroid Build Coastguard Worker// Example:
68*d5c09012SAndroid Build Coastguard Worker//
69*d5c09012SAndroid Build Coastguard Worker//     service Messaging {
70*d5c09012SAndroid Build Coastguard Worker//       rpc GetMessage(GetMessageRequest) returns (Message) {
71*d5c09012SAndroid Build Coastguard Worker//         option (google.api.http) = {
72*d5c09012SAndroid Build Coastguard Worker//             get: "/v1/{name=messages/*}"
73*d5c09012SAndroid Build Coastguard Worker//         };
74*d5c09012SAndroid Build Coastguard Worker//       }
75*d5c09012SAndroid Build Coastguard Worker//     }
76*d5c09012SAndroid Build Coastguard Worker//     message GetMessageRequest {
77*d5c09012SAndroid Build Coastguard Worker//       string name = 1; // Mapped to URL path.
78*d5c09012SAndroid Build Coastguard Worker//     }
79*d5c09012SAndroid Build Coastguard Worker//     message Message {
80*d5c09012SAndroid Build Coastguard Worker//       string text = 1; // The resource content.
81*d5c09012SAndroid Build Coastguard Worker//     }
82*d5c09012SAndroid Build Coastguard Worker//
83*d5c09012SAndroid Build Coastguard Worker// This enables an HTTP REST to gRPC mapping as below:
84*d5c09012SAndroid Build Coastguard Worker//
85*d5c09012SAndroid Build Coastguard Worker// HTTP | gRPC
86*d5c09012SAndroid Build Coastguard Worker// -----|-----
87*d5c09012SAndroid Build Coastguard Worker// `GET /v1/messages/123456`  | `GetMessage(name: "messages/123456")`
88*d5c09012SAndroid Build Coastguard Worker//
89*d5c09012SAndroid Build Coastguard Worker// Any fields in the request message which are not bound by the path template
90*d5c09012SAndroid Build Coastguard Worker// automatically become HTTP query parameters if there is no HTTP request body.
91*d5c09012SAndroid Build Coastguard Worker// For example:
92*d5c09012SAndroid Build Coastguard Worker//
93*d5c09012SAndroid Build Coastguard Worker//     service Messaging {
94*d5c09012SAndroid Build Coastguard Worker//       rpc GetMessage(GetMessageRequest) returns (Message) {
95*d5c09012SAndroid Build Coastguard Worker//         option (google.api.http) = {
96*d5c09012SAndroid Build Coastguard Worker//             get:"/v1/messages/{message_id}"
97*d5c09012SAndroid Build Coastguard Worker//         };
98*d5c09012SAndroid Build Coastguard Worker//       }
99*d5c09012SAndroid Build Coastguard Worker//     }
100*d5c09012SAndroid Build Coastguard Worker//     message GetMessageRequest {
101*d5c09012SAndroid Build Coastguard Worker//       message SubMessage {
102*d5c09012SAndroid Build Coastguard Worker//         string subfield = 1;
103*d5c09012SAndroid Build Coastguard Worker//       }
104*d5c09012SAndroid Build Coastguard Worker//       string message_id = 1; // Mapped to URL path.
105*d5c09012SAndroid Build Coastguard Worker//       int64 revision = 2;    // Mapped to URL query parameter `revision`.
106*d5c09012SAndroid Build Coastguard Worker//       SubMessage sub = 3;    // Mapped to URL query parameter `sub.subfield`.
107*d5c09012SAndroid Build Coastguard Worker//     }
108*d5c09012SAndroid Build Coastguard Worker//
109*d5c09012SAndroid Build Coastguard Worker// This enables a HTTP JSON to RPC mapping as below:
110*d5c09012SAndroid Build Coastguard Worker//
111*d5c09012SAndroid Build Coastguard Worker// HTTP | gRPC
112*d5c09012SAndroid Build Coastguard Worker// -----|-----
113*d5c09012SAndroid Build Coastguard Worker// `GET /v1/messages/123456?revision=2&sub.subfield=foo` |
114*d5c09012SAndroid Build Coastguard Worker// `GetMessage(message_id: "123456" revision: 2 sub: SubMessage(subfield:
115*d5c09012SAndroid Build Coastguard Worker// "foo"))`
116*d5c09012SAndroid Build Coastguard Worker//
117*d5c09012SAndroid Build Coastguard Worker// Note that fields which are mapped to URL query parameters must have a
118*d5c09012SAndroid Build Coastguard Worker// primitive type or a repeated primitive type or a non-repeated message type.
119*d5c09012SAndroid Build Coastguard Worker// In the case of a repeated type, the parameter can be repeated in the URL
120*d5c09012SAndroid Build Coastguard Worker// as `...?param=A&param=B`. In the case of a message type, each field of the
121*d5c09012SAndroid Build Coastguard Worker// message is mapped to a separate parameter, such as
122*d5c09012SAndroid Build Coastguard Worker// `...?foo.a=A&foo.b=B&foo.c=C`.
123*d5c09012SAndroid Build Coastguard Worker//
124*d5c09012SAndroid Build Coastguard Worker// For HTTP methods that allow a request body, the `body` field
125*d5c09012SAndroid Build Coastguard Worker// specifies the mapping. Consider a REST update method on the
126*d5c09012SAndroid Build Coastguard Worker// message resource collection:
127*d5c09012SAndroid Build Coastguard Worker//
128*d5c09012SAndroid Build Coastguard Worker//     service Messaging {
129*d5c09012SAndroid Build Coastguard Worker//       rpc UpdateMessage(UpdateMessageRequest) returns (Message) {
130*d5c09012SAndroid Build Coastguard Worker//         option (google.api.http) = {
131*d5c09012SAndroid Build Coastguard Worker//           patch: "/v1/messages/{message_id}"
132*d5c09012SAndroid Build Coastguard Worker//           body: "message"
133*d5c09012SAndroid Build Coastguard Worker//         };
134*d5c09012SAndroid Build Coastguard Worker//       }
135*d5c09012SAndroid Build Coastguard Worker//     }
136*d5c09012SAndroid Build Coastguard Worker//     message UpdateMessageRequest {
137*d5c09012SAndroid Build Coastguard Worker//       string message_id = 1; // mapped to the URL
138*d5c09012SAndroid Build Coastguard Worker//       Message message = 2;   // mapped to the body
139*d5c09012SAndroid Build Coastguard Worker//     }
140*d5c09012SAndroid Build Coastguard Worker//
141*d5c09012SAndroid Build Coastguard Worker// The following HTTP JSON to RPC mapping is enabled, where the
142*d5c09012SAndroid Build Coastguard Worker// representation of the JSON in the request body is determined by
143*d5c09012SAndroid Build Coastguard Worker// protos JSON encoding:
144*d5c09012SAndroid Build Coastguard Worker//
145*d5c09012SAndroid Build Coastguard Worker// HTTP | gRPC
146*d5c09012SAndroid Build Coastguard Worker// -----|-----
147*d5c09012SAndroid Build Coastguard Worker// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
148*d5c09012SAndroid Build Coastguard Worker// "123456" message { text: "Hi!" })`
149*d5c09012SAndroid Build Coastguard Worker//
150*d5c09012SAndroid Build Coastguard Worker// The special name `*` can be used in the body mapping to define that
151*d5c09012SAndroid Build Coastguard Worker// every field not bound by the path template should be mapped to the
152*d5c09012SAndroid Build Coastguard Worker// request body.  This enables the following alternative definition of
153*d5c09012SAndroid Build Coastguard Worker// the update method:
154*d5c09012SAndroid Build Coastguard Worker//
155*d5c09012SAndroid Build Coastguard Worker//     service Messaging {
156*d5c09012SAndroid Build Coastguard Worker//       rpc UpdateMessage(Message) returns (Message) {
157*d5c09012SAndroid Build Coastguard Worker//         option (google.api.http) = {
158*d5c09012SAndroid Build Coastguard Worker//           patch: "/v1/messages/{message_id}"
159*d5c09012SAndroid Build Coastguard Worker//           body: "*"
160*d5c09012SAndroid Build Coastguard Worker//         };
161*d5c09012SAndroid Build Coastguard Worker//       }
162*d5c09012SAndroid Build Coastguard Worker//     }
163*d5c09012SAndroid Build Coastguard Worker//     message Message {
164*d5c09012SAndroid Build Coastguard Worker//       string message_id = 1;
165*d5c09012SAndroid Build Coastguard Worker//       string text = 2;
166*d5c09012SAndroid Build Coastguard Worker//     }
167*d5c09012SAndroid Build Coastguard Worker//
168*d5c09012SAndroid Build Coastguard Worker//
169*d5c09012SAndroid Build Coastguard Worker// The following HTTP JSON to RPC mapping is enabled:
170*d5c09012SAndroid Build Coastguard Worker//
171*d5c09012SAndroid Build Coastguard Worker// HTTP | gRPC
172*d5c09012SAndroid Build Coastguard Worker// -----|-----
173*d5c09012SAndroid Build Coastguard Worker// `PATCH /v1/messages/123456 { "text": "Hi!" }` | `UpdateMessage(message_id:
174*d5c09012SAndroid Build Coastguard Worker// "123456" text: "Hi!")`
175*d5c09012SAndroid Build Coastguard Worker//
176*d5c09012SAndroid Build Coastguard Worker// Note that when using `*` in the body mapping, it is not possible to
177*d5c09012SAndroid Build Coastguard Worker// have HTTP parameters, as all fields not bound by the path end in
178*d5c09012SAndroid Build Coastguard Worker// the body. This makes this option more rarely used in practice when
179*d5c09012SAndroid Build Coastguard Worker// defining REST APIs. The common usage of `*` is in custom methods
180*d5c09012SAndroid Build Coastguard Worker// which don't use the URL at all for transferring data.
181*d5c09012SAndroid Build Coastguard Worker//
182*d5c09012SAndroid Build Coastguard Worker// It is possible to define multiple HTTP methods for one RPC by using
183*d5c09012SAndroid Build Coastguard Worker// the `additional_bindings` option. Example:
184*d5c09012SAndroid Build Coastguard Worker//
185*d5c09012SAndroid Build Coastguard Worker//     service Messaging {
186*d5c09012SAndroid Build Coastguard Worker//       rpc GetMessage(GetMessageRequest) returns (Message) {
187*d5c09012SAndroid Build Coastguard Worker//         option (google.api.http) = {
188*d5c09012SAndroid Build Coastguard Worker//           get: "/v1/messages/{message_id}"
189*d5c09012SAndroid Build Coastguard Worker//           additional_bindings {
190*d5c09012SAndroid Build Coastguard Worker//             get: "/v1/users/{user_id}/messages/{message_id}"
191*d5c09012SAndroid Build Coastguard Worker//           }
192*d5c09012SAndroid Build Coastguard Worker//         };
193*d5c09012SAndroid Build Coastguard Worker//       }
194*d5c09012SAndroid Build Coastguard Worker//     }
195*d5c09012SAndroid Build Coastguard Worker//     message GetMessageRequest {
196*d5c09012SAndroid Build Coastguard Worker//       string message_id = 1;
197*d5c09012SAndroid Build Coastguard Worker//       string user_id = 2;
198*d5c09012SAndroid Build Coastguard Worker//     }
199*d5c09012SAndroid Build Coastguard Worker//
200*d5c09012SAndroid Build Coastguard Worker// This enables the following two alternative HTTP JSON to RPC mappings:
201*d5c09012SAndroid Build Coastguard Worker//
202*d5c09012SAndroid Build Coastguard Worker// HTTP | gRPC
203*d5c09012SAndroid Build Coastguard Worker// -----|-----
204*d5c09012SAndroid Build Coastguard Worker// `GET /v1/messages/123456` | `GetMessage(message_id: "123456")`
205*d5c09012SAndroid Build Coastguard Worker// `GET /v1/users/me/messages/123456` | `GetMessage(user_id: "me" message_id:
206*d5c09012SAndroid Build Coastguard Worker// "123456")`
207*d5c09012SAndroid Build Coastguard Worker//
208*d5c09012SAndroid Build Coastguard Worker// ## Rules for HTTP mapping
209*d5c09012SAndroid Build Coastguard Worker//
210*d5c09012SAndroid Build Coastguard Worker// 1. Leaf request fields (recursive expansion nested messages in the request
211*d5c09012SAndroid Build Coastguard Worker//    message) are classified into three categories:
212*d5c09012SAndroid Build Coastguard Worker//    - Fields referred by the path template. They are passed via the URL path.
213*d5c09012SAndroid Build Coastguard Worker//    - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They
214*d5c09012SAndroid Build Coastguard Worker//    are passed via the HTTP
215*d5c09012SAndroid Build Coastguard Worker//      request body.
216*d5c09012SAndroid Build Coastguard Worker//    - All other fields are passed via the URL query parameters, and the
217*d5c09012SAndroid Build Coastguard Worker//      parameter name is the field path in the request message. A repeated
218*d5c09012SAndroid Build Coastguard Worker//      field can be represented as multiple query parameters under the same
219*d5c09012SAndroid Build Coastguard Worker//      name.
220*d5c09012SAndroid Build Coastguard Worker//  2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL
221*d5c09012SAndroid Build Coastguard Worker//  query parameter, all fields
222*d5c09012SAndroid Build Coastguard Worker//     are passed via URL path and HTTP request body.
223*d5c09012SAndroid Build Coastguard Worker//  3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP
224*d5c09012SAndroid Build Coastguard Worker//  request body, all
225*d5c09012SAndroid Build Coastguard Worker//     fields are passed via URL path and URL query parameters.
226*d5c09012SAndroid Build Coastguard Worker//
227*d5c09012SAndroid Build Coastguard Worker// ### Path template syntax
228*d5c09012SAndroid Build Coastguard Worker//
229*d5c09012SAndroid Build Coastguard Worker//     Template = "/" Segments [ Verb ] ;
230*d5c09012SAndroid Build Coastguard Worker//     Segments = Segment { "/" Segment } ;
231*d5c09012SAndroid Build Coastguard Worker//     Segment  = "*" | "**" | LITERAL | Variable ;
232*d5c09012SAndroid Build Coastguard Worker//     Variable = "{" FieldPath [ "=" Segments ] "}" ;
233*d5c09012SAndroid Build Coastguard Worker//     FieldPath = IDENT { "." IDENT } ;
234*d5c09012SAndroid Build Coastguard Worker//     Verb     = ":" LITERAL ;
235*d5c09012SAndroid Build Coastguard Worker//
236*d5c09012SAndroid Build Coastguard Worker// The syntax `*` matches a single URL path segment. The syntax `**` matches
237*d5c09012SAndroid Build Coastguard Worker// zero or more URL path segments, which must be the last part of the URL path
238*d5c09012SAndroid Build Coastguard Worker// except the `Verb`.
239*d5c09012SAndroid Build Coastguard Worker//
240*d5c09012SAndroid Build Coastguard Worker// The syntax `Variable` matches part of the URL path as specified by its
241*d5c09012SAndroid Build Coastguard Worker// template. A variable template must not contain other variables. If a variable
242*d5c09012SAndroid Build Coastguard Worker// matches a single path segment, its template may be omitted, e.g. `{var}`
243*d5c09012SAndroid Build Coastguard Worker// is equivalent to `{var=*}`.
244*d5c09012SAndroid Build Coastguard Worker//
245*d5c09012SAndroid Build Coastguard Worker// The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL`
246*d5c09012SAndroid Build Coastguard Worker// contains any reserved character, such characters should be percent-encoded
247*d5c09012SAndroid Build Coastguard Worker// before the matching.
248*d5c09012SAndroid Build Coastguard Worker//
249*d5c09012SAndroid Build Coastguard Worker// If a variable contains exactly one path segment, such as `"{var}"` or
250*d5c09012SAndroid Build Coastguard Worker// `"{var=*}"`, when such a variable is expanded into a URL path on the client
251*d5c09012SAndroid Build Coastguard Worker// side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The
252*d5c09012SAndroid Build Coastguard Worker// server side does the reverse decoding. Such variables show up in the
253*d5c09012SAndroid Build Coastguard Worker// [Discovery
254*d5c09012SAndroid Build Coastguard Worker// Document](https://developers.google.com/discovery/v1/reference/apis) as
255*d5c09012SAndroid Build Coastguard Worker// `{var}`.
256*d5c09012SAndroid Build Coastguard Worker//
257*d5c09012SAndroid Build Coastguard Worker// If a variable contains multiple path segments, such as `"{var=foo/*}"`
258*d5c09012SAndroid Build Coastguard Worker// or `"{var=**}"`, when such a variable is expanded into a URL path on the
259*d5c09012SAndroid Build Coastguard Worker// client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded.
260*d5c09012SAndroid Build Coastguard Worker// The server side does the reverse decoding, except "%2F" and "%2f" are left
261*d5c09012SAndroid Build Coastguard Worker// unchanged. Such variables show up in the
262*d5c09012SAndroid Build Coastguard Worker// [Discovery
263*d5c09012SAndroid Build Coastguard Worker// Document](https://developers.google.com/discovery/v1/reference/apis) as
264*d5c09012SAndroid Build Coastguard Worker// `{+var}`.
265*d5c09012SAndroid Build Coastguard Worker//
266*d5c09012SAndroid Build Coastguard Worker// ## Using gRPC API Service Configuration
267*d5c09012SAndroid Build Coastguard Worker//
268*d5c09012SAndroid Build Coastguard Worker// gRPC API Service Configuration (service config) is a configuration language
269*d5c09012SAndroid Build Coastguard Worker// for configuring a gRPC service to become a user-facing product. The
270*d5c09012SAndroid Build Coastguard Worker// service config is simply the YAML representation of the `google.api.Service`
271*d5c09012SAndroid Build Coastguard Worker// proto message.
272*d5c09012SAndroid Build Coastguard Worker//
273*d5c09012SAndroid Build Coastguard Worker// As an alternative to annotating your proto file, you can configure gRPC
274*d5c09012SAndroid Build Coastguard Worker// transcoding in your service config YAML files. You do this by specifying a
275*d5c09012SAndroid Build Coastguard Worker// `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same
276*d5c09012SAndroid Build Coastguard Worker// effect as the proto annotation. This can be particularly useful if you
277*d5c09012SAndroid Build Coastguard Worker// have a proto that is reused in multiple services. Note that any transcoding
278*d5c09012SAndroid Build Coastguard Worker// specified in the service config will override any matching transcoding
279*d5c09012SAndroid Build Coastguard Worker// configuration in the proto.
280*d5c09012SAndroid Build Coastguard Worker//
281*d5c09012SAndroid Build Coastguard Worker// Example:
282*d5c09012SAndroid Build Coastguard Worker//
283*d5c09012SAndroid Build Coastguard Worker//     http:
284*d5c09012SAndroid Build Coastguard Worker//       rules:
285*d5c09012SAndroid Build Coastguard Worker//         # Selects a gRPC method and applies HttpRule to it.
286*d5c09012SAndroid Build Coastguard Worker//         - selector: example.v1.Messaging.GetMessage
287*d5c09012SAndroid Build Coastguard Worker//           get: /v1/messages/{message_id}/{sub.subfield}
288*d5c09012SAndroid Build Coastguard Worker//
289*d5c09012SAndroid Build Coastguard Worker// ## Special notes
290*d5c09012SAndroid Build Coastguard Worker//
291*d5c09012SAndroid Build Coastguard Worker// When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the
292*d5c09012SAndroid Build Coastguard Worker// proto to JSON conversion must follow the [proto3
293*d5c09012SAndroid Build Coastguard Worker// specification](https://developers.google.com/protocol-buffers/docs/proto3#json).
294*d5c09012SAndroid Build Coastguard Worker//
295*d5c09012SAndroid Build Coastguard Worker// While the single segment variable follows the semantics of
296*d5c09012SAndroid Build Coastguard Worker// [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String
297*d5c09012SAndroid Build Coastguard Worker// Expansion, the multi segment variable **does not** follow RFC 6570 Section
298*d5c09012SAndroid Build Coastguard Worker// 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion
299*d5c09012SAndroid Build Coastguard Worker// does not expand special characters like `?` and `#`, which would lead
300*d5c09012SAndroid Build Coastguard Worker// to invalid URLs. As the result, gRPC Transcoding uses a custom encoding
301*d5c09012SAndroid Build Coastguard Worker// for multi segment variables.
302*d5c09012SAndroid Build Coastguard Worker//
303*d5c09012SAndroid Build Coastguard Worker// The path variables **must not** refer to any repeated or mapped field,
304*d5c09012SAndroid Build Coastguard Worker// because client libraries are not capable of handling such variable expansion.
305*d5c09012SAndroid Build Coastguard Worker//
306*d5c09012SAndroid Build Coastguard Worker// The path variables **must not** capture the leading "/" character. The reason
307*d5c09012SAndroid Build Coastguard Worker// is that the most common use case "{var}" does not capture the leading "/"
308*d5c09012SAndroid Build Coastguard Worker// character. For consistency, all path variables must share the same behavior.
309*d5c09012SAndroid Build Coastguard Worker//
310*d5c09012SAndroid Build Coastguard Worker// Repeated message fields must not be mapped to URL query parameters, because
311*d5c09012SAndroid Build Coastguard Worker// no client library can support such complicated mapping.
312*d5c09012SAndroid Build Coastguard Worker//
313*d5c09012SAndroid Build Coastguard Worker// If an API needs to use a JSON array for request or response body, it can map
314*d5c09012SAndroid Build Coastguard Worker// the request or response body to a repeated field. However, some gRPC
315*d5c09012SAndroid Build Coastguard Worker// Transcoding implementations may not support this feature.
316*d5c09012SAndroid Build Coastguard Workermessage HttpRule {
317*d5c09012SAndroid Build Coastguard Worker  // Selects a method to which this rule applies.
318*d5c09012SAndroid Build Coastguard Worker  //
319*d5c09012SAndroid Build Coastguard Worker  // Refer to [selector][google.api.DocumentationRule.selector] for syntax
320*d5c09012SAndroid Build Coastguard Worker  // details.
321*d5c09012SAndroid Build Coastguard Worker  string selector = 1;
322*d5c09012SAndroid Build Coastguard Worker
323*d5c09012SAndroid Build Coastguard Worker  // Determines the URL pattern is matched by this rules. This pattern can be
324*d5c09012SAndroid Build Coastguard Worker  // used with any of the {get|put|post|delete|patch} methods. A custom method
325*d5c09012SAndroid Build Coastguard Worker  // can be defined using the 'custom' field.
326*d5c09012SAndroid Build Coastguard Worker  oneof pattern {
327*d5c09012SAndroid Build Coastguard Worker    // Maps to HTTP GET. Used for listing and getting information about
328*d5c09012SAndroid Build Coastguard Worker    // resources.
329*d5c09012SAndroid Build Coastguard Worker    string get = 2;
330*d5c09012SAndroid Build Coastguard Worker
331*d5c09012SAndroid Build Coastguard Worker    // Maps to HTTP PUT. Used for replacing a resource.
332*d5c09012SAndroid Build Coastguard Worker    string put = 3;
333*d5c09012SAndroid Build Coastguard Worker
334*d5c09012SAndroid Build Coastguard Worker    // Maps to HTTP POST. Used for creating a resource or performing an action.
335*d5c09012SAndroid Build Coastguard Worker    string post = 4;
336*d5c09012SAndroid Build Coastguard Worker
337*d5c09012SAndroid Build Coastguard Worker    // Maps to HTTP DELETE. Used for deleting a resource.
338*d5c09012SAndroid Build Coastguard Worker    string delete = 5;
339*d5c09012SAndroid Build Coastguard Worker
340*d5c09012SAndroid Build Coastguard Worker    // Maps to HTTP PATCH. Used for updating a resource.
341*d5c09012SAndroid Build Coastguard Worker    string patch = 6;
342*d5c09012SAndroid Build Coastguard Worker
343*d5c09012SAndroid Build Coastguard Worker    // The custom pattern is used for specifying an HTTP method that is not
344*d5c09012SAndroid Build Coastguard Worker    // included in the `pattern` field, such as HEAD, or "*" to leave the
345*d5c09012SAndroid Build Coastguard Worker    // HTTP method unspecified for this rule. The wild-card rule is useful
346*d5c09012SAndroid Build Coastguard Worker    // for services that provide content to Web (HTML) clients.
347*d5c09012SAndroid Build Coastguard Worker    CustomHttpPattern custom = 8;
348*d5c09012SAndroid Build Coastguard Worker  }
349*d5c09012SAndroid Build Coastguard Worker
350*d5c09012SAndroid Build Coastguard Worker  // The name of the request field whose value is mapped to the HTTP request
351*d5c09012SAndroid Build Coastguard Worker  // body, or `*` for mapping all request fields not captured by the path
352*d5c09012SAndroid Build Coastguard Worker  // pattern to the HTTP body, or omitted for not having any HTTP request body.
353*d5c09012SAndroid Build Coastguard Worker  //
354*d5c09012SAndroid Build Coastguard Worker  // NOTE: the referred field must be present at the top-level of the request
355*d5c09012SAndroid Build Coastguard Worker  // message type.
356*d5c09012SAndroid Build Coastguard Worker  string body = 7;
357*d5c09012SAndroid Build Coastguard Worker
358*d5c09012SAndroid Build Coastguard Worker  // Optional. The name of the response field whose value is mapped to the HTTP
359*d5c09012SAndroid Build Coastguard Worker  // response body. When omitted, the entire response message will be used
360*d5c09012SAndroid Build Coastguard Worker  // as the HTTP response body.
361*d5c09012SAndroid Build Coastguard Worker  //
362*d5c09012SAndroid Build Coastguard Worker  // NOTE: The referred field must be present at the top-level of the response
363*d5c09012SAndroid Build Coastguard Worker  // message type.
364*d5c09012SAndroid Build Coastguard Worker  string response_body = 12;
365*d5c09012SAndroid Build Coastguard Worker
366*d5c09012SAndroid Build Coastguard Worker  // Additional HTTP bindings for the selector. Nested bindings must
367*d5c09012SAndroid Build Coastguard Worker  // not contain an `additional_bindings` field themselves (that is,
368*d5c09012SAndroid Build Coastguard Worker  // the nesting may only be one level deep).
369*d5c09012SAndroid Build Coastguard Worker  repeated HttpRule additional_bindings = 11;
370*d5c09012SAndroid Build Coastguard Worker}
371*d5c09012SAndroid Build Coastguard Worker
372*d5c09012SAndroid Build Coastguard Worker// A custom pattern is used for defining custom HTTP verb.
373*d5c09012SAndroid Build Coastguard Workermessage CustomHttpPattern {
374*d5c09012SAndroid Build Coastguard Worker  // The name of this custom HTTP verb.
375*d5c09012SAndroid Build Coastguard Worker  string kind = 1;
376*d5c09012SAndroid Build Coastguard Worker
377*d5c09012SAndroid Build Coastguard Worker  // The path matched by this custom verb.
378*d5c09012SAndroid Build Coastguard Worker  string path = 2;
379*d5c09012SAndroid Build Coastguard Worker}
380