From 960d05fc956e22c15c1526a99ea4622932bab111 Mon Sep 17 00:00:00 2001 From: Yuki Yugui Sonoda Date: Sun, 30 Aug 2015 12:17:54 +0900 Subject: [PATCH] Consider tail after deep wildcard on matching Fixes #23 --- runtime/pattern.go | 9 +++++++-- runtime/pattern_test.go | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/runtime/pattern.go b/runtime/pattern.go index ca82d2dd9a5..77931d56537 100644 --- a/runtime/pattern.go +++ b/runtime/pattern.go @@ -173,8 +173,13 @@ func (p Pattern) Match(components []string, verb string) (map[string]string, err stack = append(stack, c) pos++ case utilities.OpPushM: - stack = append(stack, strings.Join(components[pos:], "/")) - pos = len(components) + end := len(components) + if end < pos+p.tailLen { + return nil, ErrNotMatch + } + end -= p.tailLen + stack = append(stack, strings.Join(components[pos:end], "/")) + pos = end case utilities.OpConcatN: n := op.operand l := len(stack) - n diff --git a/runtime/pattern_test.go b/runtime/pattern_test.go index 5da6669d228..55d6cb8b161 100644 --- a/runtime/pattern_test.go +++ b/runtime/pattern_test.go @@ -247,6 +247,18 @@ func TestMatch(t *testing.T) { ops: []int{int(utilities.OpPushM), anything}, match: []string{"", "abc", "abc/def", "abc/def/ghi"}, }, + { + ops: []int{ + int(utilities.OpPushM), anything, + int(utilities.OpLitPush), 0, + }, + pool: []string{"tail"}, + match: []string{"tail", "abc/tail", "abc/def/tail"}, + notMatch: []string{ + "", "abc", "abc/def", + "tail/extra", "abc/tail/extra", "abc/def/tail/extra", + }, + }, { ops: []int{ int(utilities.OpLitPush), 0, @@ -430,6 +442,22 @@ func TestMatchWithBinding(t *testing.T) { "name": "o/my-bucket/dir/dir2/obj", }, }, + { + ops: []int{ + int(utilities.OpLitPush), 0, + int(utilities.OpLitPush), 1, + int(utilities.OpPushM), anything, + int(utilities.OpLitPush), 2, + int(utilities.OpConcatN), 3, + int(utilities.OpCapture), 4, + int(utilities.OpLitPush), 3, + }, + pool: []string{"v1", "o", ".ext", "tail", "name"}, + path: "v1/o/my-bucket/dir/dir2/obj/.ext/tail", + want: map[string]string{ + "name": "o/my-bucket/dir/dir2/obj/.ext", + }, + }, { ops: []int{ int(utilities.OpLitPush), 0, @@ -531,11 +559,13 @@ func TestPatternString(t *testing.T) { int(utilities.OpCapture), 2, int(utilities.OpLitPush), 3, int(utilities.OpPushM), anything, - int(utilities.OpConcatN), 2, - int(utilities.OpCapture), 4, + int(utilities.OpLitPush), 4, + int(utilities.OpConcatN), 3, + int(utilities.OpCapture), 6, + int(utilities.OpLitPush), 5, }, - pool: []string{"v1", "buckets", "bucket_name", "objects", "name"}, - want: "/v1/{bucket_name=buckets/*}/{name=objects/**}", + pool: []string{"v1", "buckets", "bucket_name", "objects", ".ext", "tail", "name"}, + want: "/v1/{bucket_name=buckets/*}/{name=objects/**/.ext}/tail", }, } { p, err := NewPattern(validVersion, spec.ops, spec.pool, "")