// Package handler 提供 HTTP 请求处理器,包括路由、静态文件服务和零拷贝传输。 // // 该文件包含 sendfile 的公共代码,供所有平台使用。 // // 作者:xfy package handler import ( "io" "net" "os" "github.com/valyala/fasthttp" ) const ( // MinSendfileSize 使用 sendfile 的最小文件大小(8KB)。 // 小于该值的文件使用普通 io.Copy,避免系统调用开销。 MinSendfileSize = 8 * 1024 ) // getNetConn 从 fasthttp.RequestCtx 获取底层 net.Conn。 // // 参数: // - ctx: fasthttp 请求上下文 // // 返回值: // - net.Conn: 底层网络连接,如果无法获取则返回 nil func getNetConn(ctx *fasthttp.RequestCtx) net.Conn { return ctx.Conn() } // copyFile 普通文件拷贝(fallback)。 // // 使用 io.Copy 进行文件传输,适用于不支持 sendfile 的平台或小文件。 // // 参数: // - ctx: fasthttp 请求上下文,作为写入目标 // - file: 源文件对象 // - offset: 文件起始偏移量 // - length: 传输长度,0 表示拷贝到文件末尾 // // 返回值: // - error: 拷贝过程中的错误 func copyFile(ctx *fasthttp.RequestCtx, file *os.File, offset, length int64) error { if offset > 0 { if _, err := file.Seek(offset, io.SeekStart); err != nil { return err } } if length > 0 { _, err := io.CopyN(ctx, file, length) return err } _, err := io.Copy(ctx, file) return err }