h2c := Header2Cookie{
CookieName: "access_token",
CookieExpireMinutes: 120,
Expression: `\s(\w+)$`,
}
cfg := httpserver.GetConfig(c)
for c.Next() { // skip the directive name
value := c.Val() // use the value
switch value {
case "CookieName":
h2c.CookieName = value
case "CookieExpireMinutes":
i, err := strconv.Atoi(value)
if err == nil {
h2c.CookieExpireMinutes = i
}
}
}
mid := func(next httpserver.Handler) httpserver.Handler {
h2c.Next = next
return h2c
}
cfg.AddMiddleware(mid)
return nil
}
header2cookie.go
package header2cookie
import (
"net/http"
"regexp"
"time"
"github.com/caddyserver/caddy/caddyhttp/httpserver"
)
//Header2Cookie translates authorization header value to cookie value
type Header2Cookie struct {
Expression string
CookieName string
CookieExpireMinutes int
Next httpserver.Handler
}
func (h Header2Cookie) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
auth := r.Header.Get("Authorization")
//rg, _ := regexp.Compile(`\s(\w+)$`)
rg, _ := regexp.Compile(h.Expression)
token := rg.FindString(auth)
if token != "" {
cur := time.Now()
expire := cur.Add(time.Minute * time.Duration(h.CookieExpireMinutes))
addCookie(w, h.CookieName, token, expire)
}
return h.Next.ServeHTTP(w, r)
}
func addCookie(w http.ResponseWriter, name string, value string, expire time.Time) {
cookie := http.Cookie{
Name: name,
Value: value,
Expires: expire,
}
http.SetCookie(w, &cookie)
}