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 {
return 0, err
}
defer file.Close()
defer func() { _ = file.Close() }()
return file.Fd(), nil
case *net.UnixConn:
file, err := c.File()
if err != nil {
return 0, err
}
defer file.Close()
defer func() { _ = file.Close() }()
return file.Fd(), nil
default:
return 0, syscall.ENOTSUP
@ -193,5 +193,5 @@ func GetBuffer() []byte {
// PutBuffer 放回缓冲区。
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 {
file, err := os.Open(filePath)
if err == nil {
defer file.Close()
defer func() { _ = file.Close() }()
if err := SendFile(ctx, file, 0, info.Size()); err == nil {
return
}
@ -153,7 +153,7 @@ func (h *StaticHandler) serveFile(ctx *fasthttp.RequestCtx, filePath string, inf
// 存入缓存(仅对小文件缓存)
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)

View File

@ -106,7 +106,7 @@ func (a *Adapter) convertRequest(r *http.Request, ctx *fasthttp.RequestCtx) {
if err == nil {
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.WriteHeader(statusCode)
@ -143,7 +143,7 @@ func (a *Adapter) convertResponse(ctx *fasthttp.RequestCtx, w http.ResponseWrite
// 写入响应体
body := ctx.Response.Body()
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)
ctx.Request.Header.VisitAll(func(k, v []byte) {
for k, v := range ctx.Request.Header.All() {
r.Header.Add(string(k), string(v))
})
}
// 设置请求体
if len(ctx.PostBody()) > 0 {

View File

@ -138,7 +138,7 @@ func (s *Server) Start() error {
// 创建 QUIC 监听器
s.listener, err = quic.ListenEarly(udpConn, s.tlsConfig, quicConfig)
if err != nil {
udpConn.Close()
_ = udpConn.Close()
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{})
go func() {
s.http3Server.Close()
_ = s.http3Server.Close()
close(done)
}()

View File

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

View File

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

View File

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

View File

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