Lokasi ngalangkungan proxy:   [ UP ]  
[Ngawartoskeun bug]   [Panyetelan cookie]                
Skip to content

Commit df0c795

Browse files
committed
Don't retry the atlas requests with the wrong cert
This probably won't recover, so abort immediately. Requires retryablehttp CheckRetry patch.
1 parent ee6159c commit df0c795

2 files changed

Lines changed: 68 additions & 0 deletions

File tree

state/remote/atlas.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"crypto/md5"
66
"crypto/tls"
7+
"crypto/x509"
78
"encoding/base64"
89
"fmt"
910
"io"
@@ -276,9 +277,26 @@ func (c *AtlasClient) http() (*retryablehttp.Client, error) {
276277
return nil, err
277278
}
278279
rc := retryablehttp.NewClient()
280+
281+
rc.CheckRetry = func(resp *http.Response, err error) (bool, error) {
282+
if err != nil {
283+
// don't bother retrying if the certs don't match
284+
if err, ok := err.(*url.Error); ok {
285+
if _, ok := err.Err.(x509.UnknownAuthorityError); ok {
286+
return false, nil
287+
}
288+
}
289+
// continue retrying
290+
return true, nil
291+
}
292+
return retryablehttp.DefaultRetryPolicy(resp, err)
293+
}
294+
279295
t := cleanhttp.DefaultTransport()
280296
t.TLSClientConfig = tlsConfig
281297
rc.HTTPClient.Transport = t
298+
299+
c.HTTPClient = rc
282300
return rc, nil
283301
}
284302

state/remote/atlas_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ package remote
33
import (
44
"bytes"
55
"crypto/md5"
6+
"crypto/tls"
7+
"crypto/x509"
68
"net/http"
79
"net/http/httptest"
10+
"net/url"
811
"os"
912
"testing"
1013
"time"
@@ -36,6 +39,53 @@ func TestAtlasClient(t *testing.T) {
3639
testClient(t, client)
3740
}
3841

42+
func TestAtlasClient_noRetryOnBadCerts(t *testing.T) {
43+
acctest.RemoteTestPrecheck(t)
44+
45+
client, err := atlasFactory(map[string]string{
46+
"access_token": "NOT_REQUIRED",
47+
"name": "hashicorp/test-remote-state",
48+
})
49+
if err != nil {
50+
t.Fatalf("bad: %s", err)
51+
}
52+
53+
ac := client.(*AtlasClient)
54+
// trigger the AtlasClient to build the http client and assign HTTPClient
55+
httpClient, err := ac.http()
56+
if err != nil {
57+
t.Fatal(err)
58+
}
59+
60+
// remove the CA certs from the client
61+
brokenCfg := &tls.Config{
62+
RootCAs: new(x509.CertPool),
63+
}
64+
httpClient.HTTPClient.Transport.(*http.Transport).TLSClientConfig = brokenCfg
65+
66+
// Instrument CheckRetry to make sure we didn't retry
67+
retries := 0
68+
oldCheck := httpClient.CheckRetry
69+
httpClient.CheckRetry = func(resp *http.Response, err error) (bool, error) {
70+
if retries > 0 {
71+
t.Fatal("retried after certificate error")
72+
}
73+
retries++
74+
return oldCheck(resp, err)
75+
}
76+
77+
_, err = client.Get()
78+
if err != nil {
79+
if err, ok := err.(*url.Error); ok {
80+
if _, ok := err.Err.(x509.UnknownAuthorityError); ok {
81+
return
82+
}
83+
}
84+
}
85+
86+
t.Fatalf("expected x509.UnknownAuthorityError, got %v", err)
87+
}
88+
3989
func TestAtlasClient_ReportedConflictEqualStates(t *testing.T) {
4090
fakeAtlas := newFakeAtlas(t, testStateModuleOrderChange)
4191
srv := fakeAtlas.Server()

0 commit comments

Comments
 (0)