Skip to content

Commit 42b46be

Browse files
committed
feat(serverHandler): filter matched path of headers for current alias
1 parent e1421f9 commit 42b46be

File tree

5 files changed

+90
-15
lines changed

5 files changed

+90
-15
lines changed

src/serverHandler/aliasHandler.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ type aliasHandler struct {
4949
restrictAccessDirs pathStringsList
5050

5151
globalHeaders [][2]string
52-
headersUrls []pathHeaders
53-
headersDirs []pathHeaders
52+
headersUrls pathHeadersList
53+
headersDirs pathHeadersList
5454

5555
globalUpload bool
5656
uploadUrls []string
@@ -189,6 +189,10 @@ func newAliasHandler(
189189
globalRestrictAccess = vhostCtx.restrictAccessDirs.mergePrefixMatched(globalRestrictAccess, util.HasFsPrefixDir, currentAlias.fs)
190190
globalRestrictAccess = util.InPlaceDedup(globalRestrictAccess)
191191

192+
globalHeaders := p.GlobalHeaders
193+
globalHeaders = vhostCtx.headersUrls.mergePrefixMatched(globalHeaders, util.HasUrlPrefixDir, currentAlias.url)
194+
globalHeaders = vhostCtx.headersDirs.mergePrefixMatched(globalHeaders, util.HasFsPrefixDir, currentAlias.fs)
195+
192196
h := &aliasHandler{
193197
alias: currentAlias,
194198
emptyRoot: emptyRoot,
@@ -214,9 +218,9 @@ func newAliasHandler(
214218
restrictAccessUrls: vhostCtx.restrictAccessUrls.filterSuccessor(util.HasUrlPrefixDir, currentAlias.url),
215219
restrictAccessDirs: vhostCtx.restrictAccessDirs.filterSuccessor(util.HasFsPrefixDir, currentAlias.fs),
216220

217-
globalHeaders: p.GlobalHeaders,
218-
headersUrls: vhostCtx.headersUrls,
219-
headersDirs: vhostCtx.headersDirs,
221+
globalHeaders: globalHeaders,
222+
headersUrls: vhostCtx.headersUrls.filterSuccessor(util.HasUrlPrefixDir, currentAlias.url),
223+
headersDirs: vhostCtx.headersDirs.filterSuccessor(util.HasFsPrefixDir, currentAlias.fs),
220224

221225
globalUpload: p.GlobalUpload,
222226
uploadUrls: p.UploadUrls,

src/serverHandler/header.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,10 @@ import (
55
"net/http"
66
)
77

8-
type pathHeaders struct {
9-
path string
10-
headers [][2]string
11-
}
12-
13-
func newPathHeaders(pathHeadersList [][]string) []pathHeaders {
14-
results := make([]pathHeaders, 0, len(pathHeadersList))
8+
func newPathHeaders(pathHeadersEntries [][]string) pathHeadersList {
9+
results := make(pathHeadersList, 0, len(pathHeadersEntries))
1510

16-
for _, pathHeadersSeq := range pathHeadersList {
11+
for _, pathHeadersSeq := range pathHeadersEntries {
1712
if len(pathHeadersSeq) <= 1 { // no headers
1813
continue
1914
}

src/serverHandler/pathValues.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,51 @@ func (list pathStringsList) filterSuccessor(matchPrefix prefixFilter, refPath st
5151
return result
5252
}
5353
}
54+
55+
// pathHeaders
56+
57+
type pathHeaders struct {
58+
path string
59+
headers [][2]string
60+
}
61+
62+
type pathHeadersList []pathHeaders
63+
64+
func (list pathHeadersList) mergePrefixMatched(mergeWith [][2]string, matchPrefix prefixFilter, refPath string) [][2]string {
65+
var result [][2]string
66+
if mergeWith != nil {
67+
result = make([][2]string, len(mergeWith))
68+
copy(result, mergeWith)
69+
}
70+
71+
for i := range list {
72+
if matchPrefix(refPath, list[i].path) {
73+
if result == nil {
74+
result = [][2]string{}
75+
}
76+
result = append(result, list[i].headers...)
77+
}
78+
}
79+
80+
if mergeWith != nil && len(mergeWith) == len(result) {
81+
return mergeWith
82+
} else {
83+
return result
84+
}
85+
}
86+
87+
func (list pathHeadersList) filterSuccessor(matchPrefix prefixFilter, refPath string) pathHeadersList {
88+
var result pathHeadersList
89+
90+
for _, v := range list {
91+
if len(v.path) > len(refPath) && matchPrefix(v.path, refPath) {
92+
result = append(result, v)
93+
}
94+
}
95+
96+
if len(list) == len(result) {
97+
return list
98+
} else {
99+
return result
100+
}
101+
}

src/serverHandler/pathValues_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,31 @@ func TestPathStrings(t *testing.T) {
3232
t.Error(successors)
3333
}
3434
}
35+
36+
func TestPathHeaders(t *testing.T) {
37+
ps := pathHeadersList{
38+
{"/a", [][2]string{{"a", "a-value"}}},
39+
{"/a/b", [][2]string{{"ab", "ab-value"}}},
40+
{"/a/b/c", [][2]string{{"abc", "abc-value"}}},
41+
{"/foo/bar", [][2]string{{"foobar", "foobar-value"}}},
42+
}
43+
44+
mergeWith := [][2]string{{"Access-Control-Allow-Origin", "*"}, {"Access-Control-Allow-Headers", "*"}}
45+
merged := ps.mergePrefixMatched(mergeWith, util.HasUrlPrefixDir, "/a/b")
46+
if len(mergeWith) != 2 {
47+
t.Error()
48+
}
49+
if len(merged) != 4 || merged[2][0] != "a" || merged[3][0] != "ab" {
50+
t.Error(merged)
51+
}
52+
53+
merged = ps.mergePrefixMatched(nil, util.HasUrlPrefixDir, "/lorem/ipsum")
54+
if merged != nil {
55+
t.Error(merged)
56+
}
57+
58+
successors := ps.filterSuccessor(util.HasUrlPrefixDir, "/a/b")
59+
if len(successors) != 1 || successors[0].path != "/a/b/c" {
60+
t.Error(successors)
61+
}
62+
}

src/serverHandler/vhostHandler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ type vhostContext struct {
2525
restrictAccessUrls pathStringsList
2626
restrictAccessDirs pathStringsList
2727

28-
headersUrls []pathHeaders
29-
headersDirs []pathHeaders
28+
headersUrls pathHeadersList
29+
headersDirs pathHeadersList
3030

3131
vary string
3232
}

0 commit comments

Comments
 (0)