/
renderer.go
97 lines (80 loc) · 1.64 KB
/
renderer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package fileserver
import (
"fmt"
"io"
"net/url"
"os"
"path/filepath"
"strings"
"github.com/golang/glog"
)
type renderer interface {
Init(w io.Writer, title string) error
Walk(path string, finfo os.FileInfo, err error) error
Flush() error
}
func render(r renderer, w io.Writer, title, reqPath string) error {
err := r.Init(w, title)
if err != nil {
return err
}
err = filepath.Walk(reqPath, r.Walk)
if err != nil {
return err
}
return r.Flush()
}
type relativeRenderer struct {
renderer
root string
}
func (r *relativeRenderer) Walk(path string, finfo os.FileInfo, err error) error {
if r.root != "" {
return r.renderer.Walk(strings.TrimPrefix(path, r.root), finfo, err)
}
if err != nil {
return err
}
r.root = path + "/"
return nil
}
type renderType int
const (
renderTypeHTML renderType = iota
renderTypeTAR
renderTypeZIP
)
func getRenderType(d DirPolicy, url *url.URL) renderType {
if d < AllowArchives {
return renderTypeHTML
}
mode := url.Query().Get("m")
if mode == "" {
return renderTypeHTML
}
switch mode {
case "html":
return renderTypeHTML
case "tar":
return renderTypeTAR
case "zip":
return renderTypeZIP
default:
glog.Warningf("Unknown renderer %v", mode)
return renderTypeHTML
}
}
func getRenderer(r renderType, root string) renderer {
switch r {
case renderTypeHTML:
return &relativeRenderer{renderer: &htmlRenderer{}}
case renderTypeTAR:
return &relativeRenderer{renderer: &tarRenderer{root: root}}
case renderTypeZIP:
return &relativeRenderer{renderer: &zipRenderer{root: root}}
default:
err := fmt.Errorf("Unknown renderer %v", r)
glog.Error(err)
panic(err)
}
}