From e0ed7093970cf08f63cf04f663c6841a7fdc4499 Mon Sep 17 00:00:00 2001 From: Toby Allen Date: Mon, 1 May 2017 20:45:40 +0100 Subject: [PATCH] rewrite: Raise error if rewrite path does not begin with / #1610 (#1629) * Raise syntax error if no '/' prefix to rewrite. Added Tests * fix case where to keyword is used. * Fixed spelling issue * Changes to use Errf rather than new Err function * Remove new RewritePathErr Function --- caddyhttp/rewrite/setup.go | 14 ++++++++++++-- caddyhttp/rewrite/setup_test.go | 10 +++++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/caddyhttp/rewrite/setup.go b/caddyhttp/rewrite/setup.go index 71c498e1..4e9bfe70 100644 --- a/caddyhttp/rewrite/setup.go +++ b/caddyhttp/rewrite/setup.go @@ -76,6 +76,10 @@ func rewriteParse(c *caddy.Controller) ([]httpserver.HandlerConfig, error) { return nil, c.ArgErr() } to = strings.Join(args1, " ") + // ensure rewrite path begins with / + if !strings.HasPrefix(to, "/") { + return nil, c.Errf("%s:%d - Syntax error: Rewrite path must begin with '/'. Provided: '%s'", c.File(), c.Line(), c.Val()) + } case "ext": args1 := c.RemainingArgs() if len(args1) == 0 { @@ -90,14 +94,20 @@ func rewriteParse(c *caddy.Controller) ([]httpserver.HandlerConfig, error) { if to == "" { return nil, c.ArgErr() } + if rule, err = NewComplexRule(base, pattern, to, ext, matcher); err != nil { return nil, err } rules = append(rules, rule) - // the only unhandled case is 2 and above + // handle case of 2 arguments: "from to" default: - rule = NewSimpleRule(args[0], strings.Join(args[1:], " ")) + // ensure rewrite path begins with / + topath := strings.Join(args[1:], " ") + if !strings.HasPrefix(topath, "/") { + return nil, c.Errf("%s:%d - Syntax error: Rewrite path must begin with '/'. Provided: '%s'", c.File(), c.Line(), c.Val()) + } + rule = NewSimpleRule(args[0], topath) rules = append(rules, rule) } diff --git a/caddyhttp/rewrite/setup_test.go b/caddyhttp/rewrite/setup_test.go index fd355102..b5d9455a 100644 --- a/caddyhttp/rewrite/setup_test.go +++ b/caddyhttp/rewrite/setup_test.go @@ -45,15 +45,19 @@ func TestRewriteParse(t *testing.T) { SimpleRule{From: "/from", To: "/to"}, }}, {`rewrite /from /to - rewrite a b`, false, []Rule{ + rewrite a /b`, false, []Rule{ SimpleRule{From: "/from", To: "/to"}, - SimpleRule{From: "a", To: "b"}, + SimpleRule{From: "a", To: "/b"}, }}, + {`rewrite a b`, true, []Rule{}}, {`rewrite a`, true, []Rule{}}, {`rewrite`, true, []Rule{}}, - {`rewrite a b c`, false, []Rule{ + {`rewrite a b c`, true, []Rule{ SimpleRule{From: "a", To: "b c"}, }}, + {`rewrite a /b c`, false, []Rule{ + SimpleRule{From: "a", To: "/b c"}, + }}, } for i, test := range simpleTests {