diff options
Diffstat (limited to 'intercept.go')
| -rw-r--r-- | intercept.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/intercept.go b/intercept.go new file mode 100644 index 0000000..8201f3e --- /dev/null +++ b/intercept.go @@ -0,0 +1,107 @@ +package main + +import ( + "html/template" + "log" + "net/http" + "sort" + "strings" +) + +type TemplateHandler struct { + handler http.Handler +} + +func (t *TemplateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + + w.Header().Set("Server", "uhttpd") + + // We use our custom handler to prettify directories. Files are served via default. + if !strings.HasSuffix(r.URL.Path, "/") { + t.handler.ServeHTTP(w, r) + return + } + + rec := NewRecorder() + + defer rec.Body.Reset() + + // passing the recorder instead of the real ResponseWriter + t.handler.ServeHTTP(rec, r) + + // let the standard lib handle all the caching + if rec.Code > 300 && rec.Code < 400 { + log.Println("Code: ", rec.Code) + t.handler.ServeHTTP(w, r) + return + } + + // we copy the original headers first + for k, v := range rec.Header() { + w.Header()[k] = v + } + + // not found + if rec.Code == 404 { + w.Header().Set("Content-Type", "text/html") + w.WriteHeader(404) + tmpl := template.New("404") + tmpl, err := tmpl.Parse(get404()) + if err != nil { + log.Println(err.Error()) + w.WriteHeader(500) + w.Write([]byte(err.Error())) + return + } + + err = tmpl.Execute(w, struct{ URL string }{URL: r.URL.Path}) + if err != nil { + log.Println(err.Error()) + w.WriteHeader(500) + w.Write([]byte(err.Error())) + return + } + return + } + + // we serve a file instead of a html page + if !strings.Contains(w.Header().Get("Content-Type"), "text/html") { + w.Write(rec.Body.Bytes()) + return + } + + data := rec.Body.String() + + // we serve the directoy page + if strings.HasPrefix(data, "<pre>") { + execTemplate(w, r, data) + } else { + w.Write(rec.Body.Bytes()) + } +} + +func execTemplate(w http.ResponseWriter, r *http.Request, data string) { + + links := getToken(data) + sort.Sort(LinksAsSlice(links)) // see sort.go + + tmpl := template.New("page") + tmpl, err := tmpl.Parse(getTemplate()) + if err != nil { + log.Println(err.Error()) + w.WriteHeader(500) + w.Write([]byte(err.Error())) + return + } + + err = tmpl.Execute(w, struct { + Links []Link + URL string + Favicon template.HTML + AllowUpload bool + }{Links: links, URL: r.URL.Path, Favicon: getFavicon(), AllowUpload: _allow_upload}) + if err != nil { + log.Println(err) + } + +} |
