email/handlers/handlers.go

82 lines
1.8 KiB
Go

package handlers
import (
"database/sql"
"flag"
"net/http"
"path/filepath"
"github.com/golang/glog"
"github.com/gorilla/mux"
"xinu.tv/email/db"
)
var staticDir = flag.String("static", "static",
"directory containing static web resources.")
type handler struct {
c *db.Conn
}
func (h *handler) OriginalHandler(w http.ResponseWriter, r *http.Request) {
var blob []byte
hash := mux.Vars(r)["hash"]
err := h.c.OriginalBlobByHash(hash, &blob)
switch err {
case nil:
w.Header().Set("Content-Type", "text/plain")
if _, err := w.Write(blob); err != nil {
glog.Error(err)
}
case sql.ErrNoRows:
http.NotFound(w, r)
default:
glog.Error(err)
}
}
func decodeToken(token string, p *db.Paginator) error {
return nil
}
func (h *handler) LabelHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
p := &db.Paginator{Label: vars["label"]}
if p.Label == "" {
p.Label = db.MagicAllLabel
}
token := vars["token"]
if err := decodeToken(token, p); err != nil {
glog.Error("LabelHandler: Failed to decode token %q: %v", token, err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
glog.Infoln("Listing:", p)
if err := h.c.Index(p); err != nil {
glog.Errorln("LabelHandler:", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
func staticHandler(w http.ResponseWriter, r *http.Request) {
fs := http.FileServer(http.Dir(*staticDir))
if r.URL.Path == "/" {
http.ServeFile(w, r, filepath.Join(*staticDir, "index.html"))
return
}
fs.ServeHTTP(w, r)
}
func Handlers(c *db.Conn) http.Handler {
h := &handler{c: c}
r := mux.NewRouter()
r.HandleFunc("/css/", staticHandler)
r.HandleFunc("/raw/{hash}", h.OriginalHandler)
r.HandleFunc("/l/{label}", h.LabelHandler)
r.PathPrefix("/").HandlerFunc(staticHandler)
return r
}