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) |
