aboutsummaryrefslogtreecommitdiffstats
path: root/gopherproxy.go
diff options
context:
space:
mode:
Diffstat (limited to 'gopherproxy.go')
-rw-r--r--gopherproxy.go63
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
32type AssetHashList struct { 32type 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
39func renderDirectory(w http.ResponseWriter, tpl *template.Template, assetHashList AssetHashList, uri string, hostport string, d gopher.Directory) error { 39func 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.
102func GopherHandler(tpl *template.Template, robotsdata *robotstxt.RobotsData, assetHashList AssetHashList, robotsdebug bool, uri string) http.HandlerFunc { 103func 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)