aboutsummaryrefslogtreecommitdiff
path: root/provider.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-01-19 16:35:54 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-01-19 16:35:54 +0100
commit9ed605aad5f9a94ee0c050155c02dc31e9652764 (patch)
tree617232ce3de18ac14f117472f4b0bb1dd0d24c09 /provider.go
parent5266a287f27de41c60fee753bc8a3ef0a0532afc (diff)
Inject roundtripper
Diffstat (limited to 'provider.go')
-rw-r--r--provider.go32
1 files changed, 18 insertions, 14 deletions
diff --git a/provider.go b/provider.go
index 2a75059..a4aab8a 100644
--- a/provider.go
+++ b/provider.go
@@ -16,6 +16,7 @@ type Provider struct {
Directory
nonces chan string
http.Client
+ http.Transport
}
var (
@@ -25,6 +26,19 @@ var (
errStatus = errors.New("unexpected status")
)
+// RoundTrip implements RoundTipper
+func (p Provider) RoundTrip(req *http.Request) (*http.Response, error) {
+ resp, err := p.Transport.RoundTrip(req)
+ if err != nil {
+ return nil, err
+ }
+ nonce := resp.Header.Get("Replay-Nonce")
+ if nonce != "" && len(p.nonces) < cap(p.nonces) {
+ p.nonces <- nonce
+ }
+ return resp, nil
+}
+
// Nonce implements jose nonce provider
func (p Provider) Nonce() (string, error) {
select {
@@ -35,20 +49,12 @@ func (p Provider) Nonce() (string, error) {
}
}
-func (p Provider) nonce(resp *http.Response) {
- rn := resp.Header.Get("Replay-Nonce")
- if rn != "" && len(p.nonces) < cap(p.nonces) {
- p.nonces <- rn
- }
-}
-
// DialProvider fetches directory and initializes nonce
func DialProvider(directory string) (*Provider, error) {
- p := &Provider{
- nonces: make(chan string, 10),
- Client: http.Client{
- Timeout: time.Duration(5 * time.Second),
- },
+ p := &Provider{nonces: make(chan string, 10)}
+ p.Client = http.Client{
+ Transport: p,
+ Timeout: time.Duration(5 * time.Second),
}
resp, err := p.get(directory)
if err != nil {
@@ -66,7 +72,6 @@ func (p *Provider) post(uri string, s Signer, v interface{}) (*http.Response, er
if err != nil {
return nil, err
}
- p.nonce(resp)
if hasProblem(resp) {
defer resp.Body.Close()
return nil, problem(resp.Body)
@@ -79,7 +84,6 @@ func (p *Provider) get(uri string) (*http.Response, error) {
if err != nil {
return nil, err
}
- p.nonce(resp)
if hasProblem(resp) {
defer resp.Body.Close()
return nil, problem(resp.Body)