gpt4 book ai didi

go - 在 Go 中读取 gzipped HTTP 响应

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:32 25 4
gpt4 key购买 nike

我正在尝试使用 Go 读取压缩后的 HTTP 响应!但我总是收到以下错误消息:

panic: gzip: invalid header
[...] stack trace [...]

如果我运行“curl -H "Accept-Encoding: gzip"http://foo.com/ | gunzip -",我会得到正确压缩的响应。我还仔细检查了 ngrep,并正确发送/返回了 Accept-Encoding/Content-Encoding 对。

如果我创建一个包含一些虚拟内容的文件并将其压缩,我可以从我的 Go! 中读取它!程序。

我用来测试的程序:

package main

import (
"io"
//"os"
"fmt"
"compress/gzip"
"net/http"
)

func main() {
/* This works fine
f, _ := os.Open("/tmp/test.gz")
defer f.Close()
reader, err := gzip.NewReader(f)
*/

// This does not :/
resp, _ := http.Get("http://foo.com/")
defer resp.Body.Close()
reader, err := gzip.NewReader(resp.Body)

if err != nil { panic(err) }

buff := make([]byte, 1024)
for {
n, err := reader.Read(buff)

if err != nil && err != io.EOF {
panic(err)
}

if n == 0 {
break
}
}

s := fmt.Sprintf("%s", buff)
fmt.Println(s)
}

我是不是忽略了什么?

最佳答案

编辑: 以下是手动处理压缩的示例。如果您不设置 header ,默认的 Transport 会为您设置,然后在您读取 response.Body 时解压缩。

client := new(http.Client)

request, err := http.NewRequest("GET", "http://stackoverflow.com", nil)
request.Header.Add("Accept-Encoding", "gzip")

response, err := client.Do(request)
defer response.Body.Close()

// Check that the server actually sent compressed data
var reader io.ReadCloser
switch response.Header.Get("Content-Encoding") {
case "gzip":
reader, err = gzip.NewReader(response.Body)
defer reader.Close()
default:
reader = response.Body
}

io.Copy(os.Stdout, reader) // print html to standard out

为简洁起见删除了错误处理。我保留了延期。

关于go - 在 Go 中读取 gzipped HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51233437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com