From 800c5f4ffd837764cd51e55d0da84aeff2f6bfd0 Mon Sep 17 00:00:00 2001 From: Anthony MOUTTE Date: Tue, 13 May 2025 09:53:56 +0200 Subject: [PATCH 1/2] V4 improvements --- .travis.yml | 2 +- README.md | 22 ++++++++++-------- go.mod | 1 - go.sum | 7 ------ handler.go | 15 ++++++++++++ handler_test.go | 41 +++++++++++++++++++++++++++++++++ middleware.go | 14 +++++++++++ middleware/auth_test.go | 6 ++--- middleware/metrics_test.go | 19 ++++----------- middleware/request_listener.go | 10 ++++++++ tripperware.go | 4 ++-- tripperware/metrics_test.go | 28 +++------------------- tripperware/request_listener.go | 10 ++++++++ tripperware_test.go | 13 ++++++----- 14 files changed, 122 insertions(+), 70 deletions(-) create mode 100644 handler.go create mode 100644 handler_test.go diff --git a/.travis.yml b/.travis.yml index 34833d2..fd7732b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ before_script: - ./cc-test-reporter before-build script: - - go test --race -gcflags=-l -coverprofile c.out ./... + - go test --race -coverprofile c.out ./... after_script: - CC_TEST_REPORTER_ID=$CC_TEST_REPORTER_ID ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT diff --git a/README.md b/README.md index 95e7769..40c002f 100644 --- a/README.md +++ b/README.md @@ -13,16 +13,18 @@ Package httpware is a collection of middleware (net/http.Handler wrapper) and tr - **CorrelationId** gets or creates a `correlation_id` and adds it to the `http.request` Context and in the `http.response` header (in order to propagate this ID throught all microservices) - **Metrics** will use a given Recorder to collect `inflight request`(current parrallel request count), `request duration` and `response size`. -| Name | Middleware | Tripperware| -| ------ | :--------: | :--------: | -|**Authentication**|X|| -|**AuthenticationForwarder**||X| -|**CorrelationId**|X|X| -|**Metrics**|X|X| -|**Interceptor**|X|X| -|**Skip**|X|X| -|**Enable**|X|X| -|**RateLimiter**|X|X| +| Name | Middleware | Tripperware| +|-----------------------------| :--------: | :--------: | +| **Authentication** |X|| +| **AuthenticationForwarder** ||X| +| **CorrelationId** |X|X| +| **Metrics** |X|X| +| **Interceptor** |X|X| +| **Skip** |X|X| +| **Enable** |X|X| +| **RateLimiter** |X|X| +| **RequestListener** |X|X| +| **CurlLogDumper** |X|X| ## Installation diff --git a/go.mod b/go.mod index c3a2508..1d97708 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module github.com/gol4ng/httpware/v4 go 1.10 require ( - github.com/agiledragon/gomonkey/v2 v2.3.1 github.com/felixge/httpsnoop v1.0.3 github.com/prometheus/client_golang v1.14.0 github.com/stretchr/testify v1.8.2 diff --git a/go.sum b/go.sum index 7c9d0ed..c0dceb3 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,6 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/agiledragon/gomonkey/v2 v2.3.1 h1:k+UnUY0EMNYUFUAQVETGY9uUTxjMdnUkP0ARyJS1zzs= -github.com/agiledragon/gomonkey/v2 v2.3.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -135,7 +133,6 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -146,7 +143,6 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -206,8 +202,6 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -387,7 +381,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= diff --git a/handler.go b/handler.go new file mode 100644 index 0000000..062edc2 --- /dev/null +++ b/handler.go @@ -0,0 +1,15 @@ +package httpware + +import ( + "net/http" +) + +var ( + NopHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) +) + +func StatusHandler(code int) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(code) + }) +} diff --git a/handler_test.go b/handler_test.go new file mode 100644 index 0000000..339f92b --- /dev/null +++ b/handler_test.go @@ -0,0 +1,41 @@ +package httpware_test + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gol4ng/httpware/v4" + "github.com/stretchr/testify/assert" +) + +func TestStatusHandler(t *testing.T) { + tests := []struct { + name string + statusCode int + }{ + {"OK", http.StatusOK}, + {"NotFound", http.StatusNotFound}, + {"InternalServerError", http.StatusInternalServerError}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + request := httptest.NewRequest("GET", "/", nil) + recorder := httptest.NewRecorder() + + httpware.StatusHandler(tt.statusCode).ServeHTTP(recorder, request) + + assert.Equal(t, tt.statusCode, recorder.Code) + }) + } +} + +func TestStatusHandlerWillPanic(t *testing.T) { + request := httptest.NewRequest("GET", "/", nil) + recorder := httptest.NewRecorder() + + assert.PanicsWithValue(t, "invalid WriteHeader code -1", func() { + httpware.StatusHandler(-1).ServeHTTP(recorder, request) + }) +} diff --git a/middleware.go b/middleware.go index 95db1de..7f98d8c 100644 --- a/middleware.go +++ b/middleware.go @@ -11,6 +11,10 @@ func NopMiddleware(next http.Handler) http.Handler { // it wraps an http.Handler with another one type Middleware func(http.Handler) http.Handler +func (m Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { + m(NopHandler).ServeHTTP(w, r) +} + // Append will add given middlewares after existing one // t1.Append(t2, t3) => [t1, t2, t3] // t1.Append(t2, t3).DecorateHandler() == t1(t2(t3())) @@ -44,8 +48,15 @@ func (m Middleware) PrependIf(condition bool, middlewares ...Middleware) Middlew // [t1, t2, t3].DecorateHandler() == t1(t2(t3())) type Middlewares []Middleware +func (m Middlewares) ServeHTTP(w http.ResponseWriter, r *http.Request) { + m.DecorateHandler(nil).ServeHTTP(w, r) +} + // DecorateHandler will decorate a given http.Handler with the given middlewares created by MiddlewareStack() func (m Middlewares) DecorateHandler(handler http.Handler) http.Handler { + if handler == nil { + handler = NopHandler + } mLen := len(m) for i := mLen - 1; i >= 0; i-- { handler = m[i](handler) @@ -55,6 +66,9 @@ func (m Middlewares) DecorateHandler(handler http.Handler) http.Handler { // DecorateHandler will decorate a given http.HandlerFunc with the given middleware collection created by MiddlewareStack() func (m Middlewares) DecorateHandlerFunc(handler http.HandlerFunc) http.Handler { + if handler == nil { + return m.DecorateHandler(nil) + } return m.DecorateHandler(handler) } diff --git a/middleware/auth_test.go b/middleware/auth_test.go index e46c45f..1268dee 100644 --- a/middleware/auth_test.go +++ b/middleware/auth_test.go @@ -164,7 +164,7 @@ func TestNewAuthenticateFunc(t *testing.T) { request.Header.Set("Authorization", "my_credential") authenticator := &mocks.Authenticator{} - authenticator.On("Authenticate", context.TODO(), "my_credential").Return("my_authenticate_credential", nil) + authenticator.On("Authenticate", context.Background(), "my_credential").Return("my_authenticate_credential", nil) authenticateFunc := middleware.NewAuthenticateFunc(authenticator) @@ -179,7 +179,7 @@ func TestNewAuthenticateFunc_WithCredentialFinder(t *testing.T) { request := httptest.NewRequest(http.MethodGet, "http://fake-addr", nil) authenticator := &mocks.Authenticator{} - authenticator.On("Authenticate", context.TODO(), "my_credential_finder_value").Return("my_authenticate_credential", nil) + authenticator.On("Authenticate", context.Background(), "my_credential_finder_value").Return("my_authenticate_credential", nil) authenticateFunc := middleware.NewAuthenticateFunc( authenticator, @@ -201,7 +201,7 @@ func TestNewAuthenticateFunc_Error(t *testing.T) { err := errors.New("my_authenticate_error") authenticator := &mocks.Authenticator{} - authenticator.On("Authenticate", context.TODO(), "my_credential").Return("my_authenticate_credential", err) + authenticator.On("Authenticate", context.Background(), "my_credential").Return("my_authenticate_credential", err) authenticateFunc := middleware.NewAuthenticateFunc(authenticator) diff --git a/middleware/metrics_test.go b/middleware/metrics_test.go index 20240f6..4809041 100644 --- a/middleware/metrics_test.go +++ b/middleware/metrics_test.go @@ -6,11 +6,10 @@ import ( "net/http" "net/http/httptest" "testing" - "time" - "github.com/agiledragon/gomonkey/v2" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/gol4ng/httpware/v4" "github.com/gol4ng/httpware/v4/metrics" @@ -23,13 +22,11 @@ func TestMetrics(t *testing.T) { var recorderMock = &mocks.Recorder{} var responseWriterMock = &httptest.ResponseRecorder{} var req *http.Request - var requestTimeDuration = 10 * time.Millisecond - var baseTime = time.Unix(513216000, 0) var responseBody = "fake response" - // create fake http request + // create a fake http request req = httptest.NewRequest(http.MethodGet, "http://fake-addr", nil) - // create handler that set http status to 200 and write some response content + // create a handler that set http status to 200 and write some response content handler := func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, req, r) w.WriteHeader(http.StatusOK) @@ -43,16 +40,8 @@ func TestMetrics(t *testing.T) { // assert recorder calls recorderMock.On("AddInflightRequests", req.Context(), req.URL.String(), 1).Once() recorderMock.On("AddInflightRequests", req.Context(), req.URL.String(), -1).Once() - recorderMock.On("ObserveHTTPRequestDuration", req.Context(), req.URL.String(), requestTimeDuration, http.MethodGet, "2xx") recorderMock.On("ObserveHTTPResponseSize", req.Context(), req.URL.String(), int64(len(responseBody)), http.MethodGet, "2xx") - // mock time.Now method in order to return always the same time whenever the test is launched - patch := gomonkey.NewPatches() - patch.ApplyFunc(time.Now, func() time.Time { return baseTime }) - patch.ApplyFunc(time.Since, func(since time.Time) time.Duration { - assert.Equal(t, baseTime, since) - return requestTimeDuration - }) - defer patch.Reset() + recorderMock.On("ObserveHTTPRequestDuration", req.Context(), req.URL.String(), mock.AnythingOfType("time.Duration"), http.MethodGet, "2xx") // call the middleware stack stack.DecorateHandlerFunc(handler).ServeHTTP(responseWriterMock, req) diff --git a/middleware/request_listener.go b/middleware/request_listener.go index fbac120..fbfaa85 100644 --- a/middleware/request_listener.go +++ b/middleware/request_listener.go @@ -4,8 +4,18 @@ import ( "net/http" "github.com/gol4ng/httpware/v4" + "github.com/gol4ng/httpware/v4/request_listener" ) +func CurlLogDumper() httpware.Middleware { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + request_listener.CurlLogDumper(request) + next.ServeHTTP(writer, request) + }) + } +} + func RequestListener(listeners ...func(*http.Request)) httpware.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { diff --git a/tripperware.go b/tripperware.go index d5a06f1..42a64fd 100644 --- a/tripperware.go +++ b/tripperware.go @@ -79,7 +79,7 @@ type Tripperwares []Tripperware // it will decorate the http-client request and use the default `http.DefaultTransport` RoundTripper // use `TripperwareStack().Decorate()` if you don't want to use `http.DefaultTransport` func (t Tripperwares) RoundTrip(req *http.Request) (*http.Response, error) { - return t.DecorateRoundTripper(http.DefaultTransport).RoundTrip(req) + return t.DecorateRoundTripper(nil).RoundTrip(req) } // DecorateClient will decorate a given http.Client with the tripperware collection @@ -111,7 +111,7 @@ func (t Tripperwares) DecorateRoundTripper(tripper http.RoundTripper) http.Round // DecorateRoundTripFunc will decorate a given RoundTripFunc with the tripperware collection func (t Tripperwares) DecorateRoundTripFunc(tripper RoundTripFunc) http.RoundTripper { if tripper == nil { - return t.DecorateRoundTripper(http.DefaultTransport) + return t.DecorateRoundTripper(nil) } return t.DecorateRoundTripper(tripper) } diff --git a/tripperware/metrics_test.go b/tripperware/metrics_test.go index 6014872..68d2863 100644 --- a/tripperware/metrics_test.go +++ b/tripperware/metrics_test.go @@ -1,13 +1,11 @@ package tripperware_test import ( - "github.com/agiledragon/gomonkey/v2" "net/http" "net/http/httptest" "testing" - "time" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/gol4ng/httpware/v4" "github.com/gol4ng/httpware/v4/metrics" @@ -20,13 +18,11 @@ func TestMetrics(t *testing.T) { var recorderMock = &mocks.Recorder{} var roundTripperMock = &mocks.RoundTripper{} var req *http.Request - var requestTimeDuration = 10 * time.Millisecond var resp = &http.Response{ Status: "OK", StatusCode: http.StatusOK, ContentLength: 30, } - var baseTime = time.Unix(513216000, 0) req = httptest.NewRequest(http.MethodGet, "http://fake-addr", nil) // mock roundTripper calls @@ -34,16 +30,8 @@ func TestMetrics(t *testing.T) { // assert recorder calls recorderMock.On("AddInflightRequests", req.Context(), req.URL.String(), 1).Once() recorderMock.On("AddInflightRequests", req.Context(), req.URL.String(), -1).Once() - recorderMock.On("ObserveHTTPRequestDuration", req.Context(), req.URL.String(), requestTimeDuration, http.MethodGet, "2xx") + recorderMock.On("ObserveHTTPRequestDuration", req.Context(), req.URL.String(), mock.AnythingOfType("time.Duration"), http.MethodGet, "2xx") recorderMock.On("ObserveHTTPResponseSize", req.Context(), req.URL.String(), resp.ContentLength, http.MethodGet, "2xx") - // mock time.Now method in order to return always the same time whenever the test is launched - patch := gomonkey.NewPatches() - patch.ApplyFunc(time.Now, func() time.Time { return baseTime }) - patch.ApplyFunc(time.Since, func(since time.Time) time.Duration { - assert.Equal(t, baseTime, since) - return requestTimeDuration - }) - defer patch.Reset() // create metrics httpClient middleware stack := httpware.TripperwareStack( @@ -56,14 +44,12 @@ func TestMetricsContentLengthUnknown(t *testing.T) { var recorderMock = &mocks.Recorder{} var roundTripperMock = &mocks.RoundTripper{} var req *http.Request - var requestTimeDuration = 10 * time.Millisecond var resp = &http.Response{ Status: "OK", StatusCode: http.StatusOK, ContentLength: -1, } expectedContentLength := int64(0) - var baseTime = time.Unix(513216000, 0) req = httptest.NewRequest(http.MethodGet, "http://fake-addr", nil) // mock roundTripper calls @@ -71,16 +57,8 @@ func TestMetricsContentLengthUnknown(t *testing.T) { // assert recorder calls recorderMock.On("AddInflightRequests", req.Context(), req.URL.String(), 1).Once() recorderMock.On("AddInflightRequests", req.Context(), req.URL.String(), -1).Once() - recorderMock.On("ObserveHTTPRequestDuration", req.Context(), req.URL.String(), requestTimeDuration, http.MethodGet, "2xx") + recorderMock.On("ObserveHTTPRequestDuration", req.Context(), req.URL.String(), mock.AnythingOfType("time.Duration"), http.MethodGet, "2xx") recorderMock.On("ObserveHTTPResponseSize", req.Context(), req.URL.String(), expectedContentLength, http.MethodGet, "2xx") - // mock time.Now method in order to return always the same time whenever the test is launched - patch := gomonkey.NewPatches() - patch.ApplyFunc(time.Now, func() time.Time { return baseTime }) - patch.ApplyFunc(time.Since, func(since time.Time) time.Duration { - assert.Equal(t, baseTime, since) - return requestTimeDuration - }) - defer patch.Reset() // create metrics httpClient middleware stack := httpware.TripperwareStack( diff --git a/tripperware/request_listener.go b/tripperware/request_listener.go index 513fed0..7d1e13c 100644 --- a/tripperware/request_listener.go +++ b/tripperware/request_listener.go @@ -1,6 +1,7 @@ package tripperware import ( + "github.com/gol4ng/httpware/v4/request_listener" "net/http" "github.com/gol4ng/httpware/v4" @@ -16,3 +17,12 @@ func RequestListener(listeners ...func(*http.Request)) httpware.Tripperware { }) } } + +func CurlLogDumper() httpware.Tripperware { + return func(next http.RoundTripper) http.RoundTripper { + return httpware.RoundTripFunc(func(request *http.Request) (*http.Response, error) { + request_listener.CurlLogDumper(request) + return next.RoundTrip(request) + }) + } +} diff --git a/tripperware_test.go b/tripperware_test.go index f588078..8a2469d 100644 --- a/tripperware_test.go +++ b/tripperware_test.go @@ -14,7 +14,7 @@ import ( ) func getTripper(t *testing.T, i *int, iBefore int, iAfter int) httpware.Tripperware { - return httpware.Tripperware(func(roundTripper http.RoundTripper) http.RoundTripper { + return func(roundTripper http.RoundTripper) http.RoundTripper { return httpware.RoundTripFunc(func(req *http.Request) (resp *http.Response, err error) { defer func() { assert.Equal(t, iAfter, *i) @@ -24,7 +24,7 @@ func getTripper(t *testing.T, i *int, iBefore int, iAfter int) httpware.Tripperw *i++ return roundTripper.RoundTrip(req) }) - }) + } } func getTripperShouldNotBeCalled(t *testing.T) httpware.Tripperware { @@ -44,6 +44,9 @@ func TestTripperware_RoundTrip(t *testing.T) { roundTripperMock.On("RoundTrip", req).Return(resp, nil) originalDefaultTransport := http.DefaultTransport + defer func() { + http.DefaultTransport = originalDefaultTransport + }() http.DefaultTransport = roundTripperMock tripper := httpware.Tripperware(func(roundTripper http.RoundTripper) http.RoundTripper { @@ -54,8 +57,6 @@ func TestTripperware_RoundTrip(t *testing.T) { r, err := tripper.RoundTrip(req) assert.Nil(t, err) assert.Equal(t, r, resp) - - http.DefaultTransport = originalDefaultTransport } func TestTripperware_DecorateClient(t *testing.T) { @@ -464,7 +465,7 @@ func TestTripperwares_PrependIf(t *testing.T) { // =============================== use those examples when declaring an http CLIENT ==================================== // ===================================================================================================================== -func ExampleTripperwareStack_WithDefaultTransport() { +func ExampleTripperwareStack_withDefaultTransport() { // create a tripperware that adds a custom header on each http-client request addCustomRequestHeader := func(t http.RoundTripper) http.RoundTripper { return httpware.RoundTripFunc(func(req *http.Request) (*http.Response, error) { @@ -498,7 +499,7 @@ func ExampleTripperwareStack_WithDefaultTransport() { //http request headers : map[Custom-Header:[wonderful header value]] } -func ExampleTripperwareStack_WithCustomTransport() { +func ExampleTripperwareStack_withCustomTransport() { // create a tripperware that adds a custom header on each http-client request addCustomRequestHeader := func(t http.RoundTripper) http.RoundTripper { return httpware.RoundTripFunc(func(req *http.Request) (*http.Response, error) { From 6115d9f3b84d0d008a7705daa7f8d8ebccfd56ba Mon Sep 17 00:00:00 2001 From: Anthony MOUTTE Date: Tue, 13 May 2025 10:15:09 +0200 Subject: [PATCH 2/2] migrate github workflow --- .github/workflows/test.yml | 46 ++++++++++++++++++++++ .gitignore | 1 + .travis.yml | 19 --------- auth/http_test.go | 8 ++-- correlation_id/generator.go | 2 +- go.mod | 23 +++++++---- go.sum | 65 +++++++------------------------ interceptor/copy_read_closer.go | 6 ++- middleware/correlation_id_test.go | 2 +- middleware/metrics.go | 2 +- rate_limit/token_bucket_test.go | 4 +- request_listener/curl.go | 20 ++++++---- tripperware/enable_test.go | 2 +- tripperware/metrics.go | 2 +- tripperware/rate_limit.go | 1 - 15 files changed, 104 insertions(+), 99 deletions(-) create mode 100644 .github/workflows/test.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..1d75b6c --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,46 @@ +name: Go CI + +on: + push: + branches: + - main + pull_request: + branches: + - "**" +permissions: + actions: write + contents: read + id-token: write + +jobs: + test: + strategy: + matrix: + go-version: ["1.20", "1.23", "1.24"] + os: [ubuntu-latest] + fail-fast: false + + runs-on: ${{ matrix.os }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Go ${{ matrix.go }} + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + cache: true + + - name: Verify Go version + run: go version + + - name: Install dependencies + run: go mod tidy + + - name: Run Tests + run: go test -race -coverprofile="coverage.out" -v ./... + + - uses: qltysh/qlty-action/coverage@v1 + with: + oidc: true + files: coverage.out diff --git a/.gitignore b/.gitignore index 9b60f02..083b046 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +coverage vendor diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fd7732b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go - -cache: - directories: - - $GOPATH/pkg/mod - -go: - - master - -before_script: - - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - - chmod +x ./cc-test-reporter - - ./cc-test-reporter before-build - -script: - - go test --race -coverprofile c.out ./... - -after_script: - - CC_TEST_REPORTER_ID=$CC_TEST_REPORTER_ID ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT diff --git a/auth/http_test.go b/auth/http_test.go index 570cef6..762ad40 100644 --- a/auth/http_test.go +++ b/auth/http_test.go @@ -21,20 +21,20 @@ func TestFromHeader(t *testing.T) { { request: &http.Request{Header: http.Header{ "Authorization": []string{"foo"}, - },}, + }}, expectedCredential: "foo", }, { request: &http.Request{Header: http.Header{ "X-Authorization": []string{"foo"}, - },}, + }}, expectedCredential: "foo", }, { request: &http.Request{Header: http.Header{ - "Authorization": []string{"foo"}, + "Authorization": []string{"foo"}, "X-Authorization": []string{"bar"}, - },}, + }}, expectedCredential: "foo", }, } diff --git a/correlation_id/generator.go b/correlation_id/generator.go index 2eadc65..ecc9b80 100644 --- a/correlation_id/generator.go +++ b/correlation_id/generator.go @@ -6,7 +6,7 @@ import ( "unsafe" ) -//https://stackoverflow.com/a/31832326 +// https://stackoverflow.com/a/31832326 const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" const ( letterIdxBits = 6 // 6 bits to represent a letter index diff --git a/go.mod b/go.mod index 1d97708..0a744dc 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,25 @@ module github.com/gol4ng/httpware/v4 -go 1.10 +go 1.20 require ( - github.com/felixge/httpsnoop v1.0.3 + github.com/felixge/httpsnoop v1.0.4 github.com/prometheus/client_golang v1.14.0 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.10.0 ) require ( - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/prometheus/common v0.41.0 // indirect - github.com/prometheus/procfs v0.9.0 // indirect - golang.org/x/sys v0.6.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/client_model v0.3.0 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index c0dceb3..8468681 100644 --- a/go.sum +++ b/go.sum @@ -19,7 +19,6 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -34,22 +33,19 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -62,8 +58,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -71,7 +67,6 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -117,9 +112,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -149,15 +142,13 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -187,38 +178,31 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= -github.com/prometheus/common v0.41.0 h1:npo01n6vUlRViIj5fgwiK8vlNIh8bnoxqh3gypKsyAw= -github.com/prometheus/common v0.41.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -230,7 +214,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -261,7 +244,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -290,13 +272,9 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -304,7 +282,6 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -314,9 +291,6 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -355,15 +329,10 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -371,7 +340,6 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -415,7 +383,6 @@ golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -442,7 +409,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -496,15 +462,13 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -512,7 +476,6 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/interceptor/copy_read_closer.go b/interceptor/copy_read_closer.go index d6abbfb..ef36c0c 100644 --- a/interceptor/copy_read_closer.go +++ b/interceptor/copy_read_closer.go @@ -37,8 +37,10 @@ type copyReadCloser struct { } // First read with io.TeeReader -// -> copyBuffered -// / +// +// -> copyBuffered +// / +// // src --> output // Second read after EOF // copyBuffered --> copy BufReader simple buffer with fix size diff --git a/middleware/correlation_id_test.go b/middleware/correlation_id_test.go index a0d8176..2596bc1 100644 --- a/middleware/correlation_id_test.go +++ b/middleware/correlation_id_test.go @@ -72,7 +72,7 @@ func ExampleCorrelationId() { } }() - resp, err := http.Get("http://"+ln.Addr().String()) + resp, err := http.Get("http://" + ln.Addr().String()) if err != nil { fmt.Println(err) } else if resp != nil { diff --git a/middleware/metrics.go b/middleware/metrics.go index ca3dca0..43956da 100644 --- a/middleware/metrics.go +++ b/middleware/metrics.go @@ -10,7 +10,7 @@ import ( "github.com/gol4ng/httpware/v4/metrics" ) -func Metrics(recorder metrics.Recorder, options ... metrics.Option) httpware.Middleware { +func Metrics(recorder metrics.Recorder, options ...metrics.Option) httpware.Middleware { config := metrics.NewConfig(recorder, options...) return func(next http.Handler) http.Handler { return http.HandlerFunc(func(writer http.ResponseWriter, req *http.Request) { diff --git a/rate_limit/token_bucket_test.go b/rate_limit/token_bucket_test.go index 881a0dc..152a4f3 100644 --- a/rate_limit/token_bucket_test.go +++ b/rate_limit/token_bucket_test.go @@ -9,7 +9,7 @@ import ( ) func TestTokenBucket_Allow(t *testing.T) { - limiter := rate_limit.NewTokenBucket(1 * time.Millisecond, 1) + limiter := rate_limit.NewTokenBucket(1*time.Second, 1) defer limiter.Stop() assert.NoError(t, limiter.Allow(nil)) @@ -18,6 +18,6 @@ func TestTokenBucket_Allow(t *testing.T) { assert.EqualError(t, limiter.Allow(nil), "request limit reached") limiter.Inc(nil) - time.Sleep(2 * time.Millisecond) + time.Sleep(2 * time.Second) assert.NoError(t, limiter.Allow(nil)) } diff --git a/request_listener/curl.go b/request_listener/curl.go index affe6cf..42c0850 100644 --- a/request_listener/curl.go +++ b/request_listener/curl.go @@ -15,18 +15,22 @@ import ( // Following example will log curl command if request has header "dump" not empty // Eg tripperware: // tripperware.Skip( -// func(request *http.Request) bool { -// return request.Header.Get("dump") != "" -// }, -// tripperware.RequestListener(request_listener.CurlLogDumper), +// +// func(request *http.Request) bool { +// return request.Header.Get("dump") != "" +// }, +// tripperware.RequestListener(request_listener.CurlLogDumper), +// // ) // // Eg middleware: // middleware.Skip( -// func(request *http.Request) bool { -// return request.Header.Get("dump") != "" -// }, -// middleware.RequestListener(request_listener.CurlLogDumper), +// +// func(request *http.Request) bool { +// return request.Header.Get("dump") != "" +// }, +// middleware.RequestListener(request_listener.CurlLogDumper), +// // ) func CurlLogDumper(request *http.Request) { if request == nil { diff --git a/tripperware/enable_test.go b/tripperware/enable_test.go index 24eb6ec..5acc446 100644 --- a/tripperware/enable_test.go +++ b/tripperware/enable_test.go @@ -49,7 +49,7 @@ func TestEnable(t *testing.T) { for k, test := range tests { executed = false t.Run(fmt.Sprintf("test %d (%v)", k, test), func(t *testing.T) { - resp2, err := tripperware.Enable(test.enable, dummyTripperware, )(roundTripperMock).RoundTrip(req) + resp2, err := tripperware.Enable(test.enable, dummyTripperware)(roundTripperMock).RoundTrip(req) assert.Nil(t, err) assert.Equal(t, resp, resp2) diff --git a/tripperware/metrics.go b/tripperware/metrics.go index c5df2fc..62c2319 100644 --- a/tripperware/metrics.go +++ b/tripperware/metrics.go @@ -10,7 +10,7 @@ import ( "github.com/gol4ng/httpware/v4/metrics" ) -func Metrics(recorder metrics.Recorder, options ... metrics.Option) httpware.Tripperware { +func Metrics(recorder metrics.Recorder, options ...metrics.Option) httpware.Tripperware { config := metrics.NewConfig(recorder, options...) return func(next http.RoundTripper) http.RoundTripper { return httpware.RoundTripFunc(func(req *http.Request) (resp *http.Response, err error) { diff --git a/tripperware/rate_limit.go b/tripperware/rate_limit.go index dd24114..267f15e 100644 --- a/tripperware/rate_limit.go +++ b/tripperware/rate_limit.go @@ -25,7 +25,6 @@ func RateLimit(rateLimiter rate_limit.RateLimiter, options ...RateLimitOption) h } } - type RateLimitErrorCallback func(request *http.Request, limitErr error) (response *http.Response, err error) type RateLimitOption func(*RateLimitConfig)