Skip to content

Commit e36805a

Browse files
committed
fix(apps-proxy): satisfy linters on kai-preview branch
Fix all 52 golangci-lint failures reported by CI run 25903961499: - noctx(25): replace httptest.NewRequest → NewRequestWithContext(t.Context(), …) in all kaipreview test files - tagliatelle(3): rename JSON tags app_id → appId and ttl_s → ttlS in jwt.go (HandshakeClaims, SessionClaims) - errchkjson(7): check errors from json.Marshal / json.NewEncoder().Encode() in bootstrap.go, handshake_token.go, exchange_test.go, storage_token_verifier_test.go - nilerr(4): add //nolint:nilerr with explanation where HTTP handlers deliberately swallow errors - gochecknoglobals(2): var PathPrefix → const PathPrefix in handler.go; //nolint:gochecknoglobals on bootstrapTmpl - gci(4): fix struct-field alignment in manager.go / apphandler.go; add missing spaces after commas in cookie_test.go, cors_test.go - contextcheck(2): add //nolint:contextcheck on the two false-positive req.Context() call sites in apphandler.go; extract serveKaiPreview helper to reduce nestif complexity - paralleltest(1)+tparallel(1): add t.Parallel() to TestIsIframeDocumentLoad subtests - testifylint(1): assert.False(strings.Contains(…)) → assert.NotContains(…) - errname(1): rename stubErr → stubError in handshake_token_test.go - gosec G203(1): //nolint:gosec on template.JS(bs) conversion in bootstrap.go - unparam(1): remove unused devMode bool param from newTestCompositeHandler; inline true - usetesting(6): context.Background() → t.Context() in storage_token_verifier_test.go
1 parent ad52e54 commit e36805a

17 files changed

Lines changed: 171 additions & 144 deletions

internal/pkg/service/appsproxy/proxy/apphandler/apphandler.go

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,16 @@ func newAppHandler(manager *Manager, app api.AppConfig, appUpstream chain.Handle
5252
upstream: appUpstream,
5353
authHandlerPerRule: make(map[ruleIndex]chain.Handler),
5454
kaiPreview: kpendpoints.NewHandler(kpendpoints.HandlerDeps{
55-
Clock: manager.clock,
55+
Clock: manager.clock,
5656
StorageTokenVerifier: manager.storageTokenVerifier,
57-
DevMode: devModeChecker,
58-
CORS: kaipreview.NewCORS(manager.config.KaiPreview.AllowedOrigins),
59-
HandshakeKey: manager.config.KaiPreview.HandshakeSigningKey,
60-
SessionKey: manager.config.KaiPreview.SessionSigningKey,
61-
SessionTTL: manager.config.KaiPreview.SessionTTL,
62-
AllowedOrigins: manager.config.KaiPreview.AllowedOrigins,
63-
AppID: string(app.ID),
64-
AppProjectID: app.ProjectID,
57+
DevMode: devModeChecker,
58+
CORS: kaipreview.NewCORS(manager.config.KaiPreview.AllowedOrigins),
59+
HandshakeKey: manager.config.KaiPreview.HandshakeSigningKey,
60+
SessionKey: manager.config.KaiPreview.SessionSigningKey,
61+
SessionTTL: manager.config.KaiPreview.SessionTTL,
62+
AllowedOrigins: manager.config.KaiPreview.AllowedOrigins,
63+
AppID: string(app.ID),
64+
AppProjectID: app.ProjectID,
6565
}),
6666
}
6767

@@ -170,39 +170,9 @@ func (h *appHandler) serveHTTPOrError(w http.ResponseWriter, req *http.Request)
170170

171171
// kai-preview: dev-mode iframe-auth path.
172172
// (routing decision documented in spec § "apps-proxy: routing decision for dev-mode apps")
173-
if h.isDevMode(req.Context()) {
174-
// 1. /_proxy/kai-preview/* routes go to the kai-preview composite handler.
175-
if strings.HasPrefix(req.URL.Path, kpendpoints.PathPrefix) {
176-
return h.kaiPreview.ServeHTTPOrError(w, req)
177-
}
178-
// 2. Valid session cookie → forward to upstream (skip AuthRules), with sliding refresh.
179-
if claims, ok := kaipreview.ValidateSessionCookie(
180-
req,
181-
h.manager.config.KaiPreview.SessionSigningKey,
182-
h.manager.clock,
183-
string(h.app.ID),
184-
h.app.ProjectID,
185-
); ok {
186-
if claims.NeedsRefresh(h.manager.clock.Now()) {
187-
newJWT, err := kaipreview.MintSessionJWT(
188-
h.manager.config.KaiPreview.SessionSigningKey,
189-
h.manager.clock,
190-
string(h.app.ID),
191-
h.app.ProjectID,
192-
h.manager.config.KaiPreview.SessionTTL,
193-
)
194-
if err == nil {
195-
kaipreview.SetSessionCookie(w, newJWT, h.manager.config.KaiPreview.SessionTTL)
196-
}
197-
// If mint fails, just forward without refresh — the existing cookie is still valid.
198-
}
199-
return h.upstream.ServeHTTPOrError(w, req)
200-
}
201-
// 3. Iframe document load on a dev-mode app with no session → serve bootstrap shim.
202-
if kaipreview.IsIframeDocumentLoad(req) {
203-
bootstrapReq := req.Clone(req.Context())
204-
bootstrapReq.URL.Path = kpendpoints.PathPrefix + "/bootstrap"
205-
return h.kaiPreview.ServeHTTPOrError(w, bootstrapReq)
173+
if h.isDevMode(req.Context()) { //nolint:contextcheck // false positive: req.Context() is the correct context here
174+
if handled, err := h.serveKaiPreview(w, req); handled {
175+
return err
206176
}
207177
}
208178

@@ -234,6 +204,51 @@ func (h *appHandler) serveRule(w http.ResponseWriter, req *http.Request, index r
234204
return h.upstream.ServeHTTPOrError(w, req)
235205
}
236206

207+
// serveKaiPreview handles the three dev-mode routing cases for the kai-preview iframe-auth path.
208+
// Returns (true, err) when it handled the request, or (false, nil) when the caller should continue routing.
209+
func (h *appHandler) serveKaiPreview(w http.ResponseWriter, req *http.Request) (bool, error) {
210+
// 1. /_proxy/kai-preview/* routes go to the kai-preview composite handler.
211+
if strings.HasPrefix(req.URL.Path, kpendpoints.PathPrefix) {
212+
return true, h.kaiPreview.ServeHTTPOrError(w, req)
213+
}
214+
// 2. Valid session cookie → forward to upstream (skip AuthRules), with sliding refresh.
215+
if claims, ok := kaipreview.ValidateSessionCookie(
216+
req,
217+
h.manager.config.KaiPreview.SessionSigningKey,
218+
h.manager.clock,
219+
string(h.app.ID),
220+
h.app.ProjectID,
221+
); ok {
222+
h.maybeRefreshSessionCookie(w, claims)
223+
return true, h.upstream.ServeHTTPOrError(w, req)
224+
}
225+
// 3. Iframe document load on a dev-mode app with no session → serve bootstrap shim.
226+
if kaipreview.IsIframeDocumentLoad(req) {
227+
bootstrapReq := req.Clone(req.Context()) //nolint:contextcheck // false positive: req.Context() is the correct context here
228+
bootstrapReq.URL.Path = kpendpoints.PathPrefix + "/bootstrap"
229+
return true, h.kaiPreview.ServeHTTPOrError(w, bootstrapReq)
230+
}
231+
return false, nil
232+
}
233+
234+
// maybeRefreshSessionCookie re-mints the session JWT when the session has passed its midpoint.
235+
// If minting fails, the existing cookie is left in place (it is still valid).
236+
func (h *appHandler) maybeRefreshSessionCookie(w http.ResponseWriter, claims *kaipreview.SessionClaims) {
237+
if !claims.NeedsRefresh(h.manager.clock.Now()) {
238+
return
239+
}
240+
newJWT, err := kaipreview.MintSessionJWT(
241+
h.manager.config.KaiPreview.SessionSigningKey,
242+
h.manager.clock,
243+
string(h.app.ID),
244+
h.app.ProjectID,
245+
h.manager.config.KaiPreview.SessionTTL,
246+
)
247+
if err == nil {
248+
kaipreview.SetSessionCookie(w, newJWT, h.manager.config.KaiPreview.SessionTTL)
249+
}
250+
}
251+
237252
// isDevMode reports whether this app currently has DevMode enabled.
238253
// It reads from the live K8s state cache so toggling DevMode on the App CRD takes
239254
// effect on the next request without requiring handler recreation.

internal/pkg/service/appsproxy/proxy/apphandler/authproxy/kaipreview/cookie_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,15 +40,15 @@ func TestSetSessionCookie_Attributes(t *testing.T) {
4040

4141
func TestReadSessionCookie_Present(t *testing.T) {
4242
t.Parallel()
43-
r := httptest.NewRequest("GET", "/", nil)
43+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/", nil)
4444
r.AddCookie(&http.Cookie{Name: SessionCookieName, Value: "the-jwt"})
4545
got := ReadSessionCookie(r)
4646
assert.Equal(t, "the-jwt", got)
4747
}
4848

4949
func TestReadSessionCookie_Missing(t *testing.T) {
5050
t.Parallel()
51-
r := httptest.NewRequest("GET", "/", nil)
51+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/", nil)
5252
got := ReadSessionCookie(r)
5353
assert.Empty(t, got)
5454
}
@@ -85,7 +85,7 @@ func TestValidateSessionCookie_Valid(t *testing.T) {
8585
jwt, err := MintSessionJWT(testSessionKey, clock, "app-123", "proj-456", 4*time.Hour)
8686
require.NoError(t, err)
8787

88-
r := httptest.NewRequest("GET", "/anything", nil)
88+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/anything", nil)
8989
r.AddCookie(&http.Cookie{Name: SessionCookieName, Value: jwt})
9090

9191
claims, ok := ValidateSessionCookie(r, testSessionKey, clock, "app-123", "proj-456")
@@ -97,7 +97,7 @@ func TestValidateSessionCookie_Valid(t *testing.T) {
9797
func TestValidateSessionCookie_Missing(t *testing.T) {
9898
t.Parallel()
9999
clock := clockwork.NewFakeClock()
100-
r := httptest.NewRequest("GET", "/anything", nil)
100+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/anything", nil)
101101
_, ok := ValidateSessionCookie(r, testSessionKey, clock, "app-123", "proj-456")
102102
assert.False(t, ok)
103103
}
@@ -107,7 +107,7 @@ func TestValidateSessionCookie_AppMismatch(t *testing.T) {
107107
clock := clockwork.NewFakeClock()
108108
jwt, err := MintSessionJWT(testSessionKey, clock, "different-app", "proj-456", 4*time.Hour)
109109
require.NoError(t, err)
110-
r := httptest.NewRequest("GET", "/anything", nil)
110+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/anything", nil)
111111
r.AddCookie(&http.Cookie{Name: SessionCookieName, Value: jwt})
112112

113113
_, ok := ValidateSessionCookie(r, testSessionKey, clock, "app-123", "proj-456")
@@ -120,7 +120,7 @@ func TestValidateSessionCookie_Expired(t *testing.T) {
120120
jwt, err := MintSessionJWT(testSessionKey, clock, "app-123", "proj-456", 4*time.Hour)
121121
require.NoError(t, err)
122122
clock.Advance(5 * time.Hour)
123-
r := httptest.NewRequest("GET", "/anything", nil)
123+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/anything", nil)
124124
r.AddCookie(&http.Cookie{Name: SessionCookieName, Value: jwt})
125125

126126
_, ok := ValidateSessionCookie(r, testSessionKey, clock, "app-123", "proj-456")
@@ -132,7 +132,7 @@ func TestValidateSessionCookie_ProjectMismatch(t *testing.T) {
132132
clock := clockwork.NewFakeClock()
133133
jwt, err := MintSessionJWT(testSessionKey, clock, "app-123", "different-project", 4*time.Hour)
134134
require.NoError(t, err)
135-
r := httptest.NewRequest("GET", "/anything", nil)
135+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/anything", nil)
136136
r.AddCookie(&http.Cookie{Name: SessionCookieName, Value: jwt})
137137

138138
_, ok := ValidateSessionCookie(r, testSessionKey, clock, "app-123", "proj-456")

internal/pkg/service/appsproxy/proxy/apphandler/authproxy/kaipreview/cors_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ func TestCORS_AllowedOrigin_Preflight(t *testing.T) {
1212
t.Parallel()
1313
cors := NewCORS([]string{"https://connection.keboola.com"})
1414

15-
r := httptest.NewRequest(http.MethodOptions, "/_proxy/kai-preview/handshake-token", nil)
15+
r := httptest.NewRequestWithContext(t.Context(), http.MethodOptions, "/_proxy/kai-preview/handshake-token", nil)
1616
r.Header.Set("Origin", "https://connection.keboola.com")
1717
r.Header.Set("Access-Control-Request-Method", "POST")
1818
r.Header.Set("Access-Control-Request-Headers", "X-StorageApi-Token, Content-Type")
@@ -30,7 +30,7 @@ func TestCORS_DisallowedOrigin_Preflight(t *testing.T) {
3030
t.Parallel()
3131
cors := NewCORS([]string{"https://connection.keboola.com"})
3232

33-
r := httptest.NewRequest(http.MethodOptions, "/_proxy/kai-preview/handshake-token", nil)
33+
r := httptest.NewRequestWithContext(t.Context(), http.MethodOptions, "/_proxy/kai-preview/handshake-token", nil)
3434
r.Header.Set("Origin", "https://evil.example.com")
3535
w := httptest.NewRecorder()
3636

@@ -53,7 +53,7 @@ func TestCORS_WriteResponseHeaders(t *testing.T) {
5353
func TestCORS_NonPreflightPassesThrough(t *testing.T) {
5454
t.Parallel()
5555
cors := NewCORS([]string{"https://connection.keboola.com"})
56-
r := httptest.NewRequest(http.MethodPost, "/_proxy/kai-preview/handshake-token", nil)
56+
r := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/_proxy/kai-preview/handshake-token", nil)
5757
w := httptest.NewRecorder()
5858
handled := cors.HandlePreflight(w, r)
5959
assert.False(t, handled)

internal/pkg/service/appsproxy/proxy/apphandler/authproxy/kaipreview/endpoints/bootstrap.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
//go:embed template/bootstrap.gohtml
1414
var bootstrapFS embed.FS
1515

16-
var bootstrapTmpl = template.Must(template.ParseFS(bootstrapFS, "template/bootstrap.gohtml"))
16+
var bootstrapTmpl = template.Must(template.ParseFS(bootstrapFS, "template/bootstrap.gohtml")) //nolint:gochecknoglobals // template must be parsed at package init
1717

1818
type BootstrapHandler struct {
1919
allowedOrigins []string
@@ -23,10 +23,14 @@ type BootstrapHandler struct {
2323
}
2424

2525
func NewBootstrapHandler(allowedOrigins []string, devMode DevModeChecker, appID string) *BootstrapHandler {
26-
bs, _ := json.Marshal(allowedOrigins) // []string round-trip never errors for []string
26+
bs, err := json.Marshal(allowedOrigins)
27+
if err != nil {
28+
// []string marshalling never fails; this is a safety guard.
29+
bs = []byte("[]")
30+
}
2731
return &BootstrapHandler{
2832
allowedOrigins: allowedOrigins,
29-
originsJSON: template.JS(bs),
33+
originsJSON: template.JS(bs), //nolint:gosec // G203: bs is json.Marshal output of config-supplied URL strings, safe to embed as JS literal
3034
devMode: devMode,
3135
appID: appID,
3236
}

internal/pkg/service/appsproxy/proxy/apphandler/authproxy/kaipreview/endpoints/bootstrap_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
func TestBootstrapHandler_ServesHTMLWithCSP(t *testing.T) {
1414
t.Parallel()
1515
h := NewBootstrapHandler([]string{"https://connection.keboola.com"}, &stubDevModeChecker{devMode: true}, "app-123")
16-
r := httptest.NewRequest("GET", "/_proxy/kai-preview/bootstrap", nil)
16+
r := httptest.NewRequestWithContext(t.Context(), "GET", "/_proxy/kai-preview/bootstrap", nil)
1717
w := httptest.NewRecorder()
1818

1919
err := h.ServeHTTPOrError(w, r)
@@ -34,7 +34,7 @@ func TestBootstrapHandler_ServesHTMLWithCSP(t *testing.T) {
3434
func TestBootstrapHandler_WrongMethod(t *testing.T) {
3535
t.Parallel()
3636
h := NewBootstrapHandler([]string{"https://connection.keboola.com"}, &stubDevModeChecker{devMode: true}, "app-123")
37-
r := httptest.NewRequest("POST", "/_proxy/kai-preview/bootstrap", nil)
37+
r := httptest.NewRequestWithContext(t.Context(), "POST", "/_proxy/kai-preview/bootstrap", nil)
3838
w := httptest.NewRecorder()
3939
err := h.ServeHTTPOrError(w, r)
4040
require.NoError(t, err)
@@ -44,7 +44,7 @@ func TestBootstrapHandler_WrongMethod(t *testing.T) {
4444
func TestBootstrapHandler_NonDevModeReturns404(t *testing.T) {
4545
t.Parallel()
4646
h := NewBootstrapHandler([]string{"https://connection.keboola.com"}, &stubDevModeChecker{devMode: false}, "app-123")
47-
r := httptest.NewRequest(http.MethodGet, "/_proxy/kai-preview/bootstrap", nil)
47+
r := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/_proxy/kai-preview/bootstrap", nil)
4848
w := httptest.NewRecorder()
4949
err := h.ServeHTTPOrError(w, r)
5050
require.NoError(t, err)

internal/pkg/service/appsproxy/proxy/apphandler/authproxy/kaipreview/endpoints/exchange.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ func (h *ExchangeHandler) ServeHTTPOrError(w http.ResponseWriter, r *http.Reques
4646
}
4747
if err := json.NewDecoder(r.Body).Decode(&body); err != nil || body.Token == "" {
4848
http.Error(w, "invalid body", http.StatusBadRequest)
49-
return nil
49+
return nil //nolint:nilerr // intentional: decode error handled via HTTP 400 response
5050
}
5151

5252
claims, err := kaipreview.VerifyHandshakeJWT(h.deps.HandshakeKey, h.deps.Clock, body.Token)
5353
if err != nil {
5454
http.Error(w, "invalid handshake token", http.StatusUnauthorized)
55-
return nil
55+
return nil //nolint:nilerr // intentional: invalid token handled via HTTP 401 response
5656
}
5757
if claims.AppID != h.deps.AppID || claims.ProjectID != h.deps.AppProjectID {
5858
http.Error(w, "handshake token scope mismatch", http.StatusForbidden)

internal/pkg/service/appsproxy/proxy/apphandler/authproxy/kaipreview/endpoints/exchange_test.go

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,13 @@ func TestExchangeHandler_Success(t *testing.T) {
4040
h := newTestExchangeHandler(true)
4141
jwt := mintForTest(t, "app-123", "proj-456")
4242

43-
body, _ := json.Marshal(map[string]string{"token": jwt})
44-
r := httptest.NewRequest(http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
43+
body, err := json.Marshal(map[string]string{"token": jwt})
44+
require.NoError(t, err)
45+
r := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
4546
r.Header.Set("Content-Type", "application/json")
4647
w := httptest.NewRecorder()
4748

48-
err := h.ServeHTTPOrError(w, r)
49+
err = h.ServeHTTPOrError(w, r)
4950
require.NoError(t, err)
5051
assert.Equal(t, http.StatusOK, w.Code)
5152

@@ -59,11 +60,12 @@ func TestExchangeHandler_InvalidJWT(t *testing.T) {
5960
t.Parallel()
6061
h := newTestExchangeHandler(true)
6162

62-
body, _ := json.Marshal(map[string]string{"token": "not-a-jwt"})
63-
r := httptest.NewRequest(http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
63+
body, err := json.Marshal(map[string]string{"token": "not-a-jwt"})
64+
require.NoError(t, err)
65+
r := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
6466
w := httptest.NewRecorder()
6567

66-
err := h.ServeHTTPOrError(w, r)
68+
err = h.ServeHTTPOrError(w, r)
6769
require.NoError(t, err)
6870
assert.Equal(t, http.StatusUnauthorized, w.Code)
6971
}
@@ -73,11 +75,12 @@ func TestExchangeHandler_AppIDMismatch(t *testing.T) {
7375
h := newTestExchangeHandler(true)
7476
jwt := mintForTest(t, "different-app", "proj-456")
7577

76-
body, _ := json.Marshal(map[string]string{"token": jwt})
77-
r := httptest.NewRequest(http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
78+
body, err := json.Marshal(map[string]string{"token": jwt})
79+
require.NoError(t, err)
80+
r := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
7881
w := httptest.NewRecorder()
7982

80-
err := h.ServeHTTPOrError(w, r)
83+
err = h.ServeHTTPOrError(w, r)
8184
require.NoError(t, err)
8285
assert.Equal(t, http.StatusForbidden, w.Code)
8386
}
@@ -87,11 +90,12 @@ func TestExchangeHandler_ProjectMismatch(t *testing.T) {
8790
h := newTestExchangeHandler(true)
8891
jwt := mintForTest(t, "app-123", "different-project")
8992

90-
body, _ := json.Marshal(map[string]string{"token": jwt})
91-
r := httptest.NewRequest(http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
93+
body, err := json.Marshal(map[string]string{"token": jwt})
94+
require.NoError(t, err)
95+
r := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
9296
w := httptest.NewRecorder()
9397

94-
err := h.ServeHTTPOrError(w, r)
98+
err = h.ServeHTTPOrError(w, r)
9599
require.NoError(t, err)
96100
assert.Equal(t, http.StatusForbidden, w.Code)
97101
}
@@ -101,19 +105,20 @@ func TestExchangeHandler_DevModeOff(t *testing.T) {
101105
h := newTestExchangeHandler(false)
102106
jwt := mintForTest(t, "app-123", "proj-456")
103107

104-
body, _ := json.Marshal(map[string]string{"token": jwt})
105-
r := httptest.NewRequest(http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
108+
body, err := json.Marshal(map[string]string{"token": jwt})
109+
require.NoError(t, err)
110+
r := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader(body))
106111
w := httptest.NewRecorder()
107112

108-
err := h.ServeHTTPOrError(w, r)
113+
err = h.ServeHTTPOrError(w, r)
109114
require.NoError(t, err)
110115
assert.Equal(t, http.StatusNotFound, w.Code)
111116
}
112117

113118
func TestExchangeHandler_WrongMethod(t *testing.T) {
114119
t.Parallel()
115120
h := newTestExchangeHandler(true)
116-
r := httptest.NewRequest(http.MethodGet, "/_proxy/kai-preview/exchange", nil)
121+
r := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/_proxy/kai-preview/exchange", nil)
117122
w := httptest.NewRecorder()
118123

119124
err := h.ServeHTTPOrError(w, r)
@@ -124,7 +129,7 @@ func TestExchangeHandler_WrongMethod(t *testing.T) {
124129
func TestExchangeHandler_EmptyBody(t *testing.T) {
125130
t.Parallel()
126131
h := newTestExchangeHandler(true)
127-
r := httptest.NewRequest(http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader([]byte("{}")))
132+
r := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/_proxy/kai-preview/exchange", bytes.NewReader([]byte("{}")))
128133
w := httptest.NewRecorder()
129134

130135
err := h.ServeHTTPOrError(w, r)

internal/pkg/service/appsproxy/proxy/apphandler/authproxy/kaipreview/endpoints/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
)
1414

1515
// PathPrefix is the URL prefix all kai-preview endpoints live under.
16-
var PathPrefix = config.InternalPrefix + "/kai-preview"
16+
const PathPrefix = config.InternalPrefix + "/kai-preview"
1717

1818
const (
1919
pathHandshakeToken = "/handshake-token"

0 commit comments

Comments
 (0)