// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package internal contains support packages for oauth2 package. package internal import ( "net/http" "golang.org/x/net/context" ) // HTTPClient is the context key to use with golang.org/x/net/context's // WithValue function to associate an *http.Client value with a context. var HTTPClient ContextKey // ContextKey is just an empty struct. It exists so HTTPClient can be // an immutable public variable with a unique type. It's immutable // because nobody else can create a ContextKey, being unexported. type ContextKey struct{} // ContextClientFunc is a func which tries to return an *http.Client // given a Context value. If it returns an error, the search stops // with that error. If it returns (nil, nil), the search continues // down the list of registered funcs. type ContextClientFunc func(context.Context) (*http.Client, error) var contextClientFuncs []ContextClientFunc func RegisterContextClientFunc(fn ContextClientFunc) { contextClientFuncs = append(contextClientFuncs, fn) } func ContextClient(ctx context.Context) (*http.Client, error) { if ctx != nil { if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { return hc, nil } } for _, fn := range contextClientFuncs { c, err := fn(ctx) if err != nil { return nil, err } if c != nil { return c, nil } } return http.DefaultClient, nil } func ContextTransport(ctx context.Context) http.RoundTripper { hc, err := ContextClient(ctx) // This is a rare error case (somebody using nil on App Engine). if err != nil { return ErrorTransport{err} } return hc.Transport } // ErrorTransport returns the specified error on RoundTrip. // This RoundTripper should be used in rare error cases where // error handling can be postponed to response handling time. type ErrorTransport struct{ Err error } func (t ErrorTransport) RoundTrip(*http.Request) (*http.Response, error) { return nil, t.Err }