frontend: proper ensureSess middleware, add req id
Signed-off-by: Ahmet Alp Balkan <ahmetb@google.com>
This commit is contained in:
parent
2dcd7b6221
commit
85d04fc0b5
2 changed files with 21 additions and 11 deletions
|
@ -77,19 +77,20 @@ func main() {
|
||||||
mustConnGRPC(ctx, &svc.checkoutSvcConn, svc.checkoutSvcAddr)
|
mustConnGRPC(ctx, &svc.checkoutSvcConn, svc.checkoutSvcAddr)
|
||||||
|
|
||||||
r := mux.NewRouter()
|
r := mux.NewRouter()
|
||||||
r.HandleFunc("/", ensureSessionID(svc.homeHandler)).Methods(http.MethodGet, http.MethodHead)
|
r.HandleFunc("/", svc.homeHandler).Methods(http.MethodGet, http.MethodHead)
|
||||||
r.HandleFunc("/product/{id}", ensureSessionID(svc.productHandler)).Methods(http.MethodGet, http.MethodHead)
|
r.HandleFunc("/product/{id}", svc.productHandler).Methods(http.MethodGet, http.MethodHead)
|
||||||
r.HandleFunc("/cart", ensureSessionID(svc.viewCartHandler)).Methods(http.MethodGet, http.MethodHead)
|
r.HandleFunc("/cart", svc.viewCartHandler).Methods(http.MethodGet, http.MethodHead)
|
||||||
r.HandleFunc("/cart", ensureSessionID(svc.addToCartHandler)).Methods(http.MethodPost)
|
r.HandleFunc("/cart", svc.addToCartHandler).Methods(http.MethodPost)
|
||||||
r.HandleFunc("/cart/empty", ensureSessionID(svc.emptyCartHandler)).Methods(http.MethodPost)
|
r.HandleFunc("/cart/empty", svc.emptyCartHandler).Methods(http.MethodPost)
|
||||||
r.HandleFunc("/setCurrency", ensureSessionID(svc.setCurrencyHandler)).Methods(http.MethodPost)
|
r.HandleFunc("/setCurrency", svc.setCurrencyHandler).Methods(http.MethodPost)
|
||||||
r.HandleFunc("/logout", svc.logoutHandler).Methods(http.MethodGet)
|
r.HandleFunc("/logout", svc.logoutHandler).Methods(http.MethodGet)
|
||||||
r.HandleFunc("/cart/checkout", ensureSessionID(svc.placeOrderHandler)).Methods(http.MethodPost)
|
r.HandleFunc("/cart/checkout", svc.placeOrderHandler).Methods(http.MethodPost)
|
||||||
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))))
|
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))))
|
||||||
|
|
||||||
log.Infof("starting server on " + addr + ":" + srvPort)
|
log.Infof("starting server on " + addr + ":" + srvPort)
|
||||||
loggedHandler := &logHandler{log: log, next: r}
|
loggedHandler := &logHandler{log: log, next: r}
|
||||||
log.Fatal(http.ListenAndServe(addr+":"+srvPort, loggedHandler))
|
log.Fatal(http.ListenAndServe(addr+":"+srvPort,
|
||||||
|
http.HandlerFunc(ensureSessionID(loggedHandler))))
|
||||||
}
|
}
|
||||||
|
|
||||||
func mustMapEnv(target *string, envKey string) {
|
func mustMapEnv(target *string, envKey string) {
|
||||||
|
|
|
@ -10,6 +10,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type ctxKeyLog struct{}
|
type ctxKeyLog struct{}
|
||||||
|
type ctxKeyRequestID struct{}
|
||||||
|
|
||||||
type logHandler struct {
|
type logHandler struct {
|
||||||
log *logrus.Logger
|
log *logrus.Logger
|
||||||
|
@ -39,12 +40,20 @@ func (r *responseRecorder) WriteHeader(statusCode int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lh *logHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
func (lh *logHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ctx := r.Context()
|
||||||
|
requestID, _ := uuid.NewRandom()
|
||||||
|
ctx = context.WithValue(ctx, ctxKeyRequestID{}, requestID.String())
|
||||||
|
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
rr := &responseRecorder{w: w}
|
rr := &responseRecorder{w: w}
|
||||||
log := lh.log.WithFields(logrus.Fields{
|
log := lh.log.WithFields(logrus.Fields{
|
||||||
"http.req.path": r.URL.Path,
|
"http.req.path": r.URL.Path,
|
||||||
"http.req.method": r.Method,
|
"http.req.method": r.Method,
|
||||||
|
"http.req.id": requestID.String(),
|
||||||
})
|
})
|
||||||
|
if v, ok := r.Context().Value(ctxKeySessionID{}).(string); ok {
|
||||||
|
log = log.WithField("session", v)
|
||||||
|
}
|
||||||
log.Debug("request started")
|
log.Debug("request started")
|
||||||
defer func() {
|
defer func() {
|
||||||
log.WithFields(logrus.Fields{
|
log.WithFields(logrus.Fields{
|
||||||
|
@ -53,12 +62,12 @@ func (lh *logHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
"http.resp.bytes": rr.b}).Debugf("request complete")
|
"http.resp.bytes": rr.b}).Debugf("request complete")
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ctx := context.WithValue(r.Context(), ctxKeyLog{}, log)
|
ctx = context.WithValue(ctx, ctxKeyLog{}, log)
|
||||||
r = r.WithContext(ctx)
|
r = r.WithContext(ctx)
|
||||||
lh.next.ServeHTTP(rr, r)
|
lh.next.ServeHTTP(rr, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ensureSessionID(next http.HandlerFunc) http.HandlerFunc {
|
func ensureSessionID(next http.Handler) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
var sessionID string
|
var sessionID string
|
||||||
c, err := r.Cookie(cookieSessionID)
|
c, err := r.Cookie(cookieSessionID)
|
||||||
|
@ -77,6 +86,6 @@ func ensureSessionID(next http.HandlerFunc) http.HandlerFunc {
|
||||||
}
|
}
|
||||||
ctx := context.WithValue(r.Context(), ctxKeySessionID{}, sessionID)
|
ctx := context.WithValue(r.Context(), ctxKeySessionID{}, sessionID)
|
||||||
r = r.WithContext(ctx)
|
r = r.WithContext(ctx)
|
||||||
next(w, r)
|
next.ServeHTTP(w, r)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue