在Go中读取gzip压缩的HTTP响应

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


panic: gzip: invalid header

[...] stack trace [...]

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


如果我创建了一个包含一些虚拟内容的文件并将其gzip压缩,则可以从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)

}

我忽略了什么吗?


手掌心
浏览 589回答 3
3回答

Smart猫小萌

net/http#Transport处理gzip压缩的响应。您不必做任何特别的事情。看看这里的DisableCompression选项。

饮歌长啸

根据net / http docs(第110行)的说明,如果您手动设置Accept-Encoding请求标头,则gzip压缩的响应将不会被http.Transport自动解压缩。否则,行为由Transport的DisableCompression布尔值控制
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go