go如何使用h2代理获取请求报文或者响应报文?
使用go开启h2支持之后,怎么来获得请求或者响应的报文呢?
服务器监听代码
server := &http.Server{
Addr: addr,
Handler: proxy,
TLSConfig: &tls.Config{Certificates: []tls.Certificate{cert}},
}
// 显示配置h2支持
if err := http2.ConfigureServer(server, nil); err != nil {
panic(err)
}
return server.ListenAndServeTLS("", "")
代理转发代码
var cc net.Conn
cc, err := net.Dial("tcp", host)
if err != nil {
log.Println("net.Dial:", host, " ", err)
return
}
// 接收浏览器请求
// 如果是CONNECT,即是https连接
if ctx.Req.Method == http.MethodConnect {
// 为https请求,进行flush推送,将缓存信息推送到客户端
w.WriteHeader(http.StatusOK)
if fw, ok := w.(http.Flusher); ok {
fw.Flush()
}
// 兼容HTTP1.x
if conn, err := hijacker(w); err == nil && ctx.Req.ProtoMajor == 1 {
defer conn.Close()
transport(conn, cc)
return
}
transport(&readWriter{r: ctx.Req.Body, w: flushWriter{w}}, cc)
return
}
下面的是对于一些方法的重写
func transport(rw1, rw2 io.ReadWriter) error {
errc := make(chan error, 1)
go func() {
errc <- copyBuffer(rw1, rw2)
}()
go func() {
errc <- copyBuffer(rw2, rw1)
}()
err := <-errc
if err != nil && err == io.EOF {
err = nil
}
return err
}
func copyBuffer(dst io.Writer, src io.Reader) error {
buf := lPool.Get().([]byte)
defer lPool.Put(buf)
_, err := io.CopyBuffer(dst, src, buf)
return err
}
func (rw *readWriter) Read(p []byte) (n int, err error) {
return rw.r.Read(p)
}
func (rw *readWriter) Write(p []byte) (n int, err error) {
return rw.w.Write(p)
}
func (fw flushWriter) Write(p []byte) (n int, err error) {
defer func() {
if r := recover(); r != nil {
if s, ok := r.(string); ok {
err = errors.New(s)
log.Println("[http2]", err)
return
}
err = r.(error)
}
}()
n, err = fw.w.Write(p)
if err != nil {
return
}
if f, ok := fw.w.(http.Flusher); ok {
f.Flush()
}
return
}
对于这种方式,如何获取请求或者响应报文呢?