Skip to content

Commit 500f08d

Browse files
committed
refactor(serverHandler): use pathContext to manage contextual query string
As the whole query string is output at once, "/"(like "/n") after "?" will not be escaped. So there is no need to use `template.HTML` any more to prevent "/" being escaped.
1 parent 9005bf6 commit 500f08d

File tree

9 files changed

+105
-74
lines changed

9 files changed

+105
-74
lines changed

src/serverHandler/json.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func getJsonData(data *responseData) *jsonResponseData {
6060
Path: data.Path,
6161
Paths: data.Paths,
6262
SubItemPrefix: data.SubItemPrefix,
63-
ContextQueryString: string(data.ContextQueryString),
63+
ContextQueryString: data.Context.QueryString(),
6464
CanUpload: data.CanUpload,
6565
CanMkdir: data.CanMkdir,
6666
CanDelete: data.CanDelete,

src/serverHandler/page.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,7 @@ func updateSubItemsHtml(data *responseData) {
2525
if info.IsDir() {
2626
displayName = tplutil.FormatFilename(name) + "/"
2727
typ = TypeDir
28-
if len(data.ContextQueryString) > 0 {
29-
url = data.SubItemPrefix + name + "/" + string(data.ContextQueryString)
30-
} else {
31-
url = data.SubItemPrefix + name + "/"
32-
}
28+
url = data.SubItemPrefix + name + "/" + data.Context.QueryString()
3329
} else {
3430
displayName = tplutil.FormatFilename(name)
3531
typ = TypeFile

src/serverHandler/pathContext.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package serverHandler
2+
3+
type pathContext struct {
4+
sort string
5+
}
6+
7+
func (ctx *pathContext) QueryString() string {
8+
if len(ctx.sort) > 0 {
9+
return "?sort=" + ctx.sort
10+
} else {
11+
return ""
12+
}
13+
}
14+
15+
func (ctx *pathContext) QueryStringOfSort(sort string) string {
16+
copiedCtx := *ctx
17+
copiedCtx.sort = sort
18+
return copiedCtx.QueryString()
19+
}

src/serverHandler/pathContext_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package serverHandler
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestPathContext(t *testing.T) {
8+
var result string
9+
10+
ctx := &pathContext{}
11+
result = ctx.QueryString()
12+
if result != "" {
13+
t.Error(result)
14+
}
15+
16+
ctx.sort = "/n"
17+
result = ctx.QueryString()
18+
if result != "?sort=/n" {
19+
t.Error(result)
20+
}
21+
22+
}

src/serverHandler/responseData.go

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,19 @@ type responseData struct {
3131
errors []error
3232
Status int
3333

34-
IsRoot bool
35-
Path string
36-
Paths []*pathEntry
37-
RootRelPath string
38-
File *os.File
39-
Item os.FileInfo
40-
ItemName string
41-
SubItems []os.FileInfo
42-
AliasSubItems []os.FileInfo
43-
SubItemsHtml []*itemHtml
44-
SubItemPrefix string
45-
SortState SortState
46-
ContextQueryString template.HTML
34+
IsRoot bool
35+
Path string
36+
Paths []*pathEntry
37+
RootRelPath string
38+
File *os.File
39+
Item os.FileInfo
40+
ItemName string
41+
SubItems []os.FileInfo
42+
AliasSubItems []os.FileInfo
43+
SubItemsHtml []*itemHtml
44+
SubItemPrefix string
45+
SortState SortState
46+
Context *pathContext
4747

4848
CanUpload bool
4949
CanMkdir bool
@@ -340,10 +340,7 @@ func (h *handler) getResponseData(r *http.Request) *responseData {
340340

341341
subItemPrefix := getSubItemPrefix(rawReqPath, tailSlash)
342342

343-
var contextQueryString template.HTML
344-
if len(rawSortBy) > 0 {
345-
contextQueryString = "?sort=" + template.HTML(rawSortBy)
346-
}
343+
context := &pathContext{sort: rawSortBy}
347344

348345
canUpload := h.getCanUpload(item, rawReqPath, reqFsPath)
349346
canMkdir := h.getCanMkdir(item, rawReqPath, reqFsPath)
@@ -377,19 +374,19 @@ func (h *handler) getResponseData(r *http.Request) *responseData {
377374
errors: errs,
378375
Status: status,
379376

380-
IsRoot: isRoot,
381-
Path: rawReqPath,
382-
Paths: pathEntries,
383-
RootRelPath: rootRelPath,
384-
File: file,
385-
Item: item,
386-
ItemName: itemName,
387-
SubItems: subItems,
388-
AliasSubItems: aliasSubItems,
389-
SubItemsHtml: nil,
390-
SubItemPrefix: subItemPrefix,
391-
SortState: sortState,
392-
ContextQueryString: contextQueryString,
377+
IsRoot: isRoot,
378+
Path: rawReqPath,
379+
Paths: pathEntries,
380+
RootRelPath: rootRelPath,
381+
File: file,
382+
Item: item,
383+
ItemName: itemName,
384+
SubItems: subItems,
385+
AliasSubItems: aliasSubItems,
386+
SubItemsHtml: nil,
387+
SubItemPrefix: subItemPrefix,
388+
SortState: sortState,
389+
Context: context,
393390

394391
CanUpload: canUpload,
395392
CanMkdir: canMkdir,

src/serverHandler/sortState.go

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package serverHandler
22

3-
import "html/template"
4-
53
type dirSort int
64

75
const (
@@ -15,34 +13,42 @@ type SortState struct {
1513
key byte
1614
}
1715

18-
func (info SortState) mergeDirWithKey(key byte) template.HTML {
16+
func (info SortState) DirSort() dirSort {
17+
return info.dirSort
18+
}
19+
20+
func (info SortState) Key() string {
21+
return string(info.key)
22+
}
23+
24+
func (info SortState) mergeDirWithKey(key byte) string {
1925
switch info.dirSort {
2026
case dirSortFirst:
21-
return "/" + template.HTML(key)
27+
return "/" + string(key)
2228
case dirSortLast:
23-
return template.HTML(key) + "/"
29+
return string(key) + "/"
2430
default:
25-
return template.HTML(key)
31+
return string(key)
2632
}
2733
}
2834

29-
func (info SortState) CurrentSort() template.HTML {
35+
func (info SortState) CurrentSort() string {
3036
return info.mergeDirWithKey(info.key)
3137
}
3238

33-
func (info SortState) NextDirSort() template.HTML {
39+
func (info SortState) NextDirSort() string {
3440
switch info.dirSort {
3541
case dirSortFirst: // next is dirSortLast
36-
return template.HTML(info.key) + "/"
42+
return string(info.key) + "/"
3743
case dirSortLast: // next is dirSortMixed
38-
return template.HTML(info.key)
44+
return string(info.key)
3945
case dirSortMixed: // next is dirSortFirst
40-
return "/" + template.HTML(info.key)
46+
return "/" + string(info.key)
4147
}
42-
return "/" + template.HTML(info.key)
48+
return "/" + string(info.key)
4349
}
4450

45-
func (info SortState) NextNameSort() template.HTML {
51+
func (info SortState) NextNameSort() string {
4652
var nextKey byte
4753
switch info.key {
4854
case 'n':
@@ -53,7 +59,7 @@ func (info SortState) NextNameSort() template.HTML {
5359
return info.mergeDirWithKey(nextKey)
5460
}
5561

56-
func (info SortState) NextSizeSort() template.HTML {
62+
func (info SortState) NextSizeSort() string {
5763
var nextKey byte
5864
switch info.key {
5965
case 's':
@@ -64,7 +70,7 @@ func (info SortState) NextSizeSort() template.HTML {
6470
return info.mergeDirWithKey(nextKey)
6571
}
6672

67-
func (info SortState) NextTimeSort() template.HTML {
73+
func (info SortState) NextTimeSort() string {
6874
var nextKey byte
6975
switch info.key {
7076
case 't':
@@ -74,11 +80,3 @@ func (info SortState) NextTimeSort() template.HTML {
7480
}
7581
return info.mergeDirWithKey(nextKey)
7682
}
77-
78-
func (info SortState) DirSort() dirSort {
79-
return info.dirSort
80-
}
81-
82-
func (info SortState) Key() template.HTML {
83-
return template.HTML(info.key)
84-
}

src/serverHandler/sortState_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package serverHandler
22

33
import (
4-
"html/template"
54
"testing"
65
)
76

87
func TestSortState_DirState(t *testing.T) {
9-
var sortBy template.HTML
8+
var sortBy string
109
state := SortState{dirSortFirst, 'n'}
1110

1211
sortBy = state.CurrentSort()
@@ -33,7 +32,7 @@ func TestSortState_DirState(t *testing.T) {
3332
}
3433

3534
func TestSortState_KeyState(t *testing.T) {
36-
var sortBy template.HTML
35+
var sortBy string
3736
state := SortState{dirSortFirst, 'n'}
3837

3938
sortBy = state.NextNameSort()

src/tpl/page.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<link rel="stylesheet" type="text/css" href="{{.RootRelPath}}/../assert/main.css"/>
1212
</head>
1313
<body class="{{if .IsRoot}}root-dir{{else}}sub-dir{{end}}">
14-
{{$contextQueryString := .ContextQueryString}}
14+
{{$contextQueryString := .Context.QueryString}}
1515
<ol class="path-list">
1616
{{range .Paths}}
1717
<li><a href="{{.Path}}{{$contextQueryString}}">{{fmtFilename .Name}}</a></li>
@@ -56,14 +56,14 @@
5656
<ul class="item-list{{if .HasDeletable}} has-deletable{{end}}">
5757
<li class="header">{{$dirSort := .SortState.DirSort}}{{$sortKey := .SortState.Key}}
5858
<span class="detail">
59-
<a class="field dir" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextDirSort}}">Dir{{if eq $dirSort -1}}&uarr;{{else if eq $dirSort 1}}&darr;{{end}}</a>
60-
<a class="field name" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextNameSort}}">Name{{if eq $sortKey "n"}}&uarr;{{else if eq $sortKey "N"}}&darr;{{end}}</a>
61-
<a class="field size" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextSizeSort}}">Size{{if eq $sortKey "s"}}&uarr;{{else if eq $sortKey "S"}}&darr;{{end}}</a>
62-
<a class="field time" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextTimeSort}}">Time{{if eq $sortKey "t"}}&uarr;{{else if eq $sortKey "T"}}&darr;{{end}}</a>
59+
<a class="field dir" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextDirSort}}">Dir{{if eq $dirSort -1}}&uarr;{{else if eq $dirSort 1}}&darr;{{end}}</a>
60+
<a class="field name" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextNameSort}}">Name{{if eq $sortKey "n"}}&uarr;{{else if eq $sortKey "N"}}&darr;{{end}}</a>
61+
<a class="field size" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextSizeSort}}">Size{{if eq $sortKey "s"}}&uarr;{{else if eq $sortKey "S"}}&darr;{{end}}</a>
62+
<a class="field time" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextTimeSort}}">Time{{if eq $sortKey "t"}}&uarr;{{else if eq $sortKey "T"}}&darr;{{end}}</a>
6363
</span>
6464
</li>
6565
<li class="dir parent">
66-
<a href="{{if .IsRoot}}./{{else}}../{{end}}{{.ContextQueryString}}" class="detail">
66+
<a href="{{if .IsRoot}}./{{else}}../{{end}}{{$contextQueryString}}" class="detail">
6767
<span class="field name">../</span>
6868
<span class="field size"></span>
6969
<span class="field time"></span>

src/tpl/page.html.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const pageTplStr = `
2121
<link rel="stylesheet" type="text/css" href="{{.RootRelPath}}?assert=main.css"/>
2222
</head>
2323
<body class="{{if .IsRoot}}root-dir{{else}}sub-dir{{end}}">
24-
{{$contextQueryString := .ContextQueryString}}
24+
{{$contextQueryString := .Context.QueryString}}
2525
<ol class="path-list">
2626
{{range .Paths}}
2727
<li><a href="{{.Path}}{{$contextQueryString}}">{{fmtFilename .Name}}</a></li>
@@ -62,14 +62,14 @@ return confirm('Delete?\n' + name);
6262
<ul class="item-list{{if .HasDeletable}} has-deletable{{end}}">
6363
<li class="header">{{$dirSort := .SortState.DirSort}}{{$sortKey := .SortState.Key}}
6464
<span class="detail">
65-
<a class="field dir" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextDirSort}}">Dir{{if eq $dirSort -1}}&uarr;{{else if eq $dirSort 1}}&darr;{{end}}</a>
66-
<a class="field name" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextNameSort}}">Name{{if eq $sortKey "n"}}&uarr;{{else if eq $sortKey "N"}}&darr;{{end}}</a>
67-
<a class="field size" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextSizeSort}}">Size{{if eq $sortKey "s"}}&uarr;{{else if eq $sortKey "S"}}&darr;{{end}}</a>
68-
<a class="field time" href="{{.SubItemPrefix}}{{"?sort="}}{{.SortState.NextTimeSort}}">Time{{if eq $sortKey "t"}}&uarr;{{else if eq $sortKey "T"}}&darr;{{end}}</a>
65+
<a class="field dir" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextDirSort}}">Dir{{if eq $dirSort -1}}&uarr;{{else if eq $dirSort 1}}&darr;{{end}}</a>
66+
<a class="field name" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextNameSort}}">Name{{if eq $sortKey "n"}}&uarr;{{else if eq $sortKey "N"}}&darr;{{end}}</a>
67+
<a class="field size" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextSizeSort}}">Size{{if eq $sortKey "s"}}&uarr;{{else if eq $sortKey "S"}}&darr;{{end}}</a>
68+
<a class="field time" href="{{.SubItemPrefix}}{{.Context.QueryStringOfSort .SortState.NextTimeSort}}">Time{{if eq $sortKey "t"}}&uarr;{{else if eq $sortKey "T"}}&darr;{{end}}</a>
6969
</span>
7070
</li>
7171
<li class="dir parent">
72-
<a href="{{if .IsRoot}}./{{else}}../{{end}}{{.ContextQueryString}}" class="detail">
72+
<a href="{{if .IsRoot}}./{{else}}../{{end}}{{$contextQueryString}}" class="detail">
7373
<span class="field name">../</span>
7474
<span class="field size"></span>
7575
<span class="field time"></span>

0 commit comments

Comments
 (0)