我正在尝试使用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)
}
我有没有忽略什么?
http.NewRequest
的第一个参数应该全部大写以实现最广泛的兼容性。这里的示例在我使用 NginX 时无法正常工作。 - jelder