将 http.Response 转换为字节数组
Transform http.Response into array of bytes
我正在尝试开发一个 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
}
但是我找不到将响应转换回字节数组或字符串数组的方法,我是不是漏掉了什么?
一个http.Request对象有一个Write
方法:
func (r *Request) Write(w io.Writer) error
Write writes an HTTP/1.1 request, which is the header and body, in wire format.
您可以使用它来将字节写入缓冲区对象。例如:
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
方法,它将 return 一个字节数组,如果这是你想要的。
我正在尝试开发一个 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
}
但是我找不到将响应转换回字节数组或字符串数组的方法,我是不是漏掉了什么?
一个http.Request对象有一个Write
方法:
func (r *Request) Write(w io.Writer) error
Write writes an HTTP/1.1 request, which is the header and body, in wire format.
您可以使用它来将字节写入缓冲区对象。例如:
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
方法,它将 return 一个字节数组,如果这是你想要的。