summaryrefslogtreecommitdiff
path: root/intercept.go
diff options
context:
space:
mode:
Diffstat (limited to 'intercept.go')
-rw-r--r--intercept.go107
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)
+ }
+
+}