Source file
src/net/http/example_filesystem_test.go
1
2
3
4
5 package http_test
6
7 import (
8 "io/fs"
9 "log"
10 "net/http"
11 "os"
12 "slices"
13 "strings"
14 )
15
16
17
18 func containsDotFile(name string) bool {
19 if name == "." {
20 return false
21 }
22 for part := range strings.SplitSeq(name, "/") {
23 if strings.HasPrefix(part, ".") {
24 return true
25 }
26 }
27 return false
28 }
29
30
31
32
33 type dotFileHidingFile struct {
34 fs.ReadDirFile
35 }
36
37
38
39 func (f dotFileHidingFile) ReadDir(n int) ([]fs.DirEntry, error) {
40 ents, err := f.ReadDirFile.ReadDir(n)
41 ents = slices.DeleteFunc(ents, func(ent fs.DirEntry) bool {
42 return strings.HasPrefix(ent.Name(), ".")
43 })
44 return ents, err
45 }
46
47
48
49 type dotFileHidingFileSystem struct {
50 fs.FS
51 }
52
53
54
55
56 func (fsys dotFileHidingFileSystem) Open(name string) (fs.File, error) {
57 if containsDotFile(name) {
58 return nil, fs.ErrPermission
59 }
60 file, err := fsys.FS.Open(name)
61 if rdf, ok := file.(fs.ReadDirFile); ok {
62 file = dotFileHidingFile{rdf}
63 }
64 return file, err
65 }
66
67
68
69
70
71 func ExampleFileServerFS_dotFileHiding() {
72 root, err := os.OpenRoot("doc")
73 if err != nil {
74 log.Fatal(err)
75 }
76 fsys := dotFileHidingFileSystem{root.FS()}
77 handler := http.FileServerFS(fsys)
78 log.Fatal(http.ListenAndServe(":8080", handler))
79 }
80
View as plain text