1
0
Fork 0
datetime.link/main.go

85 lines
1.7 KiB
Go

package main
import (
"flag"
"html/template"
"log"
"net/http"
"time"
)
var listen string
var tmpl *template.Template
func main() {
var err error
flag.StringVar(&listen, "listen", ":8000", "Listen address")
flag.Parse()
server := &http.Server{
Addr: listen,
ReadTimeout: 5 * time.Second,
WriteTimeout: 5 * time.Second,
}
tmpl, err = template.ParseGlob("templates/*")
if err != nil {
panic(err)
}
http.Handle("/data/", http.FileServer(http.Dir(".")))
http.Handle("/js/", http.FileServer(http.Dir("assets")))
http.Handle("/css/", http.FileServer(http.Dir("assets")))
http.Handle("/favicon.ico", http.FileServer(http.Dir("assets")))
http.HandleFunc("/", index)
log.Printf("Listening on %v", server.Addr)
err = server.ListenAndServe()
if err != nil {
panic(err)
}
}
func index(w http.ResponseWriter, req *http.Request) {
var err error
if req.Method != http.MethodGet && req.Method != http.MethodHead {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
accept := req.Header.Get("Accept")
responseType := chooseResponseType(accept)
templateName := ""
switch responseType {
case responsePlain:
templateName = "index.txt"
case responseHTML:
templateName = "index.html"
case responseAny:
templateName = "index.txt"
case responseUnknown:
w.WriteHeader(http.StatusNotAcceptable)
return
}
t := tmpl.Lookup(templateName)
if t == nil {
log.Printf("Unable to find index template")
w.WriteHeader(http.StatusInternalServerError)
return
}
if req.Method == http.MethodHead {
return
}
err = t.Execute(w, nil)
if err != nil {
log.Printf("Error: %v", err)
// Usually, the following will fail
w.WriteHeader(http.StatusInternalServerError)
return
}
}