diff --git a/.aspell.yml b/.aspell.yml index 48bb8664..0b8bda85 100644 --- a/.aspell.yml +++ b/.aspell.yml @@ -72,5 +72,7 @@ allowed: - userlist - tmp - kubectl + - Kubernetes + - HTTPS - PEM - redact diff --git a/pkg/haproxy/rules/reqRequestRedirect.go b/pkg/haproxy/rules/reqRequestRedirect.go index d9bac63b..1eceff44 100644 --- a/pkg/haproxy/rules/reqRequestRedirect.go +++ b/pkg/haproxy/rules/reqRequestRedirect.go @@ -18,6 +18,8 @@ type RequestRedirect struct { SSLRedirect bool } +const DefaultHTTPSPort = 443 + func (r RequestRedirect) GetType() Type { return REQ_REDIRECT } @@ -26,21 +28,43 @@ func (r RequestRedirect) Create(client api.HAProxyClient, frontend *models.Front if frontend.Mode == "tcp" { return errors.New("request redirection cannot be configured in TCP mode") } - var rule string + var httpRule models.HTTPRequestRule if r.SSLRedirect { - rule = fmt.Sprintf("https://%%[hdr(host),field(1,:)]:%d%%[capture.req.uri]", r.RedirectPort) + httpRule = r.sslRedirect() } else { - scheme := "http" - if r.SSLRequest { - scheme = "https" - } - rule = fmt.Sprintf(scheme+"://%s%%[capture.req.uri]", r.Host) + httpRule = r.hostRedirect() } + + return client.FrontendHTTPRequestRuleCreate(0, frontend.Name, httpRule, ingressACL) +} + +func (r RequestRedirect) sslRedirect() models.HTTPRequestRule { + httpRule := models.HTTPRequestRule{ + Type: "redirect", + RedirCode: utils.PtrInt64(r.RedirectCode), + } + if r.RedirectPort == DefaultHTTPSPort { + httpRule.RedirType = "scheme" + httpRule.RedirValue = "https" + } else { + rule := fmt.Sprintf("https://%%[hdr(host),field(1,:)]:%d%%[capture.req.uri]", r.RedirectPort) + httpRule.RedirType = "location" + httpRule.RedirValue = rule + } + return httpRule +} + +func (r RequestRedirect) hostRedirect() models.HTTPRequestRule { + scheme := "http" + if r.SSLRequest { + scheme = "https" + } + rule := fmt.Sprintf(scheme+"://%s%%[capture.req.uri]", r.Host) httpRule := models.HTTPRequestRule{ Type: "redirect", RedirCode: utils.PtrInt64(r.RedirectCode), RedirValue: rule, RedirType: "location", } - return client.FrontendHTTPRequestRuleCreate(0, frontend.Name, httpRule, ingressACL) + return httpRule }