Skip to content

Commit 83b6be2

Browse files
authored
feat: add caching option to fetcher (#753)
* fix: pin CRDB version in dockertest helper * feat: add caching option to fetcher
1 parent 728f15d commit 83b6be2

File tree

6 files changed

+103
-49
lines changed

6 files changed

+103
-49
lines changed

fetcher/fetcher.go

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ package fetcher
66
import (
77
"bytes"
88
"context"
9+
"crypto/sha256"
910
"encoding/base64"
1011
stderrors "errors"
1112
"io"
1213
"net/http"
1314
"os"
1415
"strings"
16+
"time"
1517

18+
"github.com/dgraph-io/ristretto"
1619
"github.com/hashicorp/go-retryablehttp"
1720
"github.com/pkg/errors"
1821

@@ -24,11 +27,15 @@ import (
2427
type Fetcher struct {
2528
hc *retryablehttp.Client
2629
limit int64
30+
cache *ristretto.Cache
31+
ttl time.Duration
2732
}
2833

2934
type opts struct {
3035
hc *retryablehttp.Client
3136
limit int64
37+
cache *ristretto.Cache
38+
ttl time.Duration
3239
}
3340

3441
var ErrUnknownScheme = stderrors.New("unknown scheme")
@@ -48,6 +55,16 @@ func WithMaxHTTPMaxBytes(limit int64) Modifier {
4855
}
4956
}
5057

58+
func WithCache(cache *ristretto.Cache, ttl time.Duration) Modifier {
59+
return func(o *opts) {
60+
if ttl < 0 {
61+
return
62+
}
63+
o.cache = cache
64+
o.ttl = ttl
65+
}
66+
}
67+
5168
func newOpts() *opts {
5269
return &opts{
5370
hc: httpx.NewResilientClient(),
@@ -62,41 +79,58 @@ func NewFetcher(opts ...Modifier) *Fetcher {
6279
for _, f := range opts {
6380
f(o)
6481
}
65-
return &Fetcher{hc: o.hc, limit: o.limit}
82+
return &Fetcher{hc: o.hc, limit: o.limit, cache: o.cache, ttl: o.ttl}
6683
}
6784

6885
// Fetch fetches the file contents from the source.
69-
func (f *Fetcher) Fetch(source string) (*bytes.Buffer, error) {
86+
func (f *Fetcher) Fetch(source string) ([]byte, error) {
7087
return f.FetchContext(context.Background(), source)
7188
}
7289

7390
// FetchContext fetches the file contents from the source and allows to pass a
7491
// context that is used for HTTP requests.
75-
func (f *Fetcher) FetchContext(ctx context.Context, source string) (*bytes.Buffer, error) {
92+
func (f *Fetcher) FetchContext(ctx context.Context, source string) ([]byte, error) {
7693
switch s := stringsx.SwitchPrefix(source); {
7794
case s.HasPrefix("http://"), s.HasPrefix("https://"):
7895
return f.fetchRemote(ctx, source)
7996
case s.HasPrefix("file://"):
80-
return f.fetchFile(strings.Replace(source, "file://", "", 1))
97+
return f.fetchFile(strings.TrimPrefix(source, "file://"))
8198
case s.HasPrefix("base64://"):
82-
src, err := base64.StdEncoding.DecodeString(strings.Replace(source, "base64://", "", 1))
99+
src, err := base64.StdEncoding.DecodeString(strings.TrimPrefix(source, "base64://"))
83100
if err != nil {
84-
return nil, errors.Wrapf(err, "rule: %s", source)
101+
return nil, errors.Wrapf(err, "base64decode: %s", source)
85102
}
86-
return bytes.NewBuffer(src), nil
103+
return src, nil
87104
default:
88105
return nil, errors.Wrap(ErrUnknownScheme, s.ToUnknownPrefixErr().Error())
89106
}
90107
}
91108

92-
func (f *Fetcher) fetchRemote(ctx context.Context, source string) (*bytes.Buffer, error) {
109+
func (f *Fetcher) fetchRemote(ctx context.Context, source string) (b []byte, err error) {
110+
if f.cache != nil {
111+
cacheKey := sha256.Sum256([]byte(source))
112+
if v, ok := f.cache.Get(cacheKey[:]); ok {
113+
cached := v.([]byte)
114+
b = make([]byte, len(cached))
115+
copy(b, cached)
116+
return b, nil
117+
}
118+
defer func() {
119+
if err == nil && len(b) > 0 {
120+
toCache := make([]byte, len(b))
121+
copy(toCache, b)
122+
f.cache.SetWithTTL(cacheKey[:], toCache, int64(len(toCache)), f.ttl)
123+
}
124+
}()
125+
}
126+
93127
req, err := retryablehttp.NewRequestWithContext(ctx, http.MethodGet, source, nil)
94128
if err != nil {
95-
return nil, errors.Wrapf(err, "rule: %s", source)
129+
return nil, errors.Wrapf(err, "new request: %s", source)
96130
}
97131
res, err := f.hc.Do(req)
98132
if err != nil {
99-
return nil, errors.Wrapf(err, "rule: %s", source)
133+
return nil, errors.Wrap(err, source)
100134
}
101135
defer res.Body.Close()
102136

@@ -113,27 +147,23 @@ func (f *Fetcher) fetchRemote(ctx context.Context, source string) (*bytes.Buffer
113147
if err != nil {
114148
return nil, err
115149
}
116-
return &buf, nil
150+
return buf.Bytes(), nil
117151
}
118-
return f.toBuffer(res.Body)
152+
return io.ReadAll(res.Body)
119153
}
120154

121-
func (f *Fetcher) fetchFile(source string) (*bytes.Buffer, error) {
155+
func (f *Fetcher) fetchFile(source string) ([]byte, error) {
122156
fp, err := os.Open(source) // #nosec:G304
123157
if err != nil {
124-
return nil, errors.Wrapf(err, "unable to fetch from source: %s", source)
158+
return nil, errors.Wrapf(err, "unable to open file: %s", source)
125159
}
126-
defer func() {
127-
_ = fp.Close()
128-
}()
129-
130-
return f.toBuffer(fp)
131-
}
132-
133-
func (f *Fetcher) toBuffer(r io.Reader) (*bytes.Buffer, error) {
134-
var b bytes.Buffer
135-
if _, err := io.Copy(&b, r); err != nil {
136-
return nil, err
160+
defer fp.Close()
161+
b, err := io.ReadAll(fp)
162+
if err != nil {
163+
return nil, errors.Wrapf(err, "unable to read file: %s", source)
164+
}
165+
if err := fp.Close(); err != nil {
166+
return nil, errors.Wrapf(err, "unable to close file: %s", source)
137167
}
138-
return &b, nil
168+
return b, nil
139169
}

fetcher/fetcher_test.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import (
1010
"fmt"
1111
"net/http"
1212
"os"
13+
"sync/atomic"
1314
"testing"
1415
"time"
1516

17+
"github.com/dgraph-io/ristretto"
1618
"github.com/hashicorp/go-retryablehttp"
1719

1820
"github.com/gobuffalo/httptest"
@@ -61,7 +63,7 @@ func TestFetcher(t *testing.T) {
6163
t.Run(fmt.Sprintf("config=%d/case=%d", fc, k), func(t *testing.T) {
6264
actual, err := fetcher.Fetch(tc.source)
6365
require.NoError(t, err)
64-
assert.JSONEq(t, tc.expect, actual.String())
66+
assert.JSONEq(t, tc.expect, string(actual))
6567
})
6668
}
6769
}
@@ -93,4 +95,41 @@ func TestFetcher(t *testing.T) {
9395
_, err = NewFetcher(WithMaxHTTPMaxBytes(4000)).Fetch(srv.URL)
9496
assert.NoError(t, err)
9597
})
98+
99+
t.Run("case=with-cache", func(t *testing.T) {
100+
var hits int32
101+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
102+
w.Write([]byte("toodaloo"))
103+
atomic.AddInt32(&hits, 1)
104+
}))
105+
t.Cleanup(srv.Close)
106+
107+
cache, err := ristretto.NewCache(&ristretto.Config{
108+
NumCounters: 100 * 10,
109+
MaxCost: 100,
110+
BufferItems: 64,
111+
})
112+
require.NoError(t, err)
113+
114+
f := NewFetcher(WithCache(cache, time.Hour))
115+
116+
res, err := f.Fetch(srv.URL)
117+
require.NoError(t, err)
118+
require.Equal(t, "toodaloo", string(res))
119+
120+
require.EqualValues(t, 1, atomic.LoadInt32(&hits))
121+
122+
f.cache.Wait()
123+
124+
for i := 0; i < 100; i++ {
125+
res2, err := f.Fetch(srv.URL)
126+
require.NoError(t, err)
127+
require.Equal(t, "toodaloo", string(res2))
128+
if &res == &res2 {
129+
t.Fatalf("cache should not return the same pointer")
130+
}
131+
}
132+
133+
require.EqualValues(t, 1, atomic.LoadInt32(&hits))
134+
})
96135
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ require (
99
github.com/bmatcuk/doublestar/v2 v2.0.4
1010
github.com/bradleyjkemp/cupaloy/v2 v2.8.0
1111
github.com/cenkalti/backoff/v4 v4.2.1
12-
github.com/cockroachdb/cockroach-go/v2 v2.2.16
12+
github.com/cockroachdb/cockroach-go/v2 v2.3.5
1313
github.com/dgraph-io/ristretto v0.1.1
1414
github.com/docker/docker v20.10.24+incompatible
1515
github.com/evanphx/json-patch/v5 v5.6.0

go.sum

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWH
117117
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
118118
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
119119
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
120-
github.com/cockroachdb/cockroach-go/v2 v2.2.16 h1:t9dmZuC9J2W8IDQDSIGXmP+fBuEJSsrGXxWQz4cYqBY=
121-
github.com/cockroachdb/cockroach-go/v2 v2.2.16/go.mod h1:xZ2VHjUEb/cySv0scXBx7YsBnHtLHkR1+w/w73b5i3M=
120+
github.com/cockroachdb/cockroach-go/v2 v2.3.5 h1:Khtm8K6fTTz/ZCWPzU9Ne3aOW9VyAnj4qIPCJgKtwK0=
121+
github.com/cockroachdb/cockroach-go/v2 v2.3.5/go.mod h1:1wNJ45eSXW9AnOc3skntW9ZUZz6gxrQK3cOj3rK+BC8=
122122
github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
123123
github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
124124
github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM=
@@ -499,8 +499,6 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU
499499
github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
500500
github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
501501
github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
502-
github.com/jackc/pgconn v1.12.0/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono=
503-
github.com/jackc/pgconn v1.12.1/go.mod h1:ZkhRC59Llhrq3oSfrikvwQ5NaxYExr6twkdkMLaKono=
504502
github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys=
505503
github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI=
506504
github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
@@ -518,7 +516,6 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW
518516
github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
519517
github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
520518
github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
521-
github.com/jackc/pgproto3/v2 v2.3.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
522519
github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y=
523520
github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
524521
github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
@@ -527,28 +524,22 @@ github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01C
527524
github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
528525
github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
529526
github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
530-
github.com/jackc/pgtype v1.11.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
531527
github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w=
532528
github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
533529
github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
534530
github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
535531
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
536532
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
537-
github.com/jackc/pgx/v4 v4.16.0/go.mod h1:N0A9sFdWzkw/Jy1lwoiB64F2+ugFZi987zRxcPez/wI=
538-
github.com/jackc/pgx/v4 v4.16.1/go.mod h1:SIhx0D5hoADaiXZVyv+3gSm3LCIIINTVO0PficsvWGQ=
539533
github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E=
540534
github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw=
541535
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
542536
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
543537
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
544-
github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
545538
github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
546539
github.com/jandelgado/gcov2lcov v1.0.4/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss=
547540
github.com/jandelgado/gcov2lcov v1.0.5 h1:rkBt40h0CVK4oCb8Dps950gvfd1rYvQ8+cWa346lVU0=
548541
github.com/jandelgado/gcov2lcov v1.0.5/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss=
549542
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
550-
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
551-
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
552543
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
553544
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
554545
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
@@ -628,7 +619,6 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
628619
github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
629620
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
630621
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
631-
github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
632622
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
633623
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
634624
github.com/luna-duclos/instrumentedsql v1.1.3 h1:t7mvC0z1jUt5A0UQ6I/0H31ryymuQRnJcWCiqV3lSAA=
@@ -841,9 +831,8 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX
841831
github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ=
842832
github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
843833
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
834+
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
844835
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
845-
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
846-
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
847836
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
848837
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
849838
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@@ -1030,7 +1019,6 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y
10301019
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
10311020
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
10321021
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
1033-
golang.org/x/crypto v0.0.0-20220517005047-85d78b3ac167/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
10341022
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
10351023
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
10361024
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
@@ -1242,7 +1230,6 @@ golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBc
12421230
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12431231
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12441232
golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1245-
golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12461233
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12471234
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
12481235
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1511,9 +1498,6 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C
15111498
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
15121499
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
15131500
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
1514-
gorm.io/driver/postgres v1.3.5/go.mod h1:EGCWefLFQSVFrHGy4J8EtiHCWX5Q8t0yz2Jt9aKkGzU=
1515-
gorm.io/gorm v1.23.4/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
1516-
gorm.io/gorm v1.23.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
15171501
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
15181502
gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I=
15191503
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

jwksx/fetcher_v2.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package jwksx
55

66
import (
7+
"bytes"
78
"context"
89
"crypto/sha256"
910
"time"
@@ -156,7 +157,7 @@ func (f *FetcherNext) fetch(ctx context.Context, location string, opts *fetcherN
156157
return nil, err
157158
}
158159

159-
set, err := jwk.ParseReader(result)
160+
set, err := jwk.ParseReader(bytes.NewBuffer(result))
160161
if err != nil {
161162
return nil, errors.WithStack(herodot.ErrBadRequest.WithReason("failed to parse JWK set").WithWrap(err))
162163
}

sqlcon/dockertest/cockroach.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
func NewLocalTestCRDBServer(t testing.TB) string {
14-
ts, err := testserver.NewTestServer()
14+
ts, err := testserver.NewTestServer(testserver.CustomVersionOpt("23.1.13"))
1515
require.NoError(t, err)
1616
t.Cleanup(ts.Stop)
1717

0 commit comments

Comments
 (0)