【发布时间】:2020-10-04 19:07:40
【问题描述】:
我有一个特殊情况,我需要将 HTTP/2 响应输出解析为 Go 的 http.Response。响应本身具有默认结构:
$ curl --include https://google.com
HTTP/2 301
location: https://www.google.com/
content-type: text/html; charset=UTF-8
date: Mon, 15 Jun 2020 11:08:39 GMT
expires: Wed, 15 Jul 2020 11:08:39 GMT
cache-control: public, max-age=2592000
server: gws
content-length: 220
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.com/">here</A>.
</BODY></HTML>
状态和身体本身并不重要,这只是一个例子。
http 库具有函数ReadResponse(r *bufio.Reader, req *Request) (*Response, error),这正是我所需要的,但它无法用malformed HTTP version HTTP/2 解析 HTTP/2,但它适用于 HTTP/1.1 和 HTTP/1.0。另外,用http.DefaultClient.Do()请求后,可以看到响应的字段Proto包含HTTP/2.0,这意味着HTTP/2没有问题。
任何想法如何解析此响应?
【问题讨论】:
-
http.ParseHTTPVersion 函数不解析
HTTP/2.replaceHTTP/2到HTTP/1.1或HTTP/2.0。 -
它也不会解析
HTTP/2.0,但HTTP/1.1可以解决问题,在更复杂的响应中不会简单地替换版本吗? -
只匹配body前缀为
HTTP/2,然后替换前7个字节。 -
是的,我明白了,我只是问这只是前 7 个字节的问题吗?不同的HTTP版本是不是响应格式、解析规则等不一样?
-
FTR:这不是“原始”HTTP/2 响应。 HTTP/2 使用有状态的二进制协议,因此原始响应不是人类可读的,而且通常甚至不是独立的。这是 curl 对模仿 HTTP/1.x 的 HTTP/2 响应的呈现。