~aleteoryx/webjrnl

webjrnl/jrnl.go -rw-r--r-- 2.4 KiB
821b974aAleteoryx more compat testing 18 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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))
}