From 8449a27c3dc20984c018555ec7a040032934ffca Mon Sep 17 00:00:00 2001 From: Bryan Shelton Date: Wed, 3 Oct 2018 15:05:12 -0700 Subject: [PATCH] Make literal $ character work in set $location_path --- internal/ingress/controller/template/template.go | 15 +++++++++++++++ .../ingress/controller/template/template_test.go | 13 +++++++++++++ rootfs/etc/nginx/template/nginx.tmpl | 8 +++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/internal/ingress/controller/template/template.go b/internal/ingress/controller/template/template.go index 2d5e5522c..132051cb3 100644 --- a/internal/ingress/controller/template/template.go +++ b/internal/ingress/controller/template/template.go @@ -120,6 +120,7 @@ var ( } return true }, + "escapeLocationPathVar": escapeLocationPathVar, "shouldConfigureLuaRestyWAF": shouldConfigureLuaRestyWAF, "buildLuaSharedDictionaries": buildLuaSharedDictionaries, "buildLocation": buildLocation, @@ -161,6 +162,20 @@ var ( } ) +// escapeLocationPathVar will replace the $ character with ${literal_dollar} +// which is made to work via the following configuration in the http section of +// the template: +// geo $literal_dollar { +// default "$"; +// } +func escapeLocationPathVar(input interface{}) string { + inputStr, ok := input.(string) + if !ok { + return "" + } + return strings.Replace(inputStr, `$`, `${literal_dollar}`, -1) +} + // formatIP will wrap IPv6 addresses in [] and return IPv4 addresses // without modification. If the input cannot be parsed as an IP address // it is returned without modification. diff --git a/internal/ingress/controller/template/template_test.go b/internal/ingress/controller/template/template_test.go index d8622e2f6..fd3c5d063 100644 --- a/internal/ingress/controller/template/template_test.go +++ b/internal/ingress/controller/template/template_test.go @@ -834,3 +834,16 @@ func TestBuildUpstreamName(t *testing.T) { } } } + +func TestEscapeLocationPathVar(t *testing.T) { + escapedPath := escapeLocationPathVar("/$") + expected := "/${literal_dollar}" + if escapedPath != expected { + t.Errorf("Expected %s but got %s", expected, escapedPath) + } + escapedPath = escapeLocationPathVar(false) + expected = "" + if escapedPath != expected { + t.Errorf("Expected %s but got %s", expected, escapedPath) + } +} diff --git a/rootfs/etc/nginx/template/nginx.tmpl b/rootfs/etc/nginx/template/nginx.tmpl index 39b8b130b..23d6dfa1b 100644 --- a/rootfs/etc/nginx/template/nginx.tmpl +++ b/rootfs/etc/nginx/template/nginx.tmpl @@ -347,6 +347,12 @@ http { } {{ end }} + # Create a variable that contains the literal $ character. + # This works because the geo module will not resolve variables. + geo $literal_dollar { + default "$"; + } + server_name_in_redirect off; port_in_redirect off; @@ -970,7 +976,7 @@ stream { set $ingress_name "{{ $ing.Rule }}"; set $service_name "{{ $ing.Service }}"; set $service_port "{{ $location.Port }}"; - set $location_path "{{ $location.Path }}"; + set $location_path "{{ $location.Path | escapeLocationPathVar }}"; {{ if $all.Cfg.EnableOpentracing }} opentracing_propagate_context;