36

Go! で gzip された HTTP レスポンスを読み込もうとしています。しかし、私は常に次のエラーメッセージを受け取ります:

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

"curl -H "Accept-Encoding: gzip" http://foo.com/ | gunzip -" を実行すると、応答が正しく 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)
}

私は何かを見落としていますか?

4

4 に答える 4

66

編集:以下は、圧縮を手動で処理する例です。ヘッダーを設定しない場合、デフォルトの 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

簡潔にするためにエラー処理を削除しました。私は延期を続けました。

于 2012-10-30T00:58:22.267 に答える
37

net/http#Transportgzip圧縮された応答を処理します。特別なことをする必要はありません。

ここDisableCompressionでオプションを見てください。

于 2012-10-29T22:08:15.590 に答える
18

net/http ドキュメント (110 行目)によると、 Accept-Encoding要求ヘッダーを手動で設定した場合、gzip された応答は http.Transport によって自動的に解凍されません。それ以外の場合、動作はトランスポートのDisableCompressionブール値によって制御されます

于 2016-08-15T11:47:49.030 に答える