-
Notifications
You must be signed in to change notification settings - Fork 0
middleware.md
maoxiaoyue edited this page Mar 29, 2026
·
1 revision
middleware 套件提供了一系列針對 HypGo context.Context 量身打造的即插即用(Plug-and-play)中介軟體。透過內置的中間件鏈與群組管理功能,你可以非常輕鬆地將跨域請求、日誌記錄、限流機制以及快取等功能加諸於路由之上。
- Logger: 高效能的請求日誌記錄,支援記錄耗時與回應大小,甚至可排除特定路徑。
- Recovery: 自動攔截 Panic 並避免伺服器崩潰,可自定義 Panic 處理邏輯與 HTTP 狀態回應。
- CORS: 跨來源資源共用 (Cross-Origin Resource Sharing) 處理,支援各種細部配置與 Preflight 請求快取。
- Security: 提供 HTTP 安全標頭設定(HSTS, X-Frame-Options, CSP),所有 header 值在初始化時預計算,零 GC 壓力。
- RateLimiter: 提供簡易基於 Token Bucket 的基礎限流機制,可依據 IP 或是自定義規則設限。
- Timeout: 提供 HTTP 請求處理的最大時間限制,超過強制中斷並回應超時訊息。
- Cache: 將經常存取的 API 快取於記憶體中,提供自定義 TTL、Key 產生演算法與驗證邏輯。
HypGo 採用 Chain 與 Group 模式進行中間件管理,你可以把一個或多個中間件像樂高一樣組合起來,然後透過 Then 附加到最終的 Handler 上面。
以 Logger 為例,使用預設配置掛載:
package main import ( "github.com/maoxiaoyue/hypgo/pkg/middleware" "github.com/maoxiaoyue/hypgo/pkg/router" "github.com/maoxiaoyue/hypgo/pkg/context" ) func main() { r := router.New() // 使用預設設定加上 Logger 中介軟體 r.Use(middleware.Logger(middleware.LoggerConfig{})) r.GET("/ping", func(c *context.Context) { c.String(200, "pong") }) }
你也可以透過 middleware.Chain 將中間件先綑綁成一個群組再服用:
// 建立一個基礎的安全呼叫鏈 apiChain := middleware.NewChain( middleware.Recovery(middleware.RecoveryConfig{}), // 防止崩潰 middleware.Logger(middleware.LoggerConfig{}), // 日誌記錄 middleware.CORS(middleware.CORSConfig{ AllowOrigins: []string{"https://example.com"}, }), ) // 結合自訂函數 r.GET("/api/data", apiChain.Then(func(c *context.Context) { c.JSON(200, map[string]string{"msg": "secure data"}) }))
如果你的特定路由前綴(如 /admin)需要特定的中間件邏輯:
// 宣告一個以 `/admin` 開頭的群組,並附加 RateLimiter adminGroup := middleware.NewGroup("/admin", middleware.RateLimiter(middleware.RateLimiterConfig{ Rate: 10, // 每秒 10 個請求 Burst: 20, // 瞬間最大容量 20 })) // 為特定的路由套用該群組的中介軟體 r.GET("/admin/dashboard", adminGroup.Handle(func(c *context.Context) { c.String(200, "Admin View") }))
你隨時可以依照 func(*hypcontext.Context) 這個型別,寫出自己的通用中間件。只要確保在邏輯的最後執行 c.Next() 以順利推進執行鏈:
func MyCustomMiddleware() hypcontext.HandlerFunc { return func(c *hypcontext.Context) { // 1. 在處理請求前執行的邏輯 c.Set("my_key", "my_value") // 2. 將控制權交給下一個中介軟體或是 Handler c.Next() // 3. 在處理結束準備回應前執行的邏輯 status := c.Writer.Status() log.Printf("Response Status: %d", status) } }
防止大 payload DoS 攻擊:
r.Use(middleware.BodyLimit(middleware.BodyLimitConfig{ MaxBytes: 5 << 20, // 5MB ErrorMsg: "Payload too large", }))
支援不支援 PUT/DELETE 的客戶端(如 HTML 表單):
r.Use(middleware.MethodOverride()) // POST /users?_method=DELETE → 變成 DELETE /users // POST /users (X-HTTP-Method-Override: PUT) → 變成 PUT /users
| 問題 | 修復 |
|---|---|
| RateLimiter sync.Map 記憶體洩漏 | 加入定期清理(每 5 分鐘清除 10 分鐘未見的 key) |
| JWT middleware 驗證為空殼 | 改為要求 Validator 函式,未提供一律拒絕(安全預設) |
| Brotli 壓縮發假 header | 移除假 Content-Encoding: br,僅保留 gzip |
| CircuitBreaker 競態條件 | 加入 sync.Mutex 保護狀態讀寫 |
| CSRF/RequestID 用不安全的 fastrand | 改用 crypto/rand
|
Security 中間件在初始化時將所有 header 值(XSS、nosniff、HSTS、CSP)預計算為不可變字串,閉包捕獲。請求處理時直接設定字串,不做 fmt.Sprintf 或字串拼接:
// 初始化時一次性計算 sec := middleware.Security(middleware.SecurityConfig{ HSTSMaxAge: 31536000, HSTSIncludeSubdomains: true, }) // → 預計算 hstsValue = "max-age=31536000; includeSubDomains" // → 每請求只執行 c.Header("Strict-Transport-Security", hstsValue) // → 零分配、零 GC 壓力
設計文件
套件
- config — 設定
- context — 請求上下文
- router — 路由器
- server — 伺服器
- middleware — 中介層
- websocket — WebSocket
- hidb — 資料庫 ORM
- hidb/cassandra — Cassandra
- logger — 日誌
- json — JSON 處理
- grpc — gRPC
AI 協作工具鏈
- schema — Schema-first 路由
- manifest — 專案 Manifest
- contract — Contract Testing
- errors — Typed Error Catalog
- migrate — Migration Diff
- scaffold — 智慧 Scaffold
- airules — AI Rules
CLI 命令
- hyp 總覽
- hyp new
- hyp api
- hyp run
- hyp restart
- hyp generate
- hyp migrate
- hyp context
- hyp ai-rules
- hyp chkcomment
- hyp impact
- hyp docker
- hyp health
- hyp version
- hyp difflog
Design Docs
Packages
- config — Configuration
- context — Request Context
- router — Router
- server — Server
- middleware — Middleware
- websocket — WebSocket
- hidb — Database ORM
- hidb/cassandra - Cassandra 5.0
- logger — Logger
- json — JSON
- grpc — gRPC
AI Collaboration Toolchain
- schema — Schema-first Routing
- manifest — Project Manifest
- contract — Contract Testing
- errors — Typed Error Catalog
- migrate — Migration Diff
- scaffold — Smart Scaffold
- airules — AI Rules
CLI Commands