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
}

对于这种方式,如何获取请求或者响应报文呢?

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!