-
Notifications
You must be signed in to change notification settings - Fork 0
/
middleware.go
62 lines (53 loc) · 1.78 KB
/
middleware.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
package setup
import (
"go-server/helpers"
"go-server/pages/notFound"
"log"
"net/http"
"time"
)
// HandlerFn is an alias for http.HandlerFunc argument, but with my helpers.MyWriter
type HandlerFn func(w helpers.MyWriter, r *http.Request)
// Middleware is just a HandlerFn that returns a HandlerFn
type Middleware func(HandlerFn) HandlerFn
func MyWriterWrapperMiddleware(next HandlerFn) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
myWriter := helpers.MyWriter{ResponseWriter: w}
next(myWriter, r)
}
}
// LoggingMiddleware is a Middleware that logs a hit and time taken to answer
func LoggingMiddleware(next HandlerFn) HandlerFn {
return func(w helpers.MyWriter, r *http.Request) {
start := time.Now()
log.Printf("Started %s %s", r.Method, r.URL.Path)
next(w, r)
log.Printf("Completed %s %s in %v", r.Method, r.URL.Path, time.Since(start))
}
}
// HtmxPartialMiddleware guards against direct browser navigations to partials
// It returns notFound if request wasn't made by htmx (Hx-Request header)
func HtmxPartialMiddleware(next HandlerFn) HandlerFn {
return func(w helpers.MyWriter, r *http.Request) {
isHtmxRequest := r.Header.Get("Hx-Request") == "true"
if !isHtmxRequest {
notFound.GetHandler(w, r)
return
}
next(w, r)
}
}
// CreateBasicAuthMiddleware returns middleware that requires basic auth
func CreateBasicAuthMiddleware(config AppConfig) Middleware {
return func(next HandlerFn) HandlerFn {
return func(w helpers.MyWriter, r *http.Request) {
username, password, ok := r.BasicAuth()
if !ok || config.Auth.Username != username || config.Auth.Password != password {
w.Header().Set("WWW-Authenticate", `Basic realm="server", charset="UTF-8"`)
w.WriteHeader(401)
return
}
next(w, r)
}
}
}