Skip to content

Commit 240efbf

Browse files
committed
perf(serverHandler): separate subItems info
- separate subItems and subItemsHtml - subItem's `bytesNames` only exists in sort function BREAK CHANGE: Getting HTML formatted sub items in template changed. Before: ``` {{range .SubItems}}{{with .Html}} {{end}}{{end}} ``` After: ``` {{range .SubItemsHtml}} {{end}} ```
1 parent 4d7a76a commit 240efbf

File tree

5 files changed

+33
-50
lines changed

5 files changed

+33
-50
lines changed

src/serverHandler/json.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ func getJsonData(data *responseData) *jsonResponseData {
3737

3838
if data.Item.IsDir() {
3939
subItems = make([]*jsonItem, len(data.SubItems))
40-
for i, dataItem := range data.SubItems {
41-
subItems[i] = getJsonItem(dataItem.Info)
40+
for i := range data.SubItems {
41+
subItems[i] = getJsonItem(data.SubItems[i])
4242
}
4343
}
4444
}

src/serverHandler/page.go

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

8-
func updateSubItemsForPage(subItems []*subItem) {
9-
for _, item := range subItems {
10-
info := item.Info
8+
func updateSubItemsHtml(data *responseData) {
9+
length := len(data.SubItems)
10+
11+
data.SubItemsHtml = make([]*itemHtml, length)
12+
13+
for i := 0; i < length; i++ {
14+
info := data.SubItems[i]
1115
name := info.Name()
12-
item.Html = &itemHtml{
16+
17+
data.SubItemsHtml[i] = &itemHtml{
1318
IsDir: info.IsDir(),
1419
Link: name,
1520
Name: tplutil.FormatFilename(name),
@@ -27,7 +32,7 @@ func (h *handler) page(w http.ResponseWriter, r *http.Request, data *responseDat
2732
w.WriteHeader(data.Status)
2833

2934
if needResponseBody(r.Method) {
30-
updateSubItemsForPage(data.SubItems)
35+
updateSubItemsHtml(data)
3136
err := h.template.Execute(w, data)
3237
h.errHandler.LogError(err)
3338
}

src/serverHandler/responseData.go

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ type pathEntry struct {
1616
Path string `json:"path"`
1717
}
1818

19-
type itemSort struct {
20-
Name []byte
21-
}
22-
2319
type itemHtml struct {
2420
IsDir bool
2521
Link string
@@ -28,13 +24,6 @@ type itemHtml struct {
2824
ModTime template.HTML
2925
}
3026

31-
type subItem struct {
32-
sort itemSort
33-
34-
Info os.FileInfo
35-
Html *itemHtml
36-
}
37-
3827
type responseData struct {
3928
rawReqPath string
4029
handlerReqPath string
@@ -49,7 +38,8 @@ type responseData struct {
4938
File *os.File
5039
Item os.FileInfo
5140
ItemName string
52-
SubItems []*subItem
41+
SubItems []os.FileInfo
42+
SubItemsHtml []*itemHtml
5343
SubItemPrefix string
5444

5545
CanUpload bool
@@ -212,37 +202,26 @@ func getItemName(info os.FileInfo, r *http.Request) (itemName string) {
212202
return
213203
}
214204

215-
func getSubItems(subInfos []os.FileInfo) []*subItem {
216-
subItems := make([]*subItem, len(subInfos))
217-
218-
for i := 0; i < len(subInfos); i++ {
219-
info := subInfos[i]
220-
subItems[i] = &subItem{
221-
sort: itemSort{
222-
Name: []byte(info.Name()),
223-
},
224-
Info: info,
225-
}
205+
func sortSubItems(subInfos []os.FileInfo) {
206+
names := make([][]byte, len(subInfos))
207+
for i := range subInfos {
208+
names[i] = []byte(subInfos[i].Name())
226209
}
227210

228-
return subItems
229-
}
230-
231-
func sortSubItems(subItems []*subItem) {
232211
sort.Slice(
233-
subItems,
212+
subInfos,
234213
func(prevIndex, nextIndex int) bool {
235-
prevItem := subItems[prevIndex]
236-
nextItem := subItems[nextIndex]
214+
prevInfo := subInfos[prevIndex]
215+
nextInfo := subInfos[nextIndex]
237216

238-
prevIsDir := prevItem.Info.IsDir()
239-
nextIsDir := nextItem.Info.IsDir()
217+
prevIsDir := prevInfo.IsDir()
218+
nextIsDir := nextInfo.IsDir()
240219

241220
if prevIsDir != nextIsDir {
242221
return prevIsDir
243222
}
244223

245-
return util.CompareNumInStr(prevItem.sort.Name, nextItem.sort.Name)
224+
return util.CompareNumInStr(names[prevIndex], names[nextIndex])
246225
},
247226
)
248227
}
@@ -342,13 +321,13 @@ func (h *handler) getResponseData(r *http.Request) (data *responseData) {
342321

343322
itemName := getItemName(item, r)
344323

345-
subInfos, _readdirErr := readdir(file, item, needResponseBody(r.Method))
324+
subItems, _readdirErr := readdir(file, item, needResponseBody(r.Method))
346325
if _readdirErr != nil {
347326
errs = append(errs, _readdirErr)
348327
status = http.StatusInternalServerError
349328
}
350329

351-
subInfos, _mergeErrs := h.mergeAlias(rawReqPath, item, subInfos)
330+
subItems, _mergeErrs := h.mergeAlias(rawReqPath, item, subItems)
352331
if len(_mergeErrs) > 0 {
353332
errs = append(errs, _mergeErrs...)
354333
status = http.StatusInternalServerError
@@ -358,15 +337,13 @@ func (h *handler) getResponseData(r *http.Request) (data *responseData) {
358337
status = http.StatusNotFound
359338
}
360339

361-
subInfos = h.FilterItems(subInfos)
362-
363-
subItems := getSubItems(subInfos)
340+
subItems = h.FilterItems(subItems)
364341
sortSubItems(subItems)
365342

366343
subItemPrefix := getSubItemPrefix(reqPath, tailSlash)
367344

368345
canUpload := h.getCanUpload(item, rawReqPath, reqFsPath)
369-
canArchive := h.getCanArchive(subInfos, rawReqPath, reqFsPath)
346+
canArchive := h.getCanArchive(subItems, rawReqPath, reqFsPath)
370347
canCors := h.getCanCors(rawReqPath, reqFsPath)
371348
needAuth := h.getNeedAuth(rawReqPath, reqFsPath)
372349

@@ -385,6 +362,7 @@ func (h *handler) getResponseData(r *http.Request) (data *responseData) {
385362
Item: item,
386363
ItemName: itemName,
387364
SubItems: subItems,
365+
SubItemsHtml: nil,
388366
SubItemPrefix: subItemPrefix,
389367

390368
CanUpload: canUpload,

src/tpl/page.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@
4545
<span class="time"></span>
4646
</a>
4747
</li>
48-
{{range .SubItems}}{{with .Html}}
48+
{{range .SubItemsHtml}}
4949
<li class="{{if .IsDir}}dir{{else}}file{{end}}">
5050
<a href="{{$subItemPrefix}}{{.Link}}{{if .IsDir}}/{{end}}">
5151
<span class="name">{{.Name}}{{if .IsDir}}/{{end}}</span>
5252
<span class="size">{{if not .IsDir}}{{.Size}}{{end}}</span>
5353
<span class="time">{{.ModTime}}</span>
5454
</a>
5555
</li>
56-
{{end}}{{end}}
56+
{{end}}
5757
</ul>
5858

5959
{{if eq .Status 403}}

src/tpl/page.html.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,15 @@ const pageTplStr = `
5050
<span class="time"></span>
5151
</a>
5252
</li>
53-
{{range .SubItems}}{{with .Html}}
53+
{{range .SubItemsHtml}}
5454
<li class="{{if .IsDir}}dir{{else}}file{{end}}">
5555
<a href="{{$subItemPrefix}}{{.Link}}{{if .IsDir}}/{{end}}">
5656
<span class="name">{{.Name}}{{if .IsDir}}/{{end}}</span>
5757
<span class="size">{{if not .IsDir}}{{.Size}}{{end}}</span>
5858
<span class="time">{{.ModTime}}</span>
5959
</a>
6060
</li>
61-
{{end}}{{end}}
61+
{{end}}
6262
</ul>
6363
{{if eq .Status 403}}
6464
<div class="error">403 resource is forbidden</div>

0 commit comments

Comments
 (0)