feat: add support for HTTP/2 Cleartext (h2c) connections

This commit is contained in:
Lemon
2026-02-04 21:40:25 +08:00
parent 8f39754812
commit 97a5c1ac1d
8 changed files with 55 additions and 49 deletions

View File

@@ -14,6 +14,8 @@ import (
"github.com/gin-gonic/gin"
"github.com/google/wire"
"github.com/redis/go-redis/v9"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
)
// ProviderSet 提供服务器层的依赖
@@ -56,9 +58,23 @@ func ProvideRouter(
// ProvideHTTPServer 提供 HTTP 服务器
func ProvideHTTPServer(cfg *config.Config, router *gin.Engine) *http.Server {
httpHandler := http.Handler(router)
// 根据配置决定是否启用 H2C
if cfg.Server.EnableH2C {
httpHandler = h2c.NewHandler(router, &http2.Server{
MaxConcurrentStreams: 250, // 最大并发流数量
IdleTimeout: 300 * time.Second,
MaxReadFrameSize: 4 << 20, // 4MB
MaxUploadBufferPerConnection: 8 << 20, // 8MB
MaxUploadBufferPerStream: 2 << 20, // 2MB
})
log.Println("HTTP/2 Cleartext (h2c) enabled")
}
return &http.Server{
Addr: cfg.Server.Address(),
Handler: router,
Handler: httpHandler,
// ReadHeaderTimeout: 读取请求头的超时时间,防止慢速请求头攻击
ReadHeaderTimeout: time.Duration(cfg.Server.ReadHeaderTimeout) * time.Second,
// IdleTimeout: 空闲连接超时时间,释放不活跃的连接资源

View File

@@ -34,12 +34,16 @@ func Logger() gin.HandlerFunc {
// 客户端IP
clientIP := c.ClientIP()
// 日志格式: [时间] 状态码 | 延迟 | IP | 方法 路径
log.Printf("[GIN] %v | %3d | %13v | %15s | %-7s %s",
// 协议版本
protocol := c.Request.Proto
// 日志格式: [时间] 状态码 | 延迟 | IP | 协议 | 方法 路径
log.Printf("[GIN] %v | %3d | %13v | %15s | %-6s | %-7s %s",
endTime.Format("2006/01/02 - 15:04:05"),
statusCode,
latency,
clientIP,
protocol,
method,
path,
)