diff --git a/pkg/router/gateway_api.go b/pkg/router/gateway_api.go index be0cfef8..161bcc3f 100644 --- a/pkg/router/gateway_api.go +++ b/pkg/router/gateway_api.go @@ -482,10 +482,8 @@ func (gwr *GatewayAPIRouter) getSessionAffinityRouteRules(canary *flaggerv1.Cana ResponseHeaderModifier: &v1.HTTPHeaderFilter{ Add: []v1.HTTPHeader{ { - Name: setCookieHeader, - Value: fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, - canary.Spec.Analysis.SessionAffinity.GetMaxAge(), - ), + Name: setCookieHeader, + Value: canary.Spec.Analysis.SessionAffinity.BuildCookie(canary.Status.SessionAffinityCookie), }, }, }, diff --git a/pkg/router/gateway_api_test.go b/pkg/router/gateway_api_test.go index 425034a9..0278a50d 100644 --- a/pkg/router/gateway_api_test.go +++ b/pkg/router/gateway_api_test.go @@ -99,8 +99,14 @@ func TestGatewayAPIRouter_Routes(t *testing.T) { cookieKey := "flagger-cookie" // enable session affinity and start canary run canary.Spec.Analysis.SessionAffinity = &flaggerv1.SessionAffinity{ - CookieName: cookieKey, - MaxAge: 300, + CookieName: cookieKey, + Domain: "flagger.app", + HttpOnly: true, + MaxAge: 300, + Partitioned: true, + Path: "/app", + SameSite: "Strict", + Secure: true, } _, pSvcName, cSvcName := canary.GetServiceNames() @@ -137,10 +143,18 @@ func TestGatewayAPIRouter_Routes(t *testing.T) { if string(backendRef.Name) == cSvcName { found = true filter := backendRef.Filters[0] + val := filter.ResponseHeaderModifier.Add[0].Value assert.Equal(t, filter.Type, v1.HTTPRouteFilterResponseHeaderModifier) assert.NotNil(t, filter.ResponseHeaderModifier) assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader) - assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300)) + assert.True(t, strings.HasPrefix(val, cookieKey)) + assert.True(t, strings.Contains(val, "Domain=flagger.app")) + assert.True(t, strings.Contains(val, "HttpOnly")) + assert.True(t, strings.Contains(val, "Max-Age=300")) + assert.True(t, strings.Contains(val, "Partitioned")) + assert.True(t, strings.Contains(val, "Path=/app")) + assert.True(t, strings.Contains(val, "SameSite=Strict")) + assert.True(t, strings.Contains(val, "Secure")) assert.Equal(t, *backendRef.Weight, int32(10)) } if string(backendRef.Name) == pSvcName { @@ -193,10 +207,18 @@ func TestGatewayAPIRouter_Routes(t *testing.T) { if string(backendRef.Name) == cSvcName { found = true filter := backendRef.Filters[0] + val := filter.ResponseHeaderModifier.Add[0].Value assert.Equal(t, filter.Type, v1.HTTPRouteFilterResponseHeaderModifier) assert.NotNil(t, filter.ResponseHeaderModifier) assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader) - assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300)) + assert.True(t, strings.HasPrefix(val, cookieKey)) + assert.True(t, strings.Contains(val, "Domain=flagger.app")) + assert.True(t, strings.Contains(val, "HttpOnly")) + assert.True(t, strings.Contains(val, "Max-Age=300")) + assert.True(t, strings.Contains(val, "Partitioned")) + assert.True(t, strings.Contains(val, "Path=/app")) + assert.True(t, strings.Contains(val, "SameSite=Strict")) + assert.True(t, strings.Contains(val, "Secure")) assert.Equal(t, *backendRef.Weight, int32(50)) } diff --git a/pkg/router/gateway_api_v1beta1.go b/pkg/router/gateway_api_v1beta1.go index da65e359..198fe991 100644 --- a/pkg/router/gateway_api_v1beta1.go +++ b/pkg/router/gateway_api_v1beta1.go @@ -423,10 +423,8 @@ func (gwr *GatewayAPIV1Beta1Router) getSessionAffinityRouteRules(canary *flagger ResponseHeaderModifier: &v1beta1.HTTPHeaderFilter{ Add: []v1beta1.HTTPHeader{ { - Name: setCookieHeader, - Value: fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, - canary.Spec.Analysis.SessionAffinity.GetMaxAge(), - ), + Name: setCookieHeader, + Value: canary.Spec.Analysis.SessionAffinity.BuildCookie(canary.Status.SessionAffinityCookie), }, }, }, diff --git a/pkg/router/gateway_api_v1beta1_test.go b/pkg/router/gateway_api_v1beta1_test.go index 9ffeda41..e14b41a7 100644 --- a/pkg/router/gateway_api_v1beta1_test.go +++ b/pkg/router/gateway_api_v1beta1_test.go @@ -96,8 +96,14 @@ func TestGatewayAPIV1Beta1Router_Routes(t *testing.T) { cookieKey := "flagger-cookie" // enable session affinity and start canary run canary.Spec.Analysis.SessionAffinity = &flaggerv1.SessionAffinity{ - CookieName: cookieKey, - MaxAge: 300, + CookieName: cookieKey, + Domain: "flagger.app", + HttpOnly: true, + MaxAge: 300, + Partitioned: true, + Path: "/app", + SameSite: "Strict", + Secure: true, } _, pSvcName, cSvcName := canary.GetServiceNames() @@ -133,10 +139,18 @@ func TestGatewayAPIV1Beta1Router_Routes(t *testing.T) { if string(backendRef.Name) == cSvcName { found = true filter := backendRef.Filters[0] + val := filter.ResponseHeaderModifier.Add[0].Value assert.Equal(t, filter.Type, v1beta1.HTTPRouteFilterResponseHeaderModifier) assert.NotNil(t, filter.ResponseHeaderModifier) assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader) - assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300)) + assert.True(t, strings.HasPrefix(val, cookieKey)) + assert.True(t, strings.Contains(val, "Domain=flagger.app")) + assert.True(t, strings.Contains(val, "HttpOnly")) + assert.True(t, strings.Contains(val, "Max-Age=300")) + assert.True(t, strings.Contains(val, "Partitioned")) + assert.True(t, strings.Contains(val, "Path=/app")) + assert.True(t, strings.Contains(val, "SameSite=Strict")) + assert.True(t, strings.Contains(val, "Secure")) assert.Equal(t, *backendRef.Weight, int32(10)) } if string(backendRef.Name) == pSvcName { @@ -189,10 +203,18 @@ func TestGatewayAPIV1Beta1Router_Routes(t *testing.T) { if string(backendRef.Name) == cSvcName { found = true filter := backendRef.Filters[0] + val := filter.ResponseHeaderModifier.Add[0].Value assert.Equal(t, filter.Type, v1beta1.HTTPRouteFilterResponseHeaderModifier) assert.NotNil(t, filter.ResponseHeaderModifier) assert.Equal(t, string(filter.ResponseHeaderModifier.Add[0].Name), setCookieHeader) - assert.Equal(t, filter.ResponseHeaderModifier.Add[0].Value, fmt.Sprintf("%s; %s=%d", canary.Status.SessionAffinityCookie, maxAgeAttr, 300)) + assert.True(t, strings.HasPrefix(val, cookieKey)) + assert.True(t, strings.Contains(val, "Domain=flagger.app")) + assert.True(t, strings.Contains(val, "HttpOnly")) + assert.True(t, strings.Contains(val, "Max-Age=300")) + assert.True(t, strings.Contains(val, "Partitioned")) + assert.True(t, strings.Contains(val, "Path=/app")) + assert.True(t, strings.Contains(val, "SameSite=Strict")) + assert.True(t, strings.Contains(val, "Secure")) assert.Equal(t, *backendRef.Weight, int32(50)) }