@@ -15,6 +15,10 @@ const (
15
15
tarGzKey = "tar.gz"
16
16
tarGzValue = "true"
17
17
tarGzContentType = "application/x-tar+gzip"
18
+
19
+ zipKey = "zip"
20
+ zipValue = "true"
21
+ zipContentType = "application/zip"
18
22
)
19
23
20
24
type fileHandler struct {
@@ -35,13 +39,20 @@ func (f *fileHandler) serveStatus(w http.ResponseWriter, r *http.Request, status
35
39
w .Write ([]byte (http .StatusText (status )))
36
40
}
37
41
38
- func (f * fileHandler ) serveZip (w http.ResponseWriter , r * http.Request , path string ) {
42
+ func (f * fileHandler ) serveTarGz (w http.ResponseWriter , r * http.Request , path string ) {
39
43
w .Header ().Set ("Content-Type" , tarGzContentType )
40
44
name := filepath .Base (path ) + ".tar.gz"
41
45
w .Header ().Set ("Content-Disposition" , fmt .Sprintf (`attachment; filename=%q` , name ))
42
46
tarGz (w , path )
43
47
}
44
48
49
+ func (f * fileHandler ) serveZip (w http.ResponseWriter , r * http.Request , path string ) {
50
+ w .Header ().Set ("Content-Type" , zipContentType )
51
+ name := filepath .Base (path ) + ".zip"
52
+ w .Header ().Set ("Content-Disposition" , fmt .Sprintf (`attachment; filename=%q` , name ))
53
+ zip (w , path )
54
+ }
55
+
45
56
func (f * fileHandler ) serveDir (w http.ResponseWriter , r * http.Request , dirPath string ) {
46
57
d , err := os .Open (dirPath )
47
58
if err != nil {
@@ -77,6 +88,13 @@ func (f *fileHandler) serveDir(w http.ResponseWriter, r *http.Request, dirPath s
77
88
fmt .Fprintf (w , "<p>\n " )
78
89
fmt .Fprintf (w , "<a href=\" %s\" >Entire directory as .tar.gz</a>\n " , url .String ())
79
90
fmt .Fprintf (w , "</p>\n " )
91
+ url .RawQuery = ""
92
+ q = url .Query ()
93
+ q .Set (zipKey , zipValue )
94
+ url .RawQuery = q .Encode ()
95
+ fmt .Fprintf (w , "<p>\n " )
96
+ fmt .Fprintf (w , "<a href=\" %s\" >Entire directory as .zip</a>\n " , url .String ())
97
+ fmt .Fprintf (w , "</p>\n " )
80
98
}
81
99
}
82
100
@@ -98,8 +116,10 @@ func (f *fileHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
98
116
f .serveStatus (w , r , http .StatusForbidden )
99
117
case err != nil :
100
118
f .serveStatus (w , r , http .StatusInternalServerError )
101
- case r .URL .Query ().Get (tarGzKey ) != "" :
119
+ case r .URL .Query ().Get (zipKey ) != "" :
102
120
f .serveZip (w , r , path )
121
+ case r .URL .Query ().Get (tarGzKey ) != "" :
122
+ f .serveTarGz (w , r , path )
103
123
case info .IsDir ():
104
124
f .serveDir (w , r , path )
105
125
default :
0 commit comments