From 80572f5f18590ed3c0ff5792774e81b5649d1804 Mon Sep 17 00:00:00 2001 From: Jan Willies Date: Tue, 28 Oct 2014 14:52:55 +0100 Subject: [PATCH 1/3] add regular expression matching to --output-http-rewrite-url --- settings_url_map.go | 13 +++++++++---- settings_url_map_test.go | 24 ++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/settings_url_map.go b/settings_url_map.go index 501b1a8..37c6173 100644 --- a/settings_url_map.go +++ b/settings_url_map.go @@ -3,11 +3,12 @@ package main import ( "errors" "fmt" + "regexp" "strings" ) type urlRewrite struct { - src string + src *regexp.Regexp target string } @@ -22,14 +23,18 @@ func (r *UrlRewriteMap) Set(value string) error { if len(valArr) < 2 { return errors.New("need both src and target, colon-delimited (ex. /a:/b).") } - *r = append(*r, urlRewrite{src: valArr[0], target: valArr[1]}) + regexp, err := regexp.Compile(valArr[0]) + if err != nil { + return err + } + *r = append(*r, urlRewrite{src: regexp, target: valArr[1]}) return nil } func (r *UrlRewriteMap) Rewrite(path string) string { for _, f := range *r { - if f.src == path { - return f.target + if f.src.MatchString(path) { + return f.src.ReplaceAllLiteralString(path, f.target) } } return path diff --git a/settings_url_map_test.go b/settings_url_map_test.go index 18cc920..23e3a5f 100644 --- a/settings_url_map_test.go +++ b/settings_url_map_test.go @@ -4,7 +4,7 @@ import ( "testing" ) -func TestUrlRewriteMap(t *testing.T) { +func TestUrlRewriteMap_1(t *testing.T) { var url string rewrites := UrlRewriteMap{} @@ -15,7 +15,6 @@ func TestUrlRewriteMap(t *testing.T) { } url = "/abc" - if rewrites.Rewrite(url) == url { t.Error("Request url should have been rewritten, wasn't") } @@ -25,3 +24,24 @@ func TestUrlRewriteMap(t *testing.T) { t.Error("Request url should not have been rewritten, was") } } + +func TestUrlRewriteMap_2(t *testing.T) { + var url string + + rewrites := UrlRewriteMap{} + + err := rewrites.Set("/abc?\\d{4}5$:/123") + if err != nil { + t.Error("Should not error on /abc?\\d{4}:/123") + } + + url = "/ab12345" + if rewrites.Rewrite(url) == url { + t.Error("Request url should have been rewritten, wasn't") + } + + url = "/ab" + if rewrites.Rewrite(url) != url { + t.Error("Request url should not have been rewritten, was") + } +} From 7f49314ec7ee9af0a9b0cdb79e0a5425f612f7c9 Mon Sep 17 00:00:00 2001 From: Jan Willies Date: Tue, 28 Oct 2014 18:12:21 +0100 Subject: [PATCH 2/3] allow matched parts in -output-http-rewrite-url --- settings_url_map.go | 2 +- settings_url_map_test.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/settings_url_map.go b/settings_url_map.go index 37c6173..e8fa48a 100644 --- a/settings_url_map.go +++ b/settings_url_map.go @@ -34,7 +34,7 @@ func (r *UrlRewriteMap) Set(value string) error { func (r *UrlRewriteMap) Rewrite(path string) string { for _, f := range *r { if f.src.MatchString(path) { - return f.src.ReplaceAllLiteralString(path, f.target) + return f.src.ReplaceAllString(path, f.target) } } return path diff --git a/settings_url_map_test.go b/settings_url_map_test.go index 23e3a5f..e1ce8d1 100644 --- a/settings_url_map_test.go +++ b/settings_url_map_test.go @@ -30,17 +30,17 @@ func TestUrlRewriteMap_2(t *testing.T) { rewrites := UrlRewriteMap{} - err := rewrites.Set("/abc?\\d{4}5$:/123") + err := rewrites.Set("/v1/user/([^\\/]+)/ping:/v2/user/$1/ping") if err != nil { - t.Error("Should not error on /abc?\\d{4}:/123") + t.Error("Should not error on /v1/user/([^\\/]+)/ping:/v2/user/$1/ping") } - url = "/ab12345" + url = "/v1/user/joe/ping" if rewrites.Rewrite(url) == url { t.Error("Request url should have been rewritten, wasn't") } - url = "/ab" + url = "/v1/user/ping" if rewrites.Rewrite(url) != url { t.Error("Request url should not have been rewritten, was") } From 15417894a97911e2436fedec0654dcf24cd6b56c Mon Sep 17 00:00:00 2001 From: Jan Willies Date: Tue, 28 Oct 2014 18:42:38 +0100 Subject: [PATCH 3/3] add test that explicitly checks if rewrites.Rewrite(url) == /v2/user/joe/ping --- settings_url_map_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/settings_url_map_test.go b/settings_url_map_test.go index e1ce8d1..ed5ed21 100644 --- a/settings_url_map_test.go +++ b/settings_url_map_test.go @@ -40,6 +40,11 @@ func TestUrlRewriteMap_2(t *testing.T) { t.Error("Request url should have been rewritten, wasn't") } + url = "/v1/user/joe/ping" + if rewrites.Rewrite(url) != "/v2/user/joe/ping" { + t.Error("Request url should have been rewritten, wasn't") + } + url = "/v1/user/ping" if rewrites.Rewrite(url) != url { t.Error("Request url should not have been rewritten, was")