Skip to content

Commit 51b9ff4

Browse files
authored
Add logic for defining port in redirect based on scheme (#801)
* Add logic for defining port in redirect based on scheme and remove port from redirect location when scheme and port are well known
1 parent fa38602 commit 51b9ff4

File tree

2 files changed

+113
-14
lines changed

2 files changed

+113
-14
lines changed

internal/nginx/config/servers.go

+15-1
Original file line numberDiff line numberDiff line change
@@ -200,14 +200,28 @@ func createReturnValForRedirectFilter(filter *v1beta1.HTTPRequestRedirectFilter,
200200
port = int32(*filter.Port)
201201
}
202202

203+
hostnamePort := fmt.Sprintf("%s:%d", hostname, port)
204+
203205
scheme := "$scheme"
204206
if filter.Scheme != nil {
205207
scheme = *filter.Scheme
208+
// Don't specify the port in the return url if the scheme is
209+
// well known and the port is already set to the correct well known port
210+
if (port == 80 && scheme == "http") || (port == 443 && scheme == "https") {
211+
hostnamePort = hostname
212+
}
213+
if filter.Port == nil {
214+
// Don't specify the port in the return url if the scheme is
215+
// well known and the port is not specified by the user
216+
if scheme == "http" || scheme == "https" {
217+
hostnamePort = hostname
218+
}
219+
}
206220
}
207221

208222
return &http.Return{
209223
Code: code,
210-
Body: fmt.Sprintf("%s://%s:%d$request_uri", scheme, hostname, port),
224+
Body: fmt.Sprintf("%s://%s$request_uri", scheme, hostnamePort),
211225
}
212226
}
213227

internal/nginx/config/servers_test.go

+98-13
Original file line numberDiff line numberDiff line change
@@ -880,20 +880,25 @@ func TestCreateLocationsRootPath(t *testing.T) {
880880
}
881881

882882
func TestCreateReturnValForRedirectFilter(t *testing.T) {
883-
const listenerPort = 123
883+
const listenerPortCustom = 123
884+
const listenerPortHTTP = 80
885+
const listenerPortHTTPS = 443
884886

885887
tests := []struct {
886-
filter *v1beta1.HTTPRequestRedirectFilter
887-
expected *http.Return
888-
msg string
888+
filter *v1beta1.HTTPRequestRedirectFilter
889+
expected *http.Return
890+
msg string
891+
listenerPort int32
889892
}{
890893
{
891-
filter: nil,
892-
expected: nil,
893-
msg: "filter is nil",
894+
filter: nil,
895+
expected: nil,
896+
listenerPort: listenerPortCustom,
897+
msg: "filter is nil",
894898
},
895899
{
896-
filter: &v1beta1.HTTPRequestRedirectFilter{},
900+
filter: &v1beta1.HTTPRequestRedirectFilter{},
901+
listenerPort: listenerPortCustom,
897902
expected: &http.Return{
898903
Code: http.StatusFound,
899904
Body: "$scheme://$host:123$request_uri",
@@ -902,21 +907,101 @@ func TestCreateReturnValForRedirectFilter(t *testing.T) {
902907
},
903908
{
904909
filter: &v1beta1.HTTPRequestRedirectFilter{
905-
Scheme: helpers.GetStringPointer("https"),
906-
Hostname: (*v1beta1.PreciseHostname)(helpers.GetStringPointer("foo.example.com")),
910+
Scheme: helpers.GetPointer("https"),
911+
Hostname: helpers.GetPointer(v1beta1.PreciseHostname("foo.example.com")),
907912
Port: (*v1beta1.PortNumber)(helpers.GetInt32Pointer(2022)),
908-
StatusCode: helpers.GetIntPointer(101),
913+
StatusCode: helpers.GetPointer(301),
909914
},
915+
listenerPort: listenerPortCustom,
910916
expected: &http.Return{
911-
Code: 101,
917+
Code: 301,
912918
Body: "https://foo.example.com:2022$request_uri",
913919
},
914920
msg: "all fields are set",
915921
},
922+
{
923+
filter: &v1beta1.HTTPRequestRedirectFilter{
924+
Scheme: helpers.GetPointer("https"),
925+
Hostname: helpers.GetPointer(v1beta1.PreciseHostname("foo.example.com")),
926+
StatusCode: helpers.GetPointer(301),
927+
},
928+
listenerPort: listenerPortCustom,
929+
expected: &http.Return{
930+
Code: 301,
931+
Body: "https://foo.example.com$request_uri",
932+
},
933+
msg: "listenerPort is custom, scheme is set, no port",
934+
},
935+
{
936+
filter: &v1beta1.HTTPRequestRedirectFilter{
937+
Hostname: helpers.GetPointer(v1beta1.PreciseHostname("foo.example.com")),
938+
StatusCode: helpers.GetPointer(301),
939+
},
940+
listenerPort: listenerPortHTTPS,
941+
expected: &http.Return{
942+
Code: 301,
943+
Body: "$scheme://foo.example.com:443$request_uri",
944+
},
945+
msg: "no scheme, listenerPort https, no port is set",
946+
},
947+
{
948+
filter: &v1beta1.HTTPRequestRedirectFilter{
949+
Scheme: helpers.GetPointer("https"),
950+
Hostname: helpers.GetPointer(v1beta1.PreciseHostname("foo.example.com")),
951+
StatusCode: helpers.GetPointer(301),
952+
},
953+
listenerPort: listenerPortHTTPS,
954+
expected: &http.Return{
955+
Code: 301,
956+
Body: "https://foo.example.com$request_uri",
957+
},
958+
msg: "scheme is https, listenerPort https, no port is set",
959+
},
960+
{
961+
filter: &v1beta1.HTTPRequestRedirectFilter{
962+
Scheme: helpers.GetPointer("http"),
963+
Hostname: helpers.GetPointer(v1beta1.PreciseHostname("foo.example.com")),
964+
StatusCode: helpers.GetPointer(301),
965+
},
966+
listenerPort: listenerPortHTTP,
967+
expected: &http.Return{
968+
Code: 301,
969+
Body: "http://foo.example.com$request_uri",
970+
},
971+
msg: "scheme is http, listenerPort http, no port is set",
972+
},
973+
{
974+
filter: &v1beta1.HTTPRequestRedirectFilter{
975+
Scheme: helpers.GetPointer("http"),
976+
Hostname: helpers.GetPointer(v1beta1.PreciseHostname("foo.example.com")),
977+
Port: (*v1beta1.PortNumber)(helpers.GetInt32Pointer(80)),
978+
StatusCode: helpers.GetPointer(301),
979+
},
980+
listenerPort: listenerPortCustom,
981+
expected: &http.Return{
982+
Code: 301,
983+
Body: "http://foo.example.com$request_uri",
984+
},
985+
msg: "scheme is http, port http",
986+
},
987+
{
988+
filter: &v1beta1.HTTPRequestRedirectFilter{
989+
Scheme: helpers.GetPointer("https"),
990+
Hostname: helpers.GetPointer(v1beta1.PreciseHostname("foo.example.com")),
991+
Port: (*v1beta1.PortNumber)(helpers.GetInt32Pointer(443)),
992+
StatusCode: helpers.GetPointer(301),
993+
},
994+
listenerPort: listenerPortCustom,
995+
expected: &http.Return{
996+
Code: 301,
997+
Body: "https://foo.example.com$request_uri",
998+
},
999+
msg: "scheme is https, port https",
1000+
},
9161001
}
9171002

9181003
for _, test := range tests {
919-
result := createReturnValForRedirectFilter(test.filter, listenerPort)
1004+
result := createReturnValForRedirectFilter(test.filter, test.listenerPort)
9201005
if diff := cmp.Diff(test.expected, result); diff != "" {
9211006
t.Errorf("createReturnValForRedirectFilter() mismatch %q (-want +got):\n%s", test.msg, diff)
9221007
}

0 commit comments

Comments
 (0)