From 577a55d44d0ec337178680ec1ad6f0862a0c2482 Mon Sep 17 00:00:00 2001 From: Hank Donnay Date: Fri, 6 Jan 2023 14:10:23 -0600 Subject: [PATCH] all: use httputil to construct requests Signed-off-by: Hank Donnay --- cmd/clairctl/import.go | 2 +- cmd/clairctl/manifest.go | 3 ++- health/readinesshandler_test.go | 5 +++- httptransport/concurrentlimit_test.go | 6 +++-- httptransport/indexer_v1_test.go | 17 ++++++------ httptransport/matcher_v1_test.go | 39 ++++++++++++++------------- httptransport/notification_v1_test.go | 21 ++++++++------- middleware/auth/httpauth_psk_test.go | 5 +++- 8 files changed, 56 insertions(+), 42 deletions(-) diff --git a/cmd/clairctl/import.go b/cmd/clairctl/import.go index 28bda77279..56b4ba1958 100644 --- a/cmd/clairctl/import.go +++ b/cmd/clairctl/import.go @@ -123,7 +123,7 @@ func openInput(ctx context.Context, c *http.Client, n string) (io.ReadCloser, er } u, uerr := url.Parse(n) if uerr == nil { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) if err != nil { return nil, err } diff --git a/cmd/clairctl/manifest.go b/cmd/clairctl/manifest.go index 61d2903576..ce9ceedbf1 100644 --- a/cmd/clairctl/manifest.go +++ b/cmd/clairctl/manifest.go @@ -17,6 +17,7 @@ import ( "golang.org/x/sync/errgroup" "github.com/quay/clair/v4/internal/codec" + "github.com/quay/clair/v4/internal/httputil" ) var ManifestCmd = &cli.Command{ @@ -136,7 +137,7 @@ func Inspect(ctx context.Context, r string) (*claircore.Manifest, error) { if err != nil { return nil, err } - req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) if err != nil { return nil, err } diff --git a/health/readinesshandler_test.go b/health/readinesshandler_test.go index c1bf6491a8..74d531205f 100644 --- a/health/readinesshandler_test.go +++ b/health/readinesshandler_test.go @@ -1,18 +1,21 @@ package health_test import ( + "context" "net/http" "net/http/httptest" "testing" "github.com/quay/clair/v4/health" + "github.com/quay/clair/v4/internal/httputil" ) func TestReadinessHandler(t *testing.T) { + ctx := context.Background() server := httptest.NewServer(health.ReadinessHandler()) client := server.Client() - req, err := http.NewRequest("GET", server.URL, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, server.URL, nil) if err != nil { t.Fatalf("failed to create request: %v", err) } diff --git a/httptransport/concurrentlimit_test.go b/httptransport/concurrentlimit_test.go index a6a8c77159..e3ef520943 100644 --- a/httptransport/concurrentlimit_test.go +++ b/httptransport/concurrentlimit_test.go @@ -11,6 +11,8 @@ import ( "github.com/quay/zlog" "golang.org/x/sync/semaphore" + + "github.com/quay/clair/v4/internal/httputil" ) func TestConcurrentRequests(t *testing.T) { @@ -39,7 +41,7 @@ func TestConcurrentRequests(t *testing.T) { c := srv.Client() done := make(chan struct{}) - req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL, nil) if err != nil { t.Fatal(err) } @@ -60,7 +62,7 @@ func TestConcurrentRequests(t *testing.T) { // Wait for the above goroutine to hit the handler. <-ready for i := 0; i < 10; i++ { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL, nil) if err != nil { t.Errorf("%d: %v", i, err) } diff --git a/httptransport/indexer_v1_test.go b/httptransport/indexer_v1_test.go index 93b6d47a2e..1f147659e6 100644 --- a/httptransport/indexer_v1_test.go +++ b/httptransport/indexer_v1_test.go @@ -18,6 +18,7 @@ import ( "go.opentelemetry.io/otel/trace" "github.com/quay/clair/v4/indexer" + "github.com/quay/clair/v4/internal/httputil" ) func TestIndexReportBadLayer(t *testing.T) { @@ -46,7 +47,7 @@ func TestIndexReportBadLayer(t *testing.T) { t.Run("POST", func(t *testing.T) { const body = `{"hash":"sha256:0000000000000000000000000000000000000000000000000000000000000000",` + `"layers":[{}]}` - req, err := http.NewRequestWithContext(ctx, http.MethodPost, srv.URL+path, strings.NewReader(body)) + req, err := httputil.NewRequestWithContext(ctx, http.MethodPost, srv.URL+path, strings.NewReader(body)) if err != nil { t.Fatal(err) } @@ -107,7 +108,7 @@ func TestIndexerV1(t *testing.T) { ctx := zlog.Test(ctx, t) const path = `/index_state` t.Run("GET", func(t *testing.T) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path, nil) if err != nil { t.Fatal(err) } @@ -128,7 +129,7 @@ func TestIndexerV1(t *testing.T) { t.Run("POST", func(t *testing.T) { const body = `{"hash":"sha256:0000000000000000000000000000000000000000000000000000000000000000",` + `"layers":[{}]}` - req, err := http.NewRequestWithContext(ctx, http.MethodPost, srv.URL+path, strings.NewReader(body)) + req, err := httputil.NewRequestWithContext(ctx, http.MethodPost, srv.URL+path, strings.NewReader(body)) if err != nil { t.Fatal(err) } @@ -144,7 +145,7 @@ func TestIndexerV1(t *testing.T) { }) t.Run("DELETE", func(t *testing.T) { const body = `["sha256:0000000000000000000000000000000000000000000000000000000000000000"]` - req, err := http.NewRequestWithContext(ctx, http.MethodDelete, srv.URL+path, strings.NewReader(body)) + req, err := httputil.NewRequestWithContext(ctx, http.MethodDelete, srv.URL+path, strings.NewReader(body)) if err != nil { t.Fatal(err) } @@ -168,7 +169,7 @@ func TestIndexerV1(t *testing.T) { } }) t.Run("GET", func(t *testing.T) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path, nil) if err != nil { t.Fatal(err) } @@ -187,7 +188,7 @@ func TestIndexerV1(t *testing.T) { ctx := zlog.Test(ctx, t) const path = `/index_report/sha256:0000000000000000000000000000000000000000000000000000000000000000` t.Run("DELETE", func(t *testing.T) { - req, err := http.NewRequestWithContext(ctx, http.MethodDelete, srv.URL+path, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodDelete, srv.URL+path, nil) if err != nil { t.Fatal(err) } @@ -202,7 +203,7 @@ func TestIndexerV1(t *testing.T) { } }) t.Run("GET", func(t *testing.T) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path, nil) if err != nil { t.Fatal(err) } @@ -222,7 +223,7 @@ func TestIndexerV1(t *testing.T) { const path = `/internal/affected_manifest/` t.Run("POST", func(t *testing.T) { const body = `{"vulnerabilities":[]}` - req, err := http.NewRequestWithContext(ctx, http.MethodPost, srv.URL+path, strings.NewReader(body)) + req, err := httputil.NewRequestWithContext(ctx, http.MethodPost, srv.URL+path, strings.NewReader(body)) if err != nil { t.Fatal(err) } diff --git a/httptransport/matcher_v1_test.go b/httptransport/matcher_v1_test.go index 54ad1ded93..6e4ac76f83 100644 --- a/httptransport/matcher_v1_test.go +++ b/httptransport/matcher_v1_test.go @@ -14,6 +14,7 @@ import ( "github.com/google/uuid" "github.com/quay/clair/v4/indexer" + "github.com/quay/clair/v4/internal/httputil" "github.com/quay/clair/v4/matcher" "github.com/quay/claircore/libvuln/driver" "github.com/quay/zlog" @@ -66,12 +67,12 @@ func testUpdateDiffMatcher(t *testing.T) { q := url.Query() q.Set("cur", "892737b2-a616-4113-a7a9-137139c8f91e") url.RawQuery = q.Encode() + t.Log(url) - req := &http.Request{ - URL: url, - Method: http.MethodGet, + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, url.String(), nil) + if err != nil { + t.Fatalf("failed to construct request: %v", err) } - t.Log(url) resp, err := srvOK.Client().Do(req) if err != nil { t.Fatalf("failed to do request: %v", err) @@ -96,10 +97,11 @@ func testUpdateDiffMatcher(t *testing.T) { q = url.Query() q.Set("cur", "892737b2-a616-4113-a7a9-137139c8f91e") url.RawQuery = q.Encode() + t.Log(url) - req = &http.Request{ - URL: url, - Method: http.MethodGet, + req, err = httputil.NewRequestWithContext(ctx, http.MethodGet, url.String(), nil) + if err != nil { + t.Fatalf("failed to construct request: %v", err) } resp, err = srvErr.Client().Do(req) if err != nil { @@ -174,9 +176,9 @@ func testUpdateDiffHandlerParams(t *testing.T) { q.Set("prev", test.cur) u.RawQuery = q.Encode() - req := &http.Request{ - URL: u, - Method: http.MethodGet, + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + t.Fatalf("failed to construct request: %v", err) } resp, err := c.Do(req) if err != nil { @@ -224,7 +226,7 @@ func testUpdateDiffHandlerMethods(t *testing.T) { http.MethodPut, http.MethodTrace, } { - req, err := http.NewRequest(m, u.String(), nil) + req, err := httputil.NewRequestWithContext(ctx, m, u.String(), nil) if err != nil { t.Fatalf("failed to create request: %v", err) } @@ -275,7 +277,7 @@ func testUpdateOperationHandlerErrors(t *testing.T) { c := srv.Client() // perform get with failing differ - req, err := http.NewRequest(http.MethodGet, srv.URL+path.Join("/", "internal", "update_operation"), nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path.Join("/", "internal", "update_operation"), nil) if err != nil { t.Fatalf("failed to create request: %v", err) } @@ -289,7 +291,7 @@ func testUpdateOperationHandlerErrors(t *testing.T) { // perform delete with failing differ u := srv.URL + path.Join("/", "internal", "update_operation") + "/" + id - req, err = http.NewRequest(http.MethodDelete, u, nil) + req, err = httputil.NewRequestWithContext(ctx, http.MethodDelete, u, nil) if err != nil { t.Fatalf("failed to create request: %v", err) } @@ -324,7 +326,7 @@ func testUpdateOperationHandlerMethods(t *testing.T) { http.MethodPut, http.MethodTrace, } { - req, err := http.NewRequest(m, srv.URL+path.Join("/", "internal", "update_operation"), nil) + req, err := httputil.NewRequestWithContext(ctx, m, srv.URL+path.Join("/", "internal", "update_operation"), nil) if err != nil { t.Fatalf("failed to create request: %v", err) } @@ -370,7 +372,7 @@ func testUpdateOperationHandlerGet(t *testing.T) { c := srv.Client() // get without latest param - req, err := http.NewRequest(http.MethodGet, srv.URL+path.Join("/", "internal", "update_operation"), nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL+path.Join("/", "internal", "update_operation"), nil) if err != nil { t.Fatalf("failed to create request: %v", err) } @@ -395,9 +397,10 @@ func testUpdateOperationHandlerGet(t *testing.T) { q := u.Query() q.Add("latest", "true") u.RawQuery = q.Encode() - req = &http.Request{ - URL: u, - Method: http.MethodGet, + + req, err = httputil.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + t.Fatalf("failed to create request: %v", err) } resp, err = c.Do(req) if err != nil { diff --git a/httptransport/notification_v1_test.go b/httptransport/notification_v1_test.go index b81739aa89..0aa8a560a6 100644 --- a/httptransport/notification_v1_test.go +++ b/httptransport/notification_v1_test.go @@ -15,6 +15,7 @@ import ( "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel/trace" + "github.com/quay/clair/v4/internal/httputil" "github.com/quay/clair/v4/notifier" "github.com/quay/clair/v4/notifier/service" ) @@ -53,9 +54,9 @@ func testNotificationHandlerDelete(ctx context.Context) func(*testing.T) { } rr := httptest.NewRecorder() u, _ := url.Parse("http://clair-notifier/notifier/api/v1/notification/" + noteID.String()) - req := &http.Request{ - URL: u, - Method: http.MethodGet, + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + t.Error(err) } h.delete(rr, req) @@ -104,9 +105,9 @@ func testNotificationHandlerGet(ctx context.Context) func(*testing.T) { } rr := httptest.NewRecorder() u, _ := url.Parse("http://clair-notifier/notifier/api/v1/notification/" + noteID.String()) - req := &http.Request{ - URL: u, - Method: http.MethodGet, + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + t.Error(err) } h.get(rr, req) @@ -171,9 +172,9 @@ func testNotificationHandlerGetParams(ctx context.Context) func(*testing.T) { v.Set("page_size", pageSizeParam) v.Set("page", pageParam) u.RawQuery = v.Encode() - req := &http.Request{ - URL: u, - Method: http.MethodGet, + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil) + if err != nil { + t.Error(err) } h.get(rr, req) @@ -215,7 +216,7 @@ func testNotificationsHandlerMethods(ctx context.Context) func(*testing.T) { http.MethodPut, http.MethodTrace, } { - req, err := http.NewRequest(m, u, nil) + req, err := httputil.NewRequestWithContext(ctx, m, u, nil) if err != nil { t.Fatalf("failed to create request: %v", err) } diff --git a/middleware/auth/httpauth_psk_test.go b/middleware/auth/httpauth_psk_test.go index 44a5f42414..5dfe5b6b38 100644 --- a/middleware/auth/httpauth_psk_test.go +++ b/middleware/auth/httpauth_psk_test.go @@ -2,6 +2,7 @@ package auth import ( "bytes" + "context" "encoding/base64" "fmt" "math/rand" @@ -13,6 +14,7 @@ import ( "testing/quick" "time" + "github.com/quay/clair/v4/internal/httputil" "gopkg.in/square/go-jose.v2" "gopkg.in/square/go-jose.v2/jwt" ) @@ -88,6 +90,7 @@ func (tc *pskTestcase) Handler(t *testing.T) http.Handler { // Roundtrips returns a function suitable for passing to quick.Check. func roundtrips(t *testing.T) func(*pskTestcase) bool { return func(tc *pskTestcase) bool { + ctx := context.Background() t.Log(tc) // Set up the jwt signer. sk := jose.SigningKey{ @@ -122,7 +125,7 @@ func roundtrips(t *testing.T) func(*pskTestcase) bool { defer srv.Close() // Mint a request. - req, err := http.NewRequest(http.MethodGet, srv.URL, nil) + req, err := httputil.NewRequestWithContext(ctx, http.MethodGet, srv.URL, nil) if err != nil { t.Error(err) return false