...
1
2
3
4
5 package oauth2
6
7 import (
8 "errors"
9 "log"
10 "net/http"
11 "sync"
12 )
13
14
15
16
17
18
19
20 type Transport struct {
21
22
23 Source TokenSource
24
25
26
27 Base http.RoundTripper
28 }
29
30
31
32 func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) {
33 reqBodyClosed := false
34 if req.Body != nil {
35 defer func() {
36 if !reqBodyClosed {
37 req.Body.Close()
38 }
39 }()
40 }
41
42 if t.Source == nil {
43 return nil, errors.New("oauth2: Transport's Source is nil")
44 }
45 token, err := t.Source.Token()
46 if err != nil {
47 return nil, err
48 }
49
50 req2 := cloneRequest(req)
51 token.SetAuthHeader(req2)
52
53
54 reqBodyClosed = true
55 return t.base().RoundTrip(req2)
56 }
57
58 var cancelOnce sync.Once
59
60
61
62
63
64 func (t *Transport) CancelRequest(req *http.Request) {
65 cancelOnce.Do(func() {
66 log.Printf("deprecated: golang.org/x/oauth2: Transport.CancelRequest no longer does anything; use contexts")
67 })
68 }
69
70 func (t *Transport) base() http.RoundTripper {
71 if t.Base != nil {
72 return t.Base
73 }
74 return http.DefaultTransport
75 }
76
77
78
79 func cloneRequest(r *http.Request) *http.Request {
80
81 r2 := new(http.Request)
82 *r2 = *r
83
84 r2.Header = make(http.Header, len(r.Header))
85 for k, s := range r.Header {
86 r2.Header[k] = append([]string(nil), s...)
87 }
88 return r2
89 }
90
View as plain text