httpdir - directory.go
1 package httpdir
2
3 import (
4 "io"
5 "io/fs"
6 "sort"
7 "time"
8 )
9
10 type dir struct {
11 index bool
12 contents map[string]Node
13 modTime time.Time
14 }
15
16 func (d dir) Size() int64 {
17 return 0
18 }
19
20 func (dir) Mode() fs.FileMode {
21 return ModeDir
22 }
23
24 func (d dir) ModTime() time.Time {
25 return d.modTime
26 }
27
28 func (d dir) Open() (File, error) {
29 if !d.index {
30 if f, ok := d.contents["index.html"]; ok {
31 return f.Open()
32 }
33 return nil, fs.ErrPermission
34 }
35 contents := make([]fs.FileInfo, 0, len(d.contents))
36 for name, node := range d.contents {
37 contents = append(contents, namedNode{name, node})
38 }
39 dir := &directory{
40 contents: contents,
41 }
42 sort.Sort(dir)
43 return dir, nil
44 }
45
46 func (d dir) Remove(name string) error {
47 _, ok := d.contents[name]
48 if !ok {
49 return fs.ErrNotExist
50 }
51 delete(d.contents, name)
52 return nil
53 }
54
55 type directory struct {
56 contents []fs.FileInfo
57 pos int
58 }
59
60 func (directory) Close() error {
61 return nil
62 }
63
64 func (directory) Read([]byte) (int, error) {
65 return 0, fs.ErrInvalid
66 }
67
68 func (d *directory) Seek(offset int64, whence int) (int64, error) {
69 pos := int64(d.pos)
70 switch whence {
71 case io.SeekStart:
72 pos = offset
73 case io.SeekCurrent:
74 pos += offset
75 case io.SeekEnd:
76 pos = int64(len(d.contents)) + offset
77 }
78 if pos != 0 {
79 return 0, fs.ErrInvalid
80 }
81 d.pos = 0
82 return 0, nil
83 }
84
85 func (d *directory) Readdir(n int) ([]fs.FileInfo, error) {
86 if n < 0 || d.pos+n > len(d.contents) {
87 n = len(d.contents) - d.pos
88 }
89 last := d.pos + n
90 toRet := d.contents[d.pos:last]
91 if len(toRet) == 0 {
92 return nil, io.EOF
93 }
94 d.pos = last
95 return toRet, nil
96 }
97
98 func (d *directory) Len() int {
99 return len(d.contents)
100 }
101
102 func (d *directory) Less(i, j int) bool {
103 return d.contents[i].Name() < d.contents[j].Name()
104 }
105
106 func (d *directory) Swap(i, j int) {
107 d.contents[i], d.contents[j] = d.contents[j], d.contents[i]
108 }
109