/
server.go
80 lines (61 loc) · 1.81 KB
/
server.go
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
package server
import (
"errors"
"log"
"net/http"
"os"
"strings"
"github.com/peterhellberg/generate.name/generator"
)
var backdoorKey = os.Getenv("BACKDOOR_KEY")
func validBackdoorKey(keyParam string) bool {
return backdoorKey != "" && keyParam == backdoorKey
}
// Server contains the logger and a generator.Store
type Server struct {
Logger *log.Logger
generator.Store
}
// Handler takes a context, request and response writer
type Handler func(*http.Request, http.ResponseWriter) error
func (s *Server) handlerFunc(fn Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
err := fn(r, w)
if err != nil {
s.Logger.Printf("handlerFunc: uri=%s err=%s", r.RequestURI, err)
w.WriteHeader(500)
}
})
}
// ListenAndServe creates a context, registers all handlers
// and starts listening on the provided addr
func (s *Server) ListenAndServe(addr string) error {
http.Handle("/", s.handlerFunc(s.routesHandler))
http.HandleFunc("/script.js", script)
http.HandleFunc("/favicon.png", favicon)
http.HandleFunc("/favicon.ico", favicon)
return http.ListenAndServe(addr, nil)
}
func (s *Server) newGenFunc(slug string) func(string) string {
return func(src string) string {
gSlug := strings.TrimSuffix(strings.TrimPrefix(src, "[GENERATE "), "]")
if gSlug == "" || gSlug == slug {
return src
}
// sess := s.Session.Clone()
// defer sess.Close()
g := &generator.Generator{}
// err := sess.DB("").C("generators").FindId(gSlug).One(g)
// if err != nil {
// return src
// }
return string(g.Generate())
}
}
func getSlug(r *http.Request, suffix string) (string, error) {
segments := strings.Split(strings.TrimSuffix(r.URL.Path[1:], suffix), "/")
if len(segments) > 1 {
return "", errors.New("not a valid path: " + r.URL.Path)
}
return segments[0], nil
}