Skip to content

Commit 3861e74

Browse files
committed
refactor(serverHandler): refine virtual FileInfo
- use immediate data instead of pointer for virtual FileInfo - rename `fakeFileInfo` to `placeholderFileInfo` - add case-sesitive version for virtual FileInfo - add a utility function to create virtual FileInfo
1 parent d07680e commit 3861e74

File tree

6 files changed

+91
-60
lines changed

6 files changed

+91
-60
lines changed

src/serverHandler/archive.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,15 @@ func (h *handler) visitTreeNode(
6363
if os.IsExist(err) {
6464
return err
6565
}
66-
fInfo = newFakeFileInfo(path.Base(fsPath), true) // prefix path for alias
66+
fInfo = createPlaceholderFileInfo(path.Base(fsPath), true) // prefix path for alias
6767
} else {
6868
fInfo, err = f.Stat()
6969
if h.errHandler.LogError(err) {
7070
return err
7171
}
7272
}
7373
} else {
74-
fInfo = newFakeFileInfo(path.Base(fsPath), true)
74+
fInfo = createPlaceholderFileInfo(path.Base(fsPath), true)
7575
}
7676

7777
if len(relPath) > 0 {

src/serverHandler/fakeFileInfo.go

Lines changed: 0 additions & 41 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package serverHandler
2+
3+
import (
4+
"os"
5+
"time"
6+
)
7+
8+
var initTime = time.Now()
9+
10+
type placeholderFileInfo struct {
11+
name string
12+
isDir bool
13+
}
14+
15+
func (info placeholderFileInfo) Name() string {
16+
return info.name
17+
}
18+
19+
func (info placeholderFileInfo) Size() int64 {
20+
return 0
21+
}
22+
23+
func (info placeholderFileInfo) Mode() os.FileMode {
24+
return 0
25+
}
26+
27+
func (info placeholderFileInfo) ModTime() time.Time {
28+
return initTime
29+
}
30+
31+
func (info placeholderFileInfo) IsDir() bool {
32+
return info.isDir
33+
}
34+
35+
func (info placeholderFileInfo) Sys() interface{} {
36+
return nil
37+
}
38+
39+
func createPlaceholderFileInfo(name string, isDir bool) placeholderFileInfo {
40+
return placeholderFileInfo{name, isDir}
41+
}
42+
43+
type placeholderFileInfoNoCase struct {
44+
placeholderFileInfo
45+
}
46+
47+
func createPlaceholderFileInfoNoCase(name string, isDir bool) placeholderFileInfoNoCase {
48+
return placeholderFileInfoNoCase{placeholderFileInfo{name, isDir}}
49+
}

src/serverHandler/renamedFileInfo.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,18 @@ type renamedFileInfo struct {
77
os.FileInfo
88
}
99

10-
func (info *renamedFileInfo) Name() string {
10+
func (info renamedFileInfo) Name() string {
1111
return info.name
1212
}
1313

14-
func newRenamedFileInfo(name string, fileInfo os.FileInfo) *renamedFileInfo {
15-
return &renamedFileInfo{name, fileInfo}
14+
func createRenamedFileInfo(name string, fileInfo os.FileInfo) renamedFileInfo {
15+
return renamedFileInfo{name, fileInfo}
16+
}
17+
18+
type renamedFileInfoNoCase struct {
19+
renamedFileInfo
20+
}
21+
22+
func createRenamedFileInfoNoCase(name string, fileInfo os.FileInfo) renamedFileInfoNoCase {
23+
return renamedFileInfoNoCase{renamedFileInfo{name, fileInfo}}
1624
}

src/serverHandler/responseData.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ func (h *handler) mergeAlias(
142142
if !ok {
143143
continue
144144
}
145+
aliasCaseSensitive := alias.caseSensitive()
145146

146147
var fsItem os.FileInfo
147148
if isChildAlias { // reached second-deepest path of alias
@@ -161,26 +162,23 @@ func (h *handler) mergeAlias(
161162
continue
162163
}
163164
matchExisted = true
164-
var aliasSubItem os.FileInfo
165+
var baseItem os.FileInfo
165166
if fsItem != nil {
166-
aliasSubItem = newRenamedFileInfo(subItem.Name(), fsItem)
167+
baseItem = fsItem
167168
} else {
168-
aliasSubItem = newRenamedFileInfo(subItem.Name(), subItem)
169+
baseItem = subItem
169170
}
171+
aliasSubItem := createVirtualFileInfo(subItem.Name(), baseItem, aliasCaseSensitive)
170172
aliasSubItems = append(aliasSubItems, aliasSubItem)
171173
subItems[i] = aliasSubItem
172-
if alias.caseSensitive() {
174+
if aliasCaseSensitive {
173175
break
174176
}
175177
}
176178

177179
if !matchExisted {
178-
var aliasSubItem os.FileInfo
179-
if fsItem != nil {
180-
aliasSubItem = newRenamedFileInfo(subName, fsItem)
181-
} else {
182-
aliasSubItem = newFakeFileInfo(subName, true)
183-
}
180+
// fsItem could be nil
181+
aliasSubItem := createVirtualFileInfo(subName, fsItem, aliasCaseSensitive)
184182
aliasSubItems = append(aliasSubItems, aliasSubItem)
185183
subItems = append(subItems, aliasSubItem)
186184
}

src/serverHandler/util.go

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,28 @@ func getCompressWriter(w http.ResponseWriter, r *http.Request) (wr io.WriteClose
6969
return wr, encoding, true
7070
}
7171

72-
func isVirtual(info os.FileInfo) bool {
73-
if _, isRenamedInfo := info.(*renamedFileInfo); isRenamedInfo {
74-
return true
72+
func createVirtualFileInfo(name string, refItem os.FileInfo, caseSensitive bool) os.FileInfo {
73+
if refItem != nil {
74+
if caseSensitive {
75+
return createRenamedFileInfo(name, refItem)
76+
} else {
77+
return createRenamedFileInfoNoCase(name, refItem)
78+
}
79+
} else {
80+
if caseSensitive {
81+
return createPlaceholderFileInfo(name, true)
82+
} else {
83+
return createPlaceholderFileInfoNoCase(name, true)
84+
}
7585
}
76-
if _, isFakeInfo := info.(*fakeFileInfo); isFakeInfo {
86+
}
87+
88+
func isVirtual(info os.FileInfo) bool {
89+
switch info.(type) {
90+
case placeholderFileInfo:
91+
case renamedFileInfo:
92+
case placeholderFileInfoNoCase:
93+
case renamedFileInfoNoCase:
7794
return true
7895
}
7996
return false

0 commit comments

Comments
 (0)