Skip to content

Commit 712a7a7

Browse files
committed
address comment
Signed-off-by: Huabing (Robin) Zhao <[email protected]>
1 parent edb78ff commit 712a7a7

File tree

2 files changed

+70
-27
lines changed

2 files changed

+70
-27
lines changed

conformance/tests/httproute-cors.go

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,22 @@ var HTTPRouteCORS = suite.ConformanceTest{
7676
Namespace: "",
7777
Response: http.Response{
7878
StatusCodes: []int{200, 204},
79-
Headers: map[string]string{
80-
"access-control-allow-origin": "https://www.foo.com",
81-
"access-control-allow-methods": "GET, OPTIONS",
82-
"access-control-allow-headers": "x-header-1, x-header-2",
83-
"access-control-expose-headers": "x-header-3, x-header-4",
84-
"access-control-max-age": "3600",
85-
"access-control-allow-credentials": "true",
79+
HeadersWithMultipleValues: map[string][]string{
80+
"access-control-allow-origin": {"https://www.foo.com"},
81+
"access-control-allow-methods": {
82+
"GET, OPTIONS",
83+
"OPTIONS, GET",
84+
},
85+
"access-control-allow-headers": {
86+
"x-header-1, x-header-2",
87+
"x-header-2, x-header-1",
88+
},
89+
"access-control-expose-headers": {
90+
"x-header-3, x-header-4",
91+
"x-header-4, x-header-3",
92+
},
93+
"access-control-max-age": {"3600"},
94+
"access-control-allow-credentials": {"true"},
8695
},
8796
// Ignore whitespace when comparing the response headers. This is because some
8897
// implementations add a space after each comma, and some don't. Both are valid.
@@ -114,14 +123,22 @@ var HTTPRouteCORS = suite.ConformanceTest{
114123
},
115124
Namespace: "",
116125
Response: http.Response{
117-
StatusCodes: []int{200, 204},
118-
Headers: map[string]string{
119-
"access-control-allow-origin": "https://www.bar.com",
120-
"access-control-allow-methods": "GET, OPTIONS",
121-
"access-control-allow-headers": "x-header-1, x-header-2",
122-
"access-control-expose-headers": "x-header-3, x-header-4",
123-
"access-control-max-age": "3600",
124-
"access-control-allow-credentials": "true",
126+
StatusCode: 200,
127+
HeadersWithMultipleValues: map[string][]string{
128+
"access-control-allow-origin": {"https://www.bar.com"},
129+
"access-control-allow-methods": {
130+
"GET, OPTIONS",
131+
"OPTIONS, GET"},
132+
"access-control-allow-headers": {
133+
"x-header-1, x-header-2",
134+
"x-header-2, x-header-1",
135+
},
136+
"access-control-expose-headers": {
137+
"x-header-3, x-header-4",
138+
"x-header-4, x-header-3",
139+
},
140+
"access-control-max-age": {"3600"},
141+
"access-control-allow-credentials": {"true"},
125142
},
126143
// Ignore whitespace when comparing the response headers. This is because some
127144
// implementations add a space after each comma, and some don't. Both are valid.

conformance/utils/http/http.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -395,26 +395,52 @@ func CompareRoundTrip(t *testing.T, req *roundtripper.Request, cReq *roundtrippe
395395
}
396396
}
397397

398-
if expected.Response.Headers != nil {
398+
if expected.Response.Headers != nil || expected.Response.HeadersWithMultipleValues != nil {
399399
if cRes.Headers == nil {
400400
return fmt.Errorf("no headers captured, expected %v", len(expected.Response.Headers))
401401
}
402402
for name, val := range cRes.Headers {
403403
cRes.Headers[strings.ToLower(name)] = val
404404
}
405405

406-
for name, expectedVal := range expected.Response.Headers {
407-
actualVal, ok := cRes.Headers[strings.ToLower(name)]
408-
if !ok {
409-
return fmt.Errorf("expected %s header to be set, actual headers: %v", name, cRes.Headers)
410-
}
411-
actualValStr := strings.Join(actualVal, ",")
412-
if expected.Response.IgnoreWhitespace {
413-
actualValStr = strings.ReplaceAll(actualValStr, " ", "")
414-
expectedVal = strings.ReplaceAll(expectedVal, " ", "")
406+
if expected.Response.HeadersWithMultipleValues != nil {
407+
for name, expectedVals := range expected.Response.HeadersWithMultipleValues {
408+
actualVal, ok := cRes.Headers[strings.ToLower(name)]
409+
if !ok {
410+
return fmt.Errorf("expected %s header to be set, actual headers: %v", name, cRes.Headers)
411+
}
412+
actualValStr := strings.Join(actualVal, ",")
413+
if expected.Response.IgnoreWhitespace {
414+
actualValStr = strings.ReplaceAll(actualValStr, " ", "")
415+
for i := range expectedVals {
416+
expectedVals[i] = strings.ReplaceAll(expectedVals[i], " ", "")
417+
}
418+
}
419+
matched := false
420+
for _, expectedVal := range expectedVals {
421+
if actualValStr == expectedVal {
422+
matched = true
423+
break
424+
}
425+
}
426+
if !matched {
427+
return fmt.Errorf("expected %s header to be set to one of %v, got %s", name, expectedVals, actualValStr)
428+
}
415429
}
416-
if actualValStr != expectedVal {
417-
return fmt.Errorf("expected %s header to be set to %s, got %s", name, expectedVal, actualValStr)
430+
} else {
431+
for name, expectedVal := range expected.Response.Headers {
432+
actualVal, ok := cRes.Headers[strings.ToLower(name)]
433+
if !ok {
434+
return fmt.Errorf("expected %s header to be set, actual headers: %v", name, cRes.Headers)
435+
}
436+
actualValStr := strings.Join(actualVal, ",")
437+
if expected.Response.IgnoreWhitespace {
438+
actualValStr = strings.ReplaceAll(actualValStr, " ", "")
439+
expectedVal = strings.ReplaceAll(expectedVal, " ", "")
440+
}
441+
if actualValStr != expectedVal {
442+
return fmt.Errorf("expected %s header to be set to %s, got %s", name, expectedVal, actualValStr)
443+
}
418444
}
419445
}
420446
}

0 commit comments

Comments
 (0)