package main import "fmt" import "log" import "net/http" import "os" var proxied bool = false func usage() { fmt.Fprintln(os.Stderr, "usage: jrnl [-proxied] addr [mtpt]") os.Exit(1) } type SavedWriter struct { w http.ResponseWriter statusCode int } func (s *SavedWriter) Header() http.Header { return s.w.Header() } func (s *SavedWriter) Write(b []byte) (int, error) { if s.statusCode == 0 { s.statusCode = 200 } return s.w.Write(b) } func (s *SavedWriter) WriteHeader(statusCode int) { s.statusCode = statusCode s.w.WriteHeader(statusCode) } type Handler struct { inner http.Handler } func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if proxied { xff := r.Header.Get("X-Forwarded-For") if xff != "" { r.RemoteAddr = xff } } s := SavedWriter { w, 0 } h.inner.ServeHTTP(&s, r) log.Printf( "%d - %s %s %s - %s", s.statusCode, r.Method, r.RequestURI, r.Proto, r.RemoteAddr) } func main() { if 2 > len(os.Args) { usage() } os.Args = os.Args[1:] if os.Args[0] == "-proxied" { proxied = true os.Args = os.Args[1:] } if 1 > len(os.Args) || len(os.Args) > 2 { usage() } addr := os.Args[0] if len(os.Args) > 1 { Mtpt = os.Args[1] } else { Mtpt = "." } if err := MountDB(); err != nil { log.Fatal(err) } http.HandleFunc("/{$}", Redirect("/dash", 301)) http.HandleFunc("GET /dash", Dash) http.HandleFunc("GET /goto", GotoRedirect) http.HandleFunc("GET /init", InitGet) http.HandleFunc("POST /init", InitPost) http.HandleFunc("GET /save", SaveGet) http.HandleFunc("GET /jrnl/{$}", JrnlRedirect) http.HandleFunc("GET /jrnl/{year}", JrnlGet) http.HandleFunc("POST /jrnl/{year}", JrnlPost) http.HandleFunc("GET /ntry/{$}", NtriesGet) http.HandleFunc("GET /ntry/{year}/{month}/{day}/{$}", NtryGet) http.HandleFunc("POST /ntry/{year}/{month}/{day}/{$}", NtryPost) http.HandleFunc("/", NotFoundGet) handler := Handler { http.DefaultServeMux } log.Println("initialized!") log.Fatal(http.ListenAndServe(addr, handler)) }