| // Copyright 2017 Google LLC. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Package option contains options for Google API clients. | |
| package option | |
| import ( | |
| "net/http" | |
| "golang.org/x/oauth2" | |
| "google.golang.org/api/internal" | |
| "google.golang.org/grpc" | |
| ) | |
| // A ClientOption is an option for a Google API client. | |
| type ClientOption interface { | |
| Apply(*internal.DialSettings) | |
| } | |
| // WithTokenSource returns a ClientOption that specifies an OAuth2 token | |
| // source to be used as the basis for authentication. | |
| func WithTokenSource(s oauth2.TokenSource) ClientOption { | |
| return withTokenSource{s} | |
| } | |
| type withTokenSource struct{ ts oauth2.TokenSource } | |
| func (w withTokenSource) Apply(o *internal.DialSettings) { | |
| o.TokenSource = w.ts | |
| } | |
| type withCredFile string | |
| func (w withCredFile) Apply(o *internal.DialSettings) { | |
| o.CredentialsFile = string(w) | |
| } | |
| // WithCredentialsFile returns a ClientOption that authenticates | |
| // API calls with the given service account or refresh token JSON | |
| // credentials file. | |
| func WithCredentialsFile(filename string) ClientOption { | |
| return withCredFile(filename) | |
| } | |
| // WithServiceAccountFile returns a ClientOption that uses a Google service | |
| // account credentials file to authenticate. | |
| // | |
| // Deprecated: Use WithCredentialsFile instead. | |
| func WithServiceAccountFile(filename string) ClientOption { | |
| return WithCredentialsFile(filename) | |
| } | |
| // WithCredentialsJSON returns a ClientOption that authenticates | |
| // API calls with the given service account or refresh token JSON | |
| // credentials. | |
| func WithCredentialsJSON(p []byte) ClientOption { | |
| return withCredentialsJSON(p) | |
| } | |
| type withCredentialsJSON []byte | |
| func (w withCredentialsJSON) Apply(o *internal.DialSettings) { | |
| o.CredentialsJSON = make([]byte, len(w)) | |
| copy(o.CredentialsJSON, w) | |
| } | |
| // WithEndpoint returns a ClientOption that overrides the default endpoint | |
| // to be used for a service. | |
| func WithEndpoint(url string) ClientOption { | |
| return withEndpoint(url) | |
| } | |
| type withEndpoint string | |
| func (w withEndpoint) Apply(o *internal.DialSettings) { | |
| o.Endpoint = string(w) | |
| } | |
| // WithScopes returns a ClientOption that overrides the default OAuth2 scopes | |
| // to be used for a service. | |
| func WithScopes(scope ...string) ClientOption { | |
| return withScopes(scope) | |
| } | |
| type withScopes []string | |
| func (w withScopes) Apply(o *internal.DialSettings) { | |
| o.Scopes = make([]string, len(w)) | |
| copy(o.Scopes, w) | |
| } | |
| // WithUserAgent returns a ClientOption that sets the User-Agent. | |
| func WithUserAgent(ua string) ClientOption { | |
| return withUA(ua) | |
| } | |
| type withUA string | |
| func (w withUA) Apply(o *internal.DialSettings) { o.UserAgent = string(w) } | |
| // WithHTTPClient returns a ClientOption that specifies the HTTP client to use | |
| // as the basis of communications. This option may only be used with services | |
| // that support HTTP as their communication transport. When used, the | |
| // WithHTTPClient option takes precedent over all other supplied options. | |
| func WithHTTPClient(client *http.Client) ClientOption { | |
| return withHTTPClient{client} | |
| } | |
| type withHTTPClient struct{ client *http.Client } | |
| func (w withHTTPClient) Apply(o *internal.DialSettings) { | |
| o.HTTPClient = w.client | |
| } | |
| // WithGRPCConn returns a ClientOption that specifies the gRPC client | |
| // connection to use as the basis of communications. This option may only be | |
| // used with services that support gRPC as their communication transport. When | |
| // used, the WithGRPCConn option takes precedent over all other supplied | |
| // options. | |
| func WithGRPCConn(conn *grpc.ClientConn) ClientOption { | |
| return withGRPCConn{conn} | |
| } | |
| type withGRPCConn struct{ conn *grpc.ClientConn } | |
| func (w withGRPCConn) Apply(o *internal.DialSettings) { | |
| o.GRPCConn = w.conn | |
| } | |
| // WithGRPCDialOption returns a ClientOption that appends a new grpc.DialOption | |
| // to an underlying gRPC dial. It does not work with WithGRPCConn. | |
| func WithGRPCDialOption(opt grpc.DialOption) ClientOption { | |
| return withGRPCDialOption{opt} | |
| } | |
| type withGRPCDialOption struct{ opt grpc.DialOption } | |
| func (w withGRPCDialOption) Apply(o *internal.DialSettings) { | |
| o.GRPCDialOpts = append(o.GRPCDialOpts, w.opt) | |
| } | |
| // WithGRPCConnectionPool returns a ClientOption that creates a pool of gRPC | |
| // connections that requests will be balanced between. | |
| // This is an EXPERIMENTAL API and may be changed or removed in the future. | |
| func WithGRPCConnectionPool(size int) ClientOption { | |
| return withGRPCConnectionPool(size) | |
| } | |
| type withGRPCConnectionPool int | |
| func (w withGRPCConnectionPool) Apply(o *internal.DialSettings) { | |
| balancer := grpc.RoundRobin(internal.NewPoolResolver(int(w), o)) | |
| o.GRPCDialOpts = append(o.GRPCDialOpts, grpc.WithBalancer(balancer)) | |
| } | |
| // WithAPIKey returns a ClientOption that specifies an API key to be used | |
| // as the basis for authentication. | |
| // | |
| // API Keys can only be used for JSON-over-HTTP APIs, including those under | |
| // the import path google.golang.org/api/.... | |
| func WithAPIKey(apiKey string) ClientOption { | |
| return withAPIKey(apiKey) | |
| } | |
| type withAPIKey string | |
| func (w withAPIKey) Apply(o *internal.DialSettings) { o.APIKey = string(w) } | |
| // WithAudiences returns a ClientOption that specifies an audience to be used | |
| // as the audience field ("aud") for the JWT token authentication. | |
| func WithAudiences(audience ...string) ClientOption { | |
| return withAudiences(audience) | |
| } | |
| type withAudiences []string | |
| func (w withAudiences) Apply(o *internal.DialSettings) { | |
| o.Audiences = make([]string, len(w)) | |
| copy(o.Audiences, w) | |
| } | |
| // WithoutAuthentication returns a ClientOption that specifies that no | |
| // authentication should be used. It is suitable only for testing and for | |
| // accessing public resources, like public Google Cloud Storage buckets. | |
| // It is an error to provide both WithoutAuthentication and any of WithAPIKey, | |
| // WithTokenSource, WithCredentialsFile or WithServiceAccountFile. | |
| func WithoutAuthentication() ClientOption { | |
| return withoutAuthentication{} | |
| } | |
| type withoutAuthentication struct{} | |
| func (w withoutAuthentication) Apply(o *internal.DialSettings) { o.NoAuth = true } | |
| // WithQuotaProject returns a ClientOption that specifies the project used | |
| // for quota and billing purposes. | |
| // | |
| // For more information please read: | |
| // https://cloud.google.com/apis/docs/system-parameters | |
| func WithQuotaProject(quotaProject string) ClientOption { | |
| return withQuotaProject(quotaProject) | |
| } | |
| type withQuotaProject string | |
| func (w withQuotaProject) Apply(o *internal.DialSettings) { | |
| o.QuotaProject = string(w) | |
| } | |
| // WithRequestReason returns a ClientOption that specifies a reason for | |
| // making the request, which is intended to be recorded in audit logging. | |
| // An example reason would be a support-case ticket number. | |
| // | |
| // For more information please read: | |
| // https://cloud.google.com/apis/docs/system-parameters | |
| func WithRequestReason(requestReason string) ClientOption { | |
| return withRequestReason(requestReason) | |
| } | |
| type withRequestReason string | |
| func (w withRequestReason) Apply(o *internal.DialSettings) { | |
| o.RequestReason = string(w) | |
| } | |
| // WithTelemetryDisabled returns a ClientOption that disables default telemetry (OpenCensus) | |
| // settings on gRPC and HTTP clients. | |
| // An example reason would be to bind custom telemetry that overrides the defaults. | |
| func WithTelemetryDisabled() ClientOption { | |
| return withTelemetryDisabledOption{} | |
| } | |
| type withTelemetryDisabledOption struct{} | |
| func (w withTelemetryDisabledOption) Apply(o *internal.DialSettings) { | |
| o.TelemetryDisabled = true | |
| } |