Go开发TCP代理时如何将http.Response转换为字节数组
实现方案
Go标准库net/http包的http.Response结构体本身提供了Write方法,可以直接将完整的HTTP响应(包含状态行、响应头、响应体)序列化到任意实现了io.Writer接口的对象中,你可以搭配bytes.Buffer来接收序列化后的字节数组,具体实现如下:
核心代码替换
你代码中buf := res.ToBuffer()的部分可以替换为以下逻辑:
// 注意要先添加defer关闭响应体,避免内存泄漏 defer res.Body.Close() // 初始化buffer接收序列化后的响应 var buf bytes.Buffer // 调用http.Response的Write方法将完整响应写入buffer err = res.Write(&buf) if err != nil { // 处理序列化错误,比如记录日志、返回错误响应给客户端等 log.Printf("serialize http response failed: %v", err) return nil } // buf.Bytes()就是完整的HTTP响应字节数组,可以直接通过TCP连接发送 c.Send(buf.Bytes())
注意事项
res.Write方法会自动处理响应头的序列化逻辑,包括自动设置Content-Length或者添加Transfer-Encoding: chunked标识,如果你需要严格复用上游服务返回的原始响应头,建议在调用Write方法前先对res.Header做校验,避免自动修改的头不符合预期- 如果后续你需要修改响应体内容,修改完成后要手动更新
Content-Length头的值为新的响应体长度,否则会出现响应长度不匹配的问题 - 该方案兼容HTTP/1.0、HTTP/1.1协议的响应序列化,如果你的代理需要处理HTTP/2请求,需要额外适配HTTP/2的帧传输逻辑
内容的提问来源于stack exchange,提问作者Matteo
相关产品推荐
相关产品推荐

