【问题标题】:Transform http.Response into array of bytes将 http.Response 转换为字节数组
【发布时间】:2021-11-02 09:53:30
【问题描述】:

我正在尝试开发一个 tcp 代理,在这个 tcp 代理中我必须同时处理 http 和 tcp 请求。

目前,对于传入的请求,我检测它是 http 还是 tcp 请求,如果是 http,则将其解析为 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)
    // 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
}

但是我找不到将响应转换回字节或字符串数​​组的方法,是我遗漏了什么吗?

【问题讨论】:

    标签: go tcp


    【解决方案1】:

    http.Request 对象有一个Write 方法:

    func (r *Request) Write(w io.Writer) error
    

    Write 以有线格式写入 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 方法,如果这是你想要的,它将返回一个字节数组。

    【讨论】:

    • 您正在处理请求,但问题是关于响应的。并不是说它太重要了,因为*http.Response 也有这样的Write 方法。
    • 嘿,好球!我已更新答案以显示正在处理响应。
    猜你喜欢
    • 2014-08-08
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多