forked from naoina/kocha
-
Notifications
You must be signed in to change notification settings - Fork 0
/
middleware.go
87 lines (74 loc) · 2.06 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
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
package kocha
import (
"strconv"
"github.com/naoina/kocha/util"
)
// Middleware is the interface that middleware.
type Middleware interface {
Before(c *Controller)
After(c *Controller)
}
var (
// Default middlewares.
DefaultMiddlewares = []Middleware{
&ResponseContentTypeMiddleware{},
}
)
// Middleware that set Content-Type header.
type ResponseContentTypeMiddleware struct{}
func (m *ResponseContentTypeMiddleware) Before(c *Controller) {
// do nothing
}
func (m *ResponseContentTypeMiddleware) After(c *Controller) {
res := c.Response
res.Header().Set("Content-Type", res.ContentType)
}
// Session processing middleware.
type SessionMiddleware struct{}
func (m *SessionMiddleware) Before(c *Controller) {
defer func() {
if err := recover(); err != nil {
switch err.(type) {
case ErrSession:
Log.Error("%v", err)
case ErrSessionExpected:
Log.Info("%v", err)
default:
panic(err)
}
c.Session = make(Session)
}
}()
cookie, err := c.Request.Cookie(appConfig.Session.Name)
if err != nil {
panic(NewErrSessionExpected("new session"))
}
sess := appConfig.Session.Store.Load(cookie.Value)
expiresStr, ok := sess[SessionExpiresKey]
if !ok {
panic(NewErrSession("expires value not found"))
}
expires, err := strconv.ParseInt(expiresStr, 10, 64)
if err != nil {
panic(NewErrSession(err.Error()))
}
if expires < util.Now().Unix() {
panic(NewErrSessionExpected("session has been expired"))
}
c.Session = sess
}
func (m *SessionMiddleware) After(c *Controller) {
expires, _ := expiresFromDuration(appConfig.Session.SessionExpires)
c.Session[SessionExpiresKey] = strconv.FormatInt(expires.Unix(), 10)
cookie := newSessionCookie(c)
cookie.Value = appConfig.Session.Store.Save(c.Session)
c.Response.SetCookie(cookie)
}
// Request logging middleware.
type RequestLoggingMiddleware struct{}
func (m *RequestLoggingMiddleware) Before(c *Controller) {
// do nothing.
}
func (m *RequestLoggingMiddleware) After(c *Controller) {
Log.Info(`"%v %v %v" %v`, c.Request.Method, c.Request.RequestURI, c.Request.Proto, c.Response.StatusCode)
}