diff options
author | Feuerfuchs <git@feuerfuchs.dev> | 2019-11-11 18:58:24 +0100 |
---|---|---|
committer | Feuerfuchs <git@feuerfuchs.dev> | 2019-11-11 18:58:24 +0100 |
commit | d0b3c432bdc80796f8854651b2822662a3ccef70 (patch) | |
tree | 7a970f50d43ffdb8c1d39411742b0e021cf122f7 /gopherproxy.go | |
parent | Protocol handlers for gopher are not supported by browsers (diff) | |
download | gopherproxy-d0b3c432bdc80796f8854651b2822662a3ccef70.tar.gz gopherproxy-d0b3c432bdc80796f8854651b2822662a3ccef70.tar.bz2 gopherproxy-d0b3c432bdc80796f8854651b2822662a3ccef70.zip |
Replaced UglifyJS with Terser, include whole asset path in struct, display errors in template instead of basic HTML
Diffstat (limited to 'gopherproxy.go')
-rw-r--r-- | gopherproxy.go | 63 |
1 files changed, 43 insertions, 20 deletions
diff --git a/gopherproxy.go b/gopherproxy.go index 6490b28..0b3279c 100644 --- a/gopherproxy.go +++ b/gopherproxy.go | |||
@@ -29,14 +29,14 @@ type Item struct { | |||
29 | Text string | 29 | Text string |
30 | } | 30 | } |
31 | 31 | ||
32 | type AssetHashList struct { | 32 | type AssetList struct { |
33 | Style string | 33 | Style string |
34 | JS string | 34 | JS string |
35 | FontW string | 35 | FontW string |
36 | FontW2 string | 36 | FontW2 string |
37 | } | 37 | } |
38 | 38 | ||
39 | func renderDirectory(w http.ResponseWriter, tpl *template.Template, assetHashList AssetHashList, uri string, hostport string, d gopher.Directory) error { | 39 | func renderDirectory(w http.ResponseWriter, tpl *template.Template, assetList AssetList, uri string, hostport string, d gopher.Directory) error { |
40 | var title string | 40 | var title string |
41 | 41 | ||
42 | out := make([]Item, len(d.Items)) | 42 | out := make([]Item, len(d.Items)) |
@@ -88,10 +88,11 @@ func renderDirectory(w http.ResponseWriter, tpl *template.Template, assetHashLis | |||
88 | return tpl.Execute(w, struct { | 88 | return tpl.Execute(w, struct { |
89 | Title string | 89 | Title string |
90 | URI string | 90 | URI string |
91 | AssetHashList AssetHashList | 91 | Assets AssetList |
92 | Lines []Item | 92 | Lines []Item |
93 | RawText string | 93 | RawText string |
94 | }{title, fmt.Sprintf("%s/%s", hostport, uri), assetHashList, out, ""}) | 94 | Error bool |
95 | }{title, fmt.Sprintf("%s/%s", hostport, uri), assetList, out, "", false}) | ||
95 | } | 96 | } |
96 | 97 | ||
97 | // GopherHandler returns a Handler that proxies requests | 98 | // GopherHandler returns a Handler that proxies requests |
@@ -99,7 +100,7 @@ func renderDirectory(w http.ResponseWriter, tpl *template.Template, assetHashLis | |||
99 | // to the request path and renders the content using the provided template. | 100 | // to the request path and renders the content using the provided template. |
100 | // The optional robots parameters points to a robotstxt.RobotsData struct | 101 | // The optional robots parameters points to a robotstxt.RobotsData struct |
101 | // to test user agents against a configurable robotst.txt file. | 102 | // to test user agents against a configurable robotst.txt file. |
102 | func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, assetHashList AssetHashList, robotsdebug bool, uri string) http.HandlerFunc { | 103 | func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, assetList AssetList, robotsdebug bool, uri string) http.HandlerFunc { |
103 | return func(w http.ResponseWriter, req *http.Request) { | 104 | return func(w http.ResponseWriter, req *http.Request) { |
104 | agent := req.UserAgent() | 105 | agent := req.UserAgent() |
105 | path := strings.TrimPrefix(req.URL.Path, "/") | 106 | path := strings.TrimPrefix(req.URL.Path, "/") |
@@ -124,7 +125,14 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
124 | 125 | ||
125 | uri, err := url.QueryUnescape(strings.Join(parts[1:], "/")) | 126 | uri, err := url.QueryUnescape(strings.Join(parts[1:], "/")) |
126 | if err != nil { | 127 | if err != nil { |
127 | io.WriteString(w, fmt.Sprintf("<b>Error:</b><pre>%s</pre>", err)) | 128 | tpl.Execute(w, struct { |
129 | Title string | ||
130 | URI string | ||
131 | Assets AssetList | ||
132 | RawText string | ||
133 | Lines []Item | ||
134 | Error bool | ||
135 | }{uri, fmt.Sprintf("%s/%s", hostport, uri), assetList, fmt.Sprintf("Error: %s", err), nil, true}) | ||
128 | return | 136 | return |
129 | } | 137 | } |
130 | 138 | ||
@@ -138,7 +146,14 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
138 | ) | 146 | ) |
139 | 147 | ||
140 | if err != nil { | 148 | if err != nil { |
141 | io.WriteString(w, fmt.Sprintf("<b>Error:</b><pre>%s</pre>", err)) | 149 | tpl.Execute(w, struct { |
150 | Title string | ||
151 | URI string | ||
152 | Assets AssetList | ||
153 | RawText string | ||
154 | Lines []Item | ||
155 | Error bool | ||
156 | }{uri, fmt.Sprintf("%s/%s", hostport, uri), assetList, fmt.Sprintf("Error: %s", err), nil, true}) | ||
142 | return | 157 | return |
143 | } | 158 | } |
144 | 159 | ||
@@ -152,10 +167,11 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
152 | tpl.Execute(w, struct { | 167 | tpl.Execute(w, struct { |
153 | Title string | 168 | Title string |
154 | URI string | 169 | URI string |
155 | AssetHashList AssetHashList | 170 | Assets AssetList |
156 | RawText string | 171 | RawText string |
157 | Lines []Item | 172 | Lines []Item |
158 | }{uri, fmt.Sprintf("%s/%s", hostport, uri), assetHashList, buf.String(), nil}) | 173 | Error bool |
174 | }{uri, fmt.Sprintf("%s/%s", hostport, uri), assetList, buf.String(), nil, false}) | ||
159 | } else if parts[1] == "T" { | 175 | } else if parts[1] == "T" { |
160 | _, _, err = vips.NewTransform(). | 176 | _, _, err = vips.NewTransform(). |
161 | Load(res.Body). | 177 | Load(res.Body). |
@@ -168,8 +184,15 @@ func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, ass | |||
168 | io.Copy(w, res.Body) | 184 | io.Copy(w, res.Body) |
169 | } | 185 | } |
170 | } else { | 186 | } else { |
171 | if err := renderDirectory(w, tpl, assetHashList, uri, hostport, res.Dir); err != nil { | 187 | if err := renderDirectory(w, tpl, assetList, uri, hostport, res.Dir); err != nil { |
172 | io.WriteString(w, fmt.Sprintf("<b>Error:</b><pre>%s</pre>", err)) | 188 | tpl.Execute(w, struct { |
189 | Title string | ||
190 | URI string | ||
191 | Assets AssetList | ||
192 | RawText string | ||
193 | Lines []Item | ||
194 | Error bool | ||
195 | }{uri, fmt.Sprintf("%s/%s", hostport, uri), assetList, fmt.Sprintf("Error: %s", err), nil, true}) | ||
173 | return | 196 | return |
174 | } | 197 | } |
175 | } | 198 | } |
@@ -268,25 +291,25 @@ func ListenAndServe(bind, robotsfile string, robotsdebug bool, vipsconcurrency i | |||
268 | if err != nil { | 291 | if err != nil { |
269 | fontdataw = []byte{} | 292 | fontdataw = []byte{} |
270 | } | 293 | } |
271 | fontwhash := fmt.Sprintf("%x", md5.Sum(fontdataw)) | 294 | fontwAsset := fmt.Sprintf("/iosevka-term-ss03-regular-%x.woff", md5.Sum(fontdataw)) |
272 | 295 | ||
273 | fontdataw2, err := box.Find("iosevka-term-ss03-regular.woff2") | 296 | fontdataw2, err := box.Find("iosevka-term-ss03-regular.woff2") |
274 | if err != nil { | 297 | if err != nil { |
275 | fontdataw2 = []byte{} | 298 | fontdataw2 = []byte{} |
276 | } | 299 | } |
277 | fontw2hash := fmt.Sprintf("%x", md5.Sum(fontdataw2)) | 300 | fontw2Asset := fmt.Sprintf("/iosevka-term-ss03-regular-%x.woff2", md5.Sum(fontdataw2)) |
278 | 301 | ||
279 | styledata, err := box.Find("style.css") | 302 | styledata, err := box.Find("style.css") |
280 | if err != nil { | 303 | if err != nil { |
281 | styledata = []byte{} | 304 | styledata = []byte{} |
282 | } | 305 | } |
283 | stylehash := fmt.Sprintf("%x", md5.Sum(styledata)) | 306 | styleAsset := fmt.Sprintf("/style-%x.css", md5.Sum(styledata)) |
284 | 307 | ||
285 | jsdata, err := box.Find("main.js") | 308 | jsdata, err := box.Find("main.js") |
286 | if err != nil { | 309 | if err != nil { |
287 | jsdata = []byte{} | 310 | jsdata = []byte{} |
288 | } | 311 | } |
289 | jshash := fmt.Sprintf("%x", md5.Sum(jsdata)) | 312 | jsAsset := fmt.Sprintf("/main-%x.js", md5.Sum(jsdata)) |
290 | 313 | ||
291 | favicondata, err := box.Find("favicon.ico") | 314 | favicondata, err := box.Find("favicon.ico") |
292 | if err != nil { | 315 | if err != nil { |
@@ -334,13 +357,13 @@ func ListenAndServe(bind, robotsfile string, robotsdebug bool, vipsconcurrency i | |||
334 | ConcurrencyLevel: vipsconcurrency, | 357 | ConcurrencyLevel: vipsconcurrency, |
335 | }) | 358 | }) |
336 | 359 | ||
337 | http.HandleFunc("/", GopherHandler(tpl, robotsdata, AssetHashList{stylehash, jshash, fontwhash, fontw2hash}, robotsdebug, uri)) | 360 | http.HandleFunc("/", GopherHandler(tpl, robotsdata, AssetList{styleAsset, jsAsset, fontwAsset, fontw2Asset}, robotsdebug, uri)) |
338 | http.HandleFunc("/robots.txt", RobotsTxtHandler(robotstxtdata)) | 361 | http.HandleFunc("/robots.txt", RobotsTxtHandler(robotstxtdata)) |
339 | http.HandleFunc("/favicon.ico", FaviconHandler(favicondata)) | 362 | http.HandleFunc("/favicon.ico", FaviconHandler(favicondata)) |
340 | http.HandleFunc("/style-"+stylehash+".css", StyleHandler(styledata)) | 363 | http.HandleFunc(styleAsset, StyleHandler(styledata)) |
341 | http.HandleFunc("/main-"+jshash+".js", JavaScriptHandler(jsdata)) | 364 | http.HandleFunc(jsAsset, JavaScriptHandler(jsdata)) |
342 | http.HandleFunc("/iosevka-term-ss03-regular-"+fontwhash+".woff", FontHandler(false, fontdataw)) | 365 | http.HandleFunc(fontwAsset, FontHandler(false, fontdataw)) |
343 | http.HandleFunc("/iosevka-term-ss03-regular-"+fontw2hash+".woff2", FontHandler(true, fontdataw2)) | 366 | http.HandleFunc(fontw2Asset, FontHandler(true, fontdataw2)) |
344 | //http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets/")))) | 367 | //http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets/")))) |
345 | 368 | ||
346 | return http.ListenAndServe(bind, nil) | 369 | return http.ListenAndServe(bind, nil) |