Skip to content

Commit 560939b

Browse files
authored
Merge pull request #256 from SpectoLabs/glob-templates
RequestTemplates now allow for * wildcards
2 parents 1ac6b54 + 18deaff commit 560939b

File tree

20 files changed

+777
-90
lines changed

20 files changed

+777
-90
lines changed

core/glide.lock

Lines changed: 7 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/glide.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,5 @@ import:
4747
- package: github.com/ursiform/bear
4848
- package: github.com/onsi/gomega
4949
- package: gopkg.in/yaml.v2
50+
- package: github.com/ryanuber/go-glob
51+
version: ^0.1.0

core/matching/request_template_store.go

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import (
77
. "github.com/SpectoLabs/hoverfly/core/util"
88
"github.com/SpectoLabs/hoverfly/core/models"
99
"github.com/SpectoLabs/hoverfly/core/views"
10-
"reflect"
10+
"github.com/ryanuber/go-glob"
11+
"strings"
1112
)
1213

1314
type RequestTemplateStore []RequestTemplateResponsePair
@@ -43,25 +44,25 @@ func (this *RequestTemplateStore) GetResponse(req models.RequestDetails, webserv
4344
// TODO: need to enable regex matches
4445
// TODO: enable matching on scheme
4546

46-
if entry.RequestTemplate.Body != nil && *entry.RequestTemplate.Body != req.Body {
47+
if entry.RequestTemplate.Body != nil && !glob.Glob(*entry.RequestTemplate.Body, req.Body) {
4748
continue
4849
}
4950

5051
if !webserver {
51-
if entry.RequestTemplate.Destination != nil && *entry.RequestTemplate.Destination != req.Destination {
52+
if entry.RequestTemplate.Destination != nil && !glob.Glob(*entry.RequestTemplate.Destination, req.Destination) {
5253
continue
5354
}
5455
}
55-
if entry.RequestTemplate.Path != nil && *entry.RequestTemplate.Path != req.Path {
56+
if entry.RequestTemplate.Path != nil && !glob.Glob(*entry.RequestTemplate.Path, req.Path) {
5657
continue
5758
}
58-
if entry.RequestTemplate.Query != nil && *entry.RequestTemplate.Query != req.Query {
59+
if entry.RequestTemplate.Query != nil && !glob.Glob(*entry.RequestTemplate.Query, req.Query) {
5960
continue
6061
}
6162
if !headerMatch(entry.RequestTemplate.Headers, req.Headers) {
6263
continue
6364
}
64-
if entry.RequestTemplate.Method != nil && *entry.RequestTemplate.Method != req.Method {
65+
if entry.RequestTemplate.Method != nil && !glob.Glob(*entry.RequestTemplate.Method, req.Method) {
6566
continue
6667
}
6768

@@ -99,18 +100,31 @@ func (this *RequestTemplateStore) Wipe() {
99100
/**
100101
Check keys and corresponding values in template headers are also present in request headers
101102
*/
102-
func headerMatch(tmplHeaders, reqHeaders map[string][]string) bool {
103+
func headerMatch(templateHeaders, requestHeaders map[string][]string) bool {
103104

104-
for headerName, headerVal := range tmplHeaders {
105-
// TODO: case insensitive lookup
106-
// TODO: is order of values in slice really important?
105+
for templateHeaderKey, templateHeaderValues := range templateHeaders {
106+
for requestHeaderKey, requestHeaderValues := range requestHeaders {
107+
delete(requestHeaders, requestHeaderKey)
108+
requestHeaders[strings.ToLower(requestHeaderKey)] = requestHeaderValues
107109

108-
reqHeaderVal, ok := reqHeaders[headerName]
109-
if ok && reflect.DeepEqual(headerVal, reqHeaderVal) {
110-
continue
111-
} else {
110+
}
111+
requestTemplateValues, templateHeaderMatched := requestHeaders[strings.ToLower(templateHeaderKey)]
112+
if !templateHeaderMatched {
112113
return false
113114
}
115+
116+
for _, templateHeaderValue := range templateHeaderValues {
117+
templateValueMatched := false
118+
for _, requestHeaderValue := range requestTemplateValues {
119+
if glob.Glob(strings.ToLower(templateHeaderValue), strings.ToLower(requestHeaderValue)) {
120+
templateValueMatched = true
121+
}
122+
}
123+
124+
if !templateValueMatched {
125+
return false
126+
}
127+
}
114128
}
115129
return true
116130
}

0 commit comments

Comments
 (0)