refactor(http3,handler,server,middleware): 改进错误处理与代码优化

- 使用 _ 忽略 Close、Write、Shutdown 等返回值
- compression 使用 switch-case 替代 if-else 链
- http3/adapter 使用 for-range 替代 VisitAll 遍历头部
- sendfile 添加 nolint 注释说明 buffer pool 设计决策
- defer 关闭文件使用 func() { _ = file.Close() } 确保执行

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
xfy 2026-04-03 17:36:58 +08:00
parent 0f7c69e59b
commit 96ed39e162
8 changed files with 28 additions and 27 deletions

View File

@ -132,14 +132,14 @@ func getSocketFd(conn net.Conn) (uintptr, error) {
if err != nil { if err != nil {
return 0, err return 0, err
} }
defer file.Close() defer func() { _ = file.Close() }()
return file.Fd(), nil return file.Fd(), nil
case *net.UnixConn: case *net.UnixConn:
file, err := c.File() file, err := c.File()
if err != nil { if err != nil {
return 0, err return 0, err
} }
defer file.Close() defer func() { _ = file.Close() }()
return file.Fd(), nil return file.Fd(), nil
default: default:
return 0, syscall.ENOTSUP return 0, syscall.ENOTSUP
@ -193,5 +193,5 @@ func GetBuffer() []byte {
// PutBuffer 放回缓冲区。 // PutBuffer 放回缓冲区。
func PutBuffer(buf []byte) { func PutBuffer(buf []byte) {
RealBufferPool.Put(buf) RealBufferPool.Put(buf) //nolint:staticcheck // SA6002: 测试表明指针优化不明显,保持简洁
} }

View File

@ -136,7 +136,7 @@ func (h *StaticHandler) serveFile(ctx *fasthttp.RequestCtx, filePath string, inf
if h.useSendfile && info.Size() >= MinSendfileSize { if h.useSendfile && info.Size() >= MinSendfileSize {
file, err := os.Open(filePath) file, err := os.Open(filePath)
if err == nil { if err == nil {
defer file.Close() defer func() { _ = file.Close() }()
if err := SendFile(ctx, file, 0, info.Size()); err == nil { if err := SendFile(ctx, file, 0, info.Size()); err == nil {
return return
} }
@ -153,7 +153,7 @@ func (h *StaticHandler) serveFile(ctx *fasthttp.RequestCtx, filePath string, inf
// 存入缓存(仅对小文件缓存) // 存入缓存(仅对小文件缓存)
if h.fileCache != nil && info.Size() < 1024*1024 { // < 1MB if h.fileCache != nil && info.Size() < 1024*1024 { // < 1MB
h.fileCache.Set(filePath, data, info.Size(), info.ModTime()) _ = h.fileCache.Set(filePath, data, info.Size(), info.ModTime())
} }
ctx.Response.SetBody(data) ctx.Response.SetBody(data)

View File

@ -106,7 +106,7 @@ func (a *Adapter) convertRequest(r *http.Request, ctx *fasthttp.RequestCtx) {
if err == nil { if err == nil {
ctx.Request.SetBody(body) ctx.Request.SetBody(body)
} }
r.Body.Close() _ = r.Body.Close()
} }
// 设置远程地址 // 设置远程地址
@ -133,9 +133,9 @@ func (a *Adapter) convertResponse(ctx *fasthttp.RequestCtx, w http.ResponseWrite
} }
// 复制响应头 // 复制响应头
ctx.Response.Header.VisitAll(func(k, v []byte) { for k, v := range ctx.Response.Header.All() {
w.Header().Add(string(k), string(v)) w.Header().Add(string(k), string(v))
}) }
// 写入状态码 // 写入状态码
w.WriteHeader(statusCode) w.WriteHeader(statusCode)
@ -143,7 +143,7 @@ func (a *Adapter) convertResponse(ctx *fasthttp.RequestCtx, w http.ResponseWrite
// 写入响应体 // 写入响应体
body := ctx.Response.Body() body := ctx.Response.Body()
if len(body) > 0 { if len(body) > 0 {
w.Write(body) _, _ = w.Write(body)
} }
} }
@ -238,9 +238,9 @@ func convertToHTTPRequest(ctx *fasthttp.RequestCtx) *http.Request {
// 复制头部 // 复制头部
r.Header = make(http.Header) r.Header = make(http.Header)
ctx.Request.Header.VisitAll(func(k, v []byte) { for k, v := range ctx.Request.Header.All() {
r.Header.Add(string(k), string(v)) r.Header.Add(string(k), string(v))
}) }
// 设置请求体 // 设置请求体
if len(ctx.PostBody()) > 0 { if len(ctx.PostBody()) > 0 {

View File

@ -138,7 +138,7 @@ func (s *Server) Start() error {
// 创建 QUIC 监听器 // 创建 QUIC 监听器
s.listener, err = quic.ListenEarly(udpConn, s.tlsConfig, quicConfig) s.listener, err = quic.ListenEarly(udpConn, s.tlsConfig, quicConfig)
if err != nil { if err != nil {
udpConn.Close() _ = udpConn.Close()
return fmt.Errorf("failed to listen QUIC: %w", err) return fmt.Errorf("failed to listen QUIC: %w", err)
} }
@ -219,7 +219,7 @@ func (s *Server) GracefulStop(timeout time.Duration) error {
done := make(chan struct{}) done := make(chan struct{})
go func() { go func() {
s.http3Server.Close() _ = s.http3Server.Close()
close(done) close(done)
}() }()

View File

@ -146,9 +146,10 @@ func (m *CompressionMiddleware) Process(next fasthttp.RequestHandler) fasthttp.R
// 根据算法和客户端支持选择压缩方式 // 根据算法和客户端支持选择压缩方式
var useGzip, useBrotli bool var useGzip, useBrotli bool
if m.algorithm == AlgorithmGzip { switch m.algorithm {
case AlgorithmGzip:
useGzip = strings.Contains(acceptEncoding, "gzip") useGzip = strings.Contains(acceptEncoding, "gzip")
} else if m.algorithm == AlgorithmBrotli { case AlgorithmBrotli:
// brotli 或 both 模式 // brotli 或 both 模式
if strings.Contains(acceptEncoding, "br") { if strings.Contains(acceptEncoding, "br") {
useBrotli = true useBrotli = true
@ -232,8 +233,8 @@ func (m *CompressionMiddleware) compressGzip(data []byte) []byte {
var buf bytes.Buffer var buf bytes.Buffer
w.Reset(&buf) w.Reset(&buf)
w.Write(data) _, _ = w.Write(data)
w.Close() _ = w.Close()
return buf.Bytes() return buf.Bytes()
} }
@ -245,8 +246,8 @@ func (m *CompressionMiddleware) compressBrotli(data []byte) []byte {
var buf bytes.Buffer var buf bytes.Buffer
w.Reset(&buf) w.Reset(&buf)
w.Write(data) _, _ = w.Write(data)
w.Close() _ = w.Close()
return buf.Bytes() return buf.Bytes()
} }

View File

@ -263,7 +263,7 @@ type PoolStats struct {
func (p *GoroutinePool) WrapHandler(handler fasthttp.RequestHandler) fasthttp.RequestHandler { func (p *GoroutinePool) WrapHandler(handler fasthttp.RequestHandler) fasthttp.RequestHandler {
return func(ctx *fasthttp.RequestCtx) { return func(ctx *fasthttp.RequestCtx) {
// 使用池执行处理器 // 使用池执行处理器
p.Submit(ctx, func(innerCtx *fasthttp.RequestCtx) { _ = p.Submit(ctx, func(innerCtx *fasthttp.RequestCtx) {
handler(ctx) handler(ctx)
}) })
} }

View File

@ -610,7 +610,7 @@ func (s *Server) Stop() error {
// 关闭访问日志 // 关闭访问日志
if s.accessLogMiddleware != nil { if s.accessLogMiddleware != nil {
s.accessLogMiddleware.Close() _ = s.accessLogMiddleware.Close()
} }
// 关闭 TLS 管理器 // 关闭 TLS 管理器
@ -653,7 +653,7 @@ func (s *Server) GracefulStop(timeout time.Duration) error {
// 关闭访问日志 // 关闭访问日志
if s.accessLogMiddleware != nil { if s.accessLogMiddleware != nil {
s.accessLogMiddleware.Close() _ = s.accessLogMiddleware.Close()
} }
// 关闭 TLS 管理器 // 关闭 TLS 管理器
@ -667,7 +667,7 @@ func (s *Server) GracefulStop(timeout time.Duration) error {
done := make(chan struct{}) done := make(chan struct{})
go func() { go func() {
s.fastServer.Shutdown() _ = s.fastServer.Shutdown()
close(done) close(done)
}() }()

View File

@ -159,7 +159,7 @@ func (u *UpgradeManager) GetInheritedListeners() ([]net.Listener, error) {
listener, err := net.FileListener(file) listener, err := net.FileListener(file)
if err != nil { if err != nil {
file.Close() _ = file.Close()
continue continue
} }
@ -220,7 +220,7 @@ func (u *UpgradeManager) GracefulUpgrade(newBinary string) error {
// 写入新 PID 到文件 // 写入新 PID 到文件
if u.pidFile != "" { if u.pidFile != "" {
os.WriteFile(u.pidFile, []byte(fmt.Sprintf("%d", newPid)), 0644) _ = os.WriteFile(u.pidFile, []byte(fmt.Sprintf("%d", newPid)), 0644)
} }
return nil return nil
@ -277,7 +277,7 @@ func (u *UpgradeManager) WaitForShutdown(timeout time.Duration) error {
} }
process, _ := os.FindProcess(u.oldPid) process, _ := os.FindProcess(u.oldPid)
process.Signal(syscall.SIGKILL) _ = process.Signal(syscall.SIGKILL)
return fmt.Errorf("old process did not shutdown gracefully") return fmt.Errorf("old process did not shutdown gracefully")
} }
@ -315,7 +315,7 @@ func (u *UpgradeManager) SetupSignalHandlers(newBinary string) {
go func() { go func() {
for sig := range sigCh { for sig := range sigCh {
if sig == syscall.SIGUSR2 { if sig == syscall.SIGUSR2 {
u.GracefulUpgrade(newBinary) _ = u.GracefulUpgrade(newBinary)
} }
} }
}() }()