我正在尝试开发一个tcp代理,在这个tcp代理中,我将不得不操纵http和tcp请求。目前,对于传入的请求,我检测它是http还是tcp请求,如果它是http,那么我将其解析为:http.Requestfunc (s *TcpProxy) OnMessage(c *connection.Connection, ctx interface{}, data []byte) interface{} { reader := bytes.NewReader(data) newReader := bufio.NewReader(reader) req, err := http.ReadRequest(newReader) // This is an http request}现在,我方便地操作请求,因为我可以使用从该接口公开的方法,然后最终我将响应从我的代理发送回接收入站请求的服务。func (s *TcpProxy) OnMessage(c *connection.Connection, ctx interface{}, data []byte) interface{} { reader := bytes.NewReader(data) newReader := bufio.NewReader(reader) req, err := http.ReadRequest(newReader) // Manipulate http request // ... // Proxy the request proxyReq, err := http.NewRequest(req.Method, proxyUrl, req.Body) // Capture the duration while making a request to the destination service. res, err := httpClient.Do(proxyReq) buf := res.ToBuffer() // <= How can I achieve this c.Send(buf) c.Close() return nil}但是,我找不到将响应转换回字节或字符串数组的方法,我是否遗漏了某些内容?
1 回答
芜湖不芜
TA贡献1796条经验 获得超7个赞
一个网址。请求对象具有 Write 方法:
func (r *Request) Write(w io.Writer) error
写入以有线格式写入 HTTP/1.1 请求,即标头和正文。
您可以使用它将字节写入缓冲区对象。例如:
package main
import (
"bytes"
"fmt"
"net/http"
)
func main() {
var buf bytes.Buffer
req, err := http.NewRequest("GET", "http://google.com", nil)
if err != nil {
panic(err)
}
client := &http.Client{}
res, err := client.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
if err := res.Write(&buf); err != nil {
panic(err)
}
// ...do whatever you want with the buffer here...
fmt.Println(buf.String())
}
Buffer 对象具有 Bytes 方法,该方法将返回一个字节数组(如果需要)。
- 1 回答
- 0 关注
- 155 浏览
添加回答
举报
0/150
提交
取消