package middleware import ( "log" "net/http" "runtime/debug" ) // Recovery 中间件 - 恢复 panic func Recovery(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { log.Printf("panic recovered: %v\n%s", err, debug.Stack()) http.Error(w, "internal server error", http.StatusInternalServerError) } }() next.ServeHTTP(w, r) }) } // Logging 中间件 - 请求日志 func Logging(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("%s %s", r.Method, r.URL.Path) next.ServeHTTP(w, r) }) } // RequestID 中间件 - 请求追踪 func RequestID(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { requestID := r.Header.Get("X-Request-Id") if requestID == "" { requestID = r.Header.Get("X-Request-ID") } if requestID != "" { w.Header().Set("X-Request-Id", requestID) } next.ServeHTTP(w, r) }) }