Skip to content

Commit 4a16a9c

Browse files
Fix: Copilot suggested fixes
- Fix go version in dockerfile - Enhance CORS middleware to append Vary header
1 parent b4e49ba commit 4a16a9c

3 files changed

Lines changed: 53 additions & 2 deletions

File tree

portal/backend/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM golang:1.23 AS builder
1+
FROM golang:1.26.3 AS builder
22
WORKDIR /app
33
COPY . .
44
RUN go mod download && go build -o /out/bff ./cmd/server

portal/backend/internal/middleware/cors.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func CORS(next http.Handler, options CORSOptions) http.Handler {
5050
return
5151
}
5252

53-
w.Header().Set("Vary", "Origin")
53+
appendVary(w.Header(), "Origin")
5454
w.Header().Set("Access-Control-Allow-Origin", origin)
5555
w.Header().Set("Access-Control-Allow-Methods", allowMethods)
5656
w.Header().Set("Access-Control-Allow-Headers", allowHeaders)
@@ -78,3 +78,14 @@ func toSet(values []string) map[string]struct{} {
7878
}
7979
return out
8080
}
81+
82+
func appendVary(header http.Header, value string) {
83+
for _, existing := range header.Values("Vary") {
84+
for _, part := range strings.Split(existing, ",") {
85+
if strings.EqualFold(strings.TrimSpace(part), value) {
86+
return
87+
}
88+
}
89+
}
90+
header.Add("Vary", value)
91+
}

portal/backend/tests/unit/cors_middleware_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ package unit
2121
import (
2222
"net/http"
2323
"net/http/httptest"
24+
"strings"
2425
"testing"
2526

2627
"github.com/wso2/openfgc/portal/backend/internal/middleware"
@@ -113,3 +114,42 @@ func TestCORSMiddleware_HandlesPreflight(t *testing.T) {
113114
t.Fatalf("expected Access-Control-Allow-Credentials=true, got %q", got)
114115
}
115116
}
117+
118+
func TestCORSMiddleware_AppendsVaryOrigin(t *testing.T) {
119+
next := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
120+
w.WriteHeader(http.StatusOK)
121+
})
122+
123+
corsHandler := middleware.CORS(next, middleware.CORSOptions{
124+
AllowedOrigins: []string{"http://localhost:3000"},
125+
AllowedMethods: []string{"GET"},
126+
AllowedHeaders: []string{"Content-Type"},
127+
})
128+
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
129+
w.Header().Set("Vary", "Accept-Encoding")
130+
corsHandler.ServeHTTP(w, r)
131+
})
132+
133+
req := httptest.NewRequest(http.MethodGet, "/me/consents", nil)
134+
req.Header.Set("Origin", "http://localhost:3000")
135+
res := httptest.NewRecorder()
136+
137+
handler.ServeHTTP(res, req)
138+
139+
vary := strings.Join(res.Header().Values("Vary"), ",")
140+
if !headerListContains(vary, "Accept-Encoding") {
141+
t.Fatalf("expected Vary to retain Accept-Encoding, got %q", vary)
142+
}
143+
if !headerListContains(vary, "Origin") {
144+
t.Fatalf("expected Vary to include Origin, got %q", vary)
145+
}
146+
}
147+
148+
func headerListContains(headerValue, expected string) bool {
149+
for _, part := range strings.Split(headerValue, ",") {
150+
if strings.EqualFold(strings.TrimSpace(part), expected) {
151+
return true
152+
}
153+
}
154+
return false
155+
}

0 commit comments

Comments
 (0)