我正在尝试编写Go客户端来测试我们的超文本传输协议/2架构体系。我想向https://mydomain.tld/somePage
发出超文本传输协议请求,并期望收到html响应,以及几个推送的资源。我想确保那些推送成功,如果不成功则失败。
我不清楚标准库的任何部分是否公开了我需要的这个功能。
我可以查看响应并检查协议版本以检测http2。
我可以看到Link
头在来自像https://http2-push.appspot.com/这样发送推送的站点的响应中,但我不太清楚Link头和实际Push Promise帧之间的关系。您可以通过超文本传输协议1.1获得链接头,所以我不确定单独确保推送会发生。
http2包有一个较低级别的Framer
接口,我可以利用它来验证原始帧,但老实说,我不知道如何设置一个并向其发出初始请求。
有没有关于go客户端如何验证http2推送资源的正确配置的示例?
已提交补丁以供审查。
“http2:支持在客户端消费PUSH_PROMISE流”
(github问题具有里程碑“未计划”,希望不会在审查队列中显着降低优先级。)
使用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 >