Added templating support

This commit is contained in:
James Mills 2016-09-22 12:51:46 +10:00
parent 773606bd45
commit 669492455b
No known key found for this signature in database
GPG Key ID: AC4C014F1440EBD6
2 changed files with 74 additions and 10 deletions

70
main.go
View File

@ -3,7 +3,9 @@ package main
import (
"flag"
"fmt"
"html/template"
"io"
"io/ioutil"
"log"
"net/http"
"strings"
@ -17,31 +19,79 @@ var (
port = flag.Int("port", 70, "port to proxy to")
)
func proxy(res http.ResponseWriter, req *http.Request) {
type tplRow struct {
Link template.URL
Type string
Text string
}
func renderDirectory(w http.ResponseWriter, tpl *template.Template, d gopher.Directory) error {
out := make([]tplRow, len(d))
for i, x := range d {
tr := tplRow{
Text: x.Description,
Type: x.Type.String(),
}
if x.Type == gopher.INFO {
out[i] = tr
continue
}
if strings.HasPrefix(x.Selector, "URL:") {
tr.Link = template.URL(x.Selector[4:])
} else {
tr.Link = template.URL(
fmt.Sprintf(
"%s%s", string(byte(x.Type)), x.Selector,
),
)
}
out[i] = tr
}
return tpl.Execute(w, struct {
Title string
Lines []tplRow
}{"XXX", out})
}
func proxy(w http.ResponseWriter, req *http.Request) {
path := strings.TrimPrefix(req.URL.Path, "/")
gr, err := gopher.Get(fmt.Sprintf("gopher://%s:%d/%s", *host, *port, path))
res, err := gopher.Get(fmt.Sprintf("gopher://%s:%d/%s", *host, *port, path))
if err != nil {
io.WriteString(res, fmt.Sprintf("<b>Error:</b><pre>%s</pre>", err))
io.WriteString(w, fmt.Sprintf("<b>Error:</b><pre>%s</pre>", err))
return
}
if gr.Body != nil {
io.Copy(res, gr.Body)
if res.Body != nil {
io.Copy(w, res.Body)
} else {
bytes, err := gr.Dir.ToText()
if err != nil {
io.WriteString(res, fmt.Sprintf("<b>Error:</b><pre>%s</pre>", err))
if err := renderDirectory(w, tpl, res.Dir); err != nil {
io.WriteString(w, fmt.Sprintf("<b>Error:</b><pre>%s</pre>", err))
return
}
io.WriteString(res, string(bytes))
}
}
var tpl *template.Template
func main() {
flag.Parse()
tpldata, err := ioutil.ReadFile(".template")
if err == nil {
tpltext = string(tpldata)
}
tpl, err = template.New("gophermenu").Parse(tpltext)
if err != nil {
log.Fatal(err)
}
http.HandleFunc("/", proxy)
log.Fatal(http.ListenAndServe(*bind, nil))
}

14
template.go Normal file
View File

@ -0,0 +1,14 @@
package main
var tpltext = `<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>{{.Title}}</title>
</head>
<body>
<pre>
{{range .Lines}} {{if .Link}}({{.Type}}) <a href="{{.Link}}">{{.Text}}</a>{{else}} {{.Text}}{{end}}
{{end}}</pre>
</body>
</html>`