package main
import "fmt"
import "log"
import "net/http"
import "os"
import "strings"
var proxied bool = false
func usage() {
fmt.Fprintln(os.Stderr, "usage: jrnl [-proxied] addr [mtpt]")
os.Exit(1)
}
func fixupLocation(header http.Header, r *http.Request) {
loc := header.Get("Location")
if loc != "" && loc[0] == '/' {
pfx := strings.Repeat("../", strings.Count(r.URL.Path, "/") - 1)
if pfx == "" {
pfx = "./"
}
header.Set("Location", pfx + loc[1:])
}
}
type responseWriter struct {
w http.ResponseWriter
r *http.Request
statusCode int
}
func (s *responseWriter) Header() http.Header {
return s.w.Header()
}
func (s *responseWriter) Write(b []byte) (int, error) {
if s.statusCode == 0 {
fixupLocation(s.w.Header(), s.r)
s.statusCode = 200
}
return s.w.Write(b)
}
func (s *responseWriter) WriteHeader(statusCode int) {
fixupLocation(s.w.Header(), s.r)
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 := responseWriter { w, r, 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))
}