// Package middleware 自写中间件链(§7.2): // SecurityHeaders → 日志 → 全局限流 → Origin 校验 →(路由级)MaxBytes → Auth → CSRF。 package middleware import ( "context" "log/slog" "net" "net/http" "strings" "time" ) // statusWriter 捕获响应状态码供日志使用。 type statusWriter struct { http.ResponseWriter status int } func (w *statusWriter) WriteHeader(code int) { if w.status == 0 { w.status = code } w.ResponseWriter.WriteHeader(code) } func (w *statusWriter) Write(b []byte) (int, error) { if w.status == 0 { w.status = http.StatusOK } return w.ResponseWriter.Write(b) } // SecurityHeaders 下发安全 HTTP 头(§9.2)。 func SecurityHeaders(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { h := w.Header() h.Set("Content-Security-Policy", "default-src 'self'; "+ "script-src 'self'; "+ // 'unsafe-inline' 仅因 CodeMirror 经 style-mod 运行时注入