github.com/timstclair/heapster@v0.20.0-alpha1/Godeps/_workspace/src/golang.org/x/oauth2/internal/transport.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package internal contains support packages for oauth2 package. 6 package internal 7 8 import ( 9 "net/http" 10 11 "golang.org/x/net/context" 12 ) 13 14 // HTTPClient is the context key to use with golang.org/x/net/context's 15 // WithValue function to associate an *http.Client value with a context. 16 var HTTPClient ContextKey 17 18 // ContextKey is just an empty struct. It exists so HTTPClient can be 19 // an immutable public variable with a unique type. It's immutable 20 // because nobody else can create a ContextKey, being unexported. 21 type ContextKey struct{} 22 23 // ContextClientFunc is a func which tries to return an *http.Client 24 // given a Context value. If it returns an error, the search stops 25 // with that error. If it returns (nil, nil), the search continues 26 // down the list of registered funcs. 27 type ContextClientFunc func(context.Context) (*http.Client, error) 28 29 var contextClientFuncs []ContextClientFunc 30 31 func RegisterContextClientFunc(fn ContextClientFunc) { 32 contextClientFuncs = append(contextClientFuncs, fn) 33 } 34 35 func ContextClient(ctx context.Context) (*http.Client, error) { 36 if ctx != nil { 37 if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { 38 return hc, nil 39 } 40 } 41 for _, fn := range contextClientFuncs { 42 c, err := fn(ctx) 43 if err != nil { 44 return nil, err 45 } 46 if c != nil { 47 return c, nil 48 } 49 } 50 return http.DefaultClient, nil 51 } 52 53 func ContextTransport(ctx context.Context) http.RoundTripper { 54 hc, err := ContextClient(ctx) 55 // This is a rare error case (somebody using nil on App Engine). 56 if err != nil { 57 return ErrorTransport{err} 58 } 59 return hc.Transport 60 } 61 62 // ErrorTransport returns the specified error on RoundTrip. 63 // This RoundTripper should be used in rare error cases where 64 // error handling can be postponed to response handling time. 65 type ErrorTransport struct{ Err error } 66 67 func (t ErrorTransport) RoundTrip(*http.Request) (*http.Response, error) { 68 return nil, t.Err 69 }