From fe54ffd92359506fca1ffd70dc647db0ab9a903c Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Thu, 2 May 2024 12:36:35 -0600 Subject: [PATCH] feat(google-api-go-client): add x-goog-api-version header (#2563) --- google-api-go-generator/gen.go | 7 ++++- .../internal/disco/disco.go | 1 + google-api-go-generator/testdata/any.json | 15 ++++++++++ google-api-go-generator/testdata/any.want | 30 +++++++++---------- internal/gensupport/params.go | 9 ++++-- internal/gensupport/params_test.go | 13 ++++++++ 6 files changed, 57 insertions(+), 18 deletions(-) diff --git a/google-api-go-generator/gen.go b/google-api-go-generator/gen.go index cb69dd8d77c..fa2268a50e5 100644 --- a/google-api-go-generator/gen.go +++ b/google-api-go-generator/gen.go @@ -2223,7 +2223,12 @@ func (meth *Method) generateCode() { if !meth.IsRawRequest() && args.bodyArg() != nil && httpMethod != "GET" { contentType = `"application/json"` } - pn(`reqHeaders := gensupport.SetHeaders(c.s.userAgent(), %s, c.header_ )`, contentType) + apiVersion := meth.m.APIVersion + if apiVersion == "" { + pn(`reqHeaders := gensupport.SetHeaders(c.s.userAgent(), %s, c.header_)`, contentType) + } else { + pn(`reqHeaders := gensupport.SetHeaders(c.s.userAgent(), %s, c.header_, "x-goog-api-version", %q)`, contentType, apiVersion) + } if httpMethod == "GET" { pn(`if c.ifNoneMatch_ != "" {`) pn(` reqHeaders.Set("If-None-Match", c.ifNoneMatch_)`) diff --git a/google-api-go-generator/internal/disco/disco.go b/google-api-go-generator/internal/disco/disco.go index b43d6ed20de..991d50bc19e 100644 --- a/google-api-go-generator/internal/disco/disco.go +++ b/google-api-go-generator/internal/disco/disco.go @@ -368,6 +368,7 @@ type Method struct { Scopes []string MediaUpload *MediaUpload SupportsMediaDownload bool + APIVersion string JSONMap map[string]interface{} `json:"-"` } diff --git a/google-api-go-generator/testdata/any.json b/google-api-go-generator/testdata/any.json index a5772080777..980107f8d80 100644 --- a/google-api-go-generator/testdata/any.json +++ b/google-api-go-generator/testdata/any.json @@ -433,6 +433,7 @@ "list": { "id": "logging.projects.logs.list", "path": "v1beta3/projects/{projectsId}/logs", + "apiVersion": "v1_20240501", "httpMethod": "GET", "description": "Lists log resources belonging to the specified project.", "parameters": { @@ -477,6 +478,7 @@ "delete": { "id": "logging.projects.logs.delete", "path": "v1beta3/projects/{projectsId}/logs/{logsId}", + "apiVersion": "v1_20240501", "httpMethod": "DELETE", "description": "Deletes the specified log resource and all log entries contained in it.", "parameters": { @@ -511,6 +513,7 @@ "write": { "id": "logging.projects.logs.entries.write", "path": "v1beta3/projects/{projectsId}/logs/{logsId}/entries:write", + "apiVersion": "v1_20240501", "httpMethod": "POST", "description": "Creates one or more log entries in a log. You must supply a list of `LogEntry` objects, named `entries`. Each `LogEntry` object must contain a payload object and a `LogEntryMetadata` object that describes the entry. You must fill in all the fields of the entry, metadata, and payload. You can also supply a map, `commonLabels`, that supplies default (key, value) data for the `entries[].metadata.labels` maps, saving you the trouble of creating identical copies for each entry.", "parameters": { @@ -548,6 +551,7 @@ "list": { "id": "logging.projects.logs.sinks.list", "path": "v1beta3/projects/{projectsId}/logs/{logsId}/sinks", + "apiVersion": "v1_20240501", "httpMethod": "GET", "description": "Lists log sinks associated with the specified log.", "parameters": { @@ -578,6 +582,7 @@ "get": { "id": "logging.projects.logs.sinks.get", "path": "v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}", + "apiVersion": "v1_20240501", "httpMethod": "GET", "description": "Gets the specified log sink resource.", "parameters": { @@ -615,6 +620,7 @@ "create": { "id": "logging.projects.logs.sinks.create", "path": "v1beta3/projects/{projectsId}/logs/{logsId}/sinks", + "apiVersion": "v1_20240501", "httpMethod": "POST", "description": "Creates the specified log sink resource.", "parameters": { @@ -648,6 +654,7 @@ "update": { "id": "logging.projects.logs.sinks.update", "path": "v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}", + "apiVersion": "v1_20240501", "httpMethod": "PUT", "description": "Creates or updates the specified log sink resource.", "parameters": { @@ -688,6 +695,7 @@ "delete": { "id": "logging.projects.logs.sinks.delete", "path": "v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}", + "apiVersion": "v1_20240501", "httpMethod": "DELETE", "description": "Deletes the specified log sink resource.", "parameters": { @@ -731,6 +739,7 @@ "list": { "id": "logging.projects.logServices.list", "path": "v1beta3/projects/{projectsId}/logServices", + "apiVersion": "v1_20240501", "httpMethod": "GET", "description": "Lists log services associated with log entries ingested for a project.", "parameters": { @@ -774,6 +783,7 @@ "list": { "id": "logging.projects.logServices.indexes.list", "path": "v1beta3/projects/{projectsId}/logServices/{logServicesId}/indexes", + "apiVersion": "v1_20240501", "httpMethod": "GET", "description": "Lists log service indexes associated with a log service.", "parameters": { @@ -835,6 +845,7 @@ "list": { "id": "logging.projects.logServices.sinks.list", "path": "v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks", + "apiVersion": "v1_20240501", "httpMethod": "GET", "description": "Lists log service sinks associated with the specified service.", "parameters": { @@ -865,6 +876,7 @@ "get": { "id": "logging.projects.logServices.sinks.get", "path": "v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}", + "apiVersion": "v1_20240501", "httpMethod": "GET", "description": "Gets the specified log service sink resource.", "parameters": { @@ -902,6 +914,7 @@ "create": { "id": "logging.projects.logServices.sinks.create", "path": "v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks", + "apiVersion": "v1_20240501", "httpMethod": "POST", "description": "Creates the specified log service sink resource.", "parameters": { @@ -935,6 +948,7 @@ "update": { "id": "logging.projects.logServices.sinks.update", "path": "v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}", + "apiVersion": "v1_20240501", "httpMethod": "PUT", "description": "Creates or update the specified log service sink resource.", "parameters": { @@ -975,6 +989,7 @@ "delete": { "id": "logging.projects.logServices.sinks.delete", "path": "v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}", + "apiVersion": "v1_20240501", "httpMethod": "DELETE", "description": "Deletes the specified log service sink.", "parameters": { diff --git a/google-api-go-generator/testdata/any.want b/google-api-go-generator/testdata/any.want index c7f05a1da12..f0a8f17ee6b 100644 --- a/google-api-go-generator/testdata/any.want +++ b/google-api-go-generator/testdata/any.want @@ -749,7 +749,7 @@ func (c *ProjectsLogServicesListCall) Header() http.Header { } func (c *ProjectsLogServicesListCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") if c.ifNoneMatch_ != "" { reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } @@ -932,7 +932,7 @@ func (c *ProjectsLogServicesIndexesListCall) Header() http.Header { } func (c *ProjectsLogServicesIndexesListCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") if c.ifNoneMatch_ != "" { reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } @@ -1059,7 +1059,7 @@ func (c *ProjectsLogServicesSinksCreateCall) Header() http.Header { } func (c *ProjectsLogServicesSinksCreateCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink) if err != nil { @@ -1165,7 +1165,7 @@ func (c *ProjectsLogServicesSinksDeleteCall) Header() http.Header { } func (c *ProjectsLogServicesSinksDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil c.urlParams_.Set("alt", alt) c.urlParams_.Set("prettyPrint", "false") @@ -1277,7 +1277,7 @@ func (c *ProjectsLogServicesSinksGetCall) Header() http.Header { } func (c *ProjectsLogServicesSinksGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") if c.ifNoneMatch_ != "" { reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } @@ -1390,7 +1390,7 @@ func (c *ProjectsLogServicesSinksListCall) Header() http.Header { } func (c *ProjectsLogServicesSinksListCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") if c.ifNoneMatch_ != "" { reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } @@ -1498,7 +1498,7 @@ func (c *ProjectsLogServicesSinksUpdateCall) Header() http.Header { } func (c *ProjectsLogServicesSinksUpdateCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink) if err != nil { @@ -1603,7 +1603,7 @@ func (c *ProjectsLogsDeleteCall) Header() http.Header { } func (c *ProjectsLogsDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil c.urlParams_.Set("alt", alt) c.urlParams_.Set("prettyPrint", "false") @@ -1749,7 +1749,7 @@ func (c *ProjectsLogsListCall) Header() http.Header { } func (c *ProjectsLogsListCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") if c.ifNoneMatch_ != "" { reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } @@ -1881,7 +1881,7 @@ func (c *ProjectsLogsEntriesWriteCall) Header() http.Header { } func (c *ProjectsLogsEntriesWriteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil body, err := googleapi.WithoutDataWrapper.JSONReader(c.writelogentriesrequest) if err != nil { @@ -1987,7 +1987,7 @@ func (c *ProjectsLogsSinksCreateCall) Header() http.Header { } func (c *ProjectsLogsSinksCreateCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink) if err != nil { @@ -2093,7 +2093,7 @@ func (c *ProjectsLogsSinksDeleteCall) Header() http.Header { } func (c *ProjectsLogsSinksDeleteCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil c.urlParams_.Set("alt", alt) c.urlParams_.Set("prettyPrint", "false") @@ -2205,7 +2205,7 @@ func (c *ProjectsLogsSinksGetCall) Header() http.Header { } func (c *ProjectsLogsSinksGetCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") if c.ifNoneMatch_ != "" { reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } @@ -2317,7 +2317,7 @@ func (c *ProjectsLogsSinksListCall) Header() http.Header { } func (c *ProjectsLogsSinksListCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "", c.header_, "x-goog-api-version", "v1_20240501") if c.ifNoneMatch_ != "" { reqHeaders.Set("If-None-Match", c.ifNoneMatch_) } @@ -2425,7 +2425,7 @@ func (c *ProjectsLogsSinksUpdateCall) Header() http.Header { } func (c *ProjectsLogsSinksUpdateCall) doRequest(alt string) (*http.Response, error) { - reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_) + reqHeaders := gensupport.SetHeaders(c.s.userAgent(), "application/json", c.header_, "x-goog-api-version", "v1_20240501") var body io.Reader = nil body, err := googleapi.WithoutDataWrapper.JSONReader(c.logsink) if err != nil { diff --git a/internal/gensupport/params.go b/internal/gensupport/params.go index 3f4074c8190..6a5326c0893 100644 --- a/internal/gensupport/params.go +++ b/internal/gensupport/params.go @@ -58,10 +58,15 @@ func SetOptions(u URLParams, opts ...googleapi.CallOption) { } } -// SetHeaders sets common headers for all requests. -func SetHeaders(userAgent, contentType string, userHeaders http.Header) http.Header { +// SetHeaders sets common headers for all requests. The keyvals header pairs +// should have a corresponding value for every key provided. If there is an odd +// number of keyvals this method will panic. +func SetHeaders(userAgent, contentType string, userHeaders http.Header, keyvals ...string) http.Header { reqHeaders := make(http.Header) reqHeaders.Set("x-goog-api-client", "gl-go/"+GoVersion()+" gdcl/"+internal.Version) + for i := 0; i < len(keyvals); i = i + 2 { + reqHeaders.Set(keyvals[i], keyvals[i+1]) + } reqHeaders.Set("User-Agent", userAgent) if contentType != "" { reqHeaders.Set("Content-Type", contentType) diff --git a/internal/gensupport/params_test.go b/internal/gensupport/params_test.go index 39ef070f00e..8f6e021dbe5 100644 --- a/internal/gensupport/params_test.go +++ b/internal/gensupport/params_test.go @@ -5,6 +5,7 @@ package gensupport import ( + "net/http" "testing" "google.golang.org/api/googleapi" @@ -18,3 +19,15 @@ func TestSetOptionsGetMulti(t *testing.T) { t.Fatalf("URLParams.Encode() = %q, want %q", got, want) } } + +func TestSetHeaders(t *testing.T) { + userAgent := "google-api-go-client/123" + contentType := "application/json" + userHeaders := make(http.Header) + userHeaders.Set("baz", "300") + got := SetHeaders(userAgent, contentType, userHeaders, "foo", "100", "bar", "200") + + if len(got) != 6 { + t.Fatalf("SetHeaders() = %q, want len(6)", got) + } +}