当前位置: 首页 > 知识库问答 >
问题:

如何从net/HTTP请求中读取HTTP/2推送帧

刘选
2023-03-14

我正在尝试编写Go客户端来测试我们的超文本传输协议/2架构体系。我想向https://mydomain.tld/somePage发出超文本传输协议请求,并期望收到html响应,以及几个推送的资源。我想确保那些推送成功,如果不成功则失败。

我不清楚标准库的任何部分是否公开了我需要的这个功能

我可以查看响应并检查协议版本以检测http2。

我可以看到Link头在来自像https://http2-push.appspot.com/这样发送推送的站点的响应中,但我不太清楚Link头和实际Push Promise帧之间的关系。您可以通过超文本传输协议1.1获得链接头,所以我不确定单独确保推送会发生。

http2包有一个较低级别的Framer接口,我可以利用它来验证原始帧,但老实说,我不知道如何设置一个并向其发出初始请求。

有没有关于go客户端如何验证http2推送资源的正确配置的示例?

共有2个答案

桓信鸥
2023-03-14

已提交补丁以供审查。

“http2:支持在客户端消费PUSH_PROMISE流”

(github问题具有里程碑“未计划”,希望不会在审查队列中显着降低优先级。)

江宏放
2023-03-14

使用golang的框架。org/x/net/http2并不难,如果我们能得到一个由http自然读取的字节副本的话。客户我们可以通过实现自己的网络来做到这一点。康涅狄格州。

我在下面的程序中取得了一些进展,但是我没有看到预期的PUSH_promise框架。经过深入研究,我发现Go客户端显式禁用了Push。在这种情况下,服务器不允许发送这些帧。我看不出有什么明显的方法可以改变这种设置(除了破解stdlib)。

我想我仍然分享我的代码。也许我错过了一些简单的东西来让它工作。

package main

import (
    "bytes"
    "crypto/tls"
    "io"
    "io/ioutil"
    "log"
    "net"
    "net/http"
    "os"

    "golang.org/x/net/http2"
)

func main() {
    buf := &bytes.Buffer{}
    transport := &http2.Transport{DialTLS: dialT(buf)}
    client := &http.Client{Transport: transport}

    res, err := client.Get("https://http2-push.appspot.com/")
    if err != nil {
            log.Fatal(err)
    }

    res.Body.Close()
    res.Write(os.Stdout)

    framer := http2.NewFramer(ioutil.Discard, buf)
    for {
            f, err := framer.ReadFrame()
            if err == io.EOF || err == io.ErrUnexpectedEOF {
                    break
            }
            switch err.(type) {
            case nil:
                    log.Println(f)
            case http2.ConnectionError:
                    // Ignore. There will be many errors of type "PROTOCOL_ERROR, DATA
                    // frame with stream ID 0". Presumably we are abusing the framer.
            default:
                    log.Println(err, framer.ErrorDetail())
            }
    }
}

// dialT returns a connection that writes everything that is read to w.
func dialT(w io.Writer) func(network, addr string, cfg *tls.Config) (net.Conn, error) {
    return func(network, addr string, cfg *tls.Config) (net.Conn, error) {
            conn, err := tls.Dial(network, addr, cfg)
            return &tConn{conn, w}, err
    }
}

type tConn struct {
    net.Conn
    T io.Writer // receives everything that is read from Conn
}

func (w *tConn) Read(b []byte) (n int, err error) {
    n, err = w.Conn.Read(b)
    w.T.Write(b)
    return
}
 类似资料:
  • 问题内容: 我在这里尝试做的是获取给定URL的标头,以便确定MIME类型。我希望能够查看是否http://somedomain/foo/将返回例如HTML文档或JPEG图像。因此,我需要弄清楚如何发送HEAD请求,以便无需下载内容就可以读取MIME类型。有人知道这样做的简单方法吗? 问题答案: 使用。 还有一个getheader(name)获取特定的标头。

  • 如果收到类型的请求,如何读取特定标头的值?在本例中,我希望从请求头中提取一个jwt令牌的值。

  • 问题内容: 有人可以帮我将红宝石代码转换为Go吗?请参考下面的红宝石代码。 去。 问题答案: 您似乎想发布查询,该查询类似于此答案: 如果您的查询是JSON查询,请将“ ” 替换为“ ” 。

  • 问题内容: 在Java中,如何编写HTTP请求消息并将其发送到HTTP WebServer? 问题答案: 你可以使用。 示例(从此处开始),进行了改进。包括在链接腐烂的情况下:

  • (↓↓正文↓↓) <\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

  • 很多时候我们需要在页面打开的时候,读取远程的内容,然后在当前页面显示. 这就需要用到 http请求了. vue页面调用http请求 vuejs 内置了对发送http请求的支持. 只需要在对应页面的script 标签内加上对应的代码就好. 例如: 我们新增一个页面,叫 "博客列表页" : src/components/BlogList.vue, 内容如下: <template> <div >