~aleteoryx/webjrnl

ref: f7babf3f729eb552d10d64d86093fd0d6d1bd940 webjrnl/jrnl.go -rw-r--r-- 2.0 KiB
f7babf3f — Aleteoryx openrc 5 months 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
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))
}