为了账号安全,请及时绑定邮箱和手机立即绑定

转换。对字节数组的响应

转换。对字节数组的响应

Go
慕婉清6462132 2022-09-26 19:58:15
我正在尝试开发一个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 方法,该方法将返回一个字节数组(如果需要)。


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信