tag - Leyendo la respuesta HTTP comprimida en Go
title seo length (3)
Estoy tratando de leer una respuesta HTTP comprimida con Go! pero siempre recibo el siguiente mensaje de error:
panic: gzip: invalid header
[...] stack trace [...]
Si ejecuto "Curl -H" Accept-Encoding: gzip " http://foo.com/ | gunzip -" Recibo la respuesta correctamente. También verifiqué con ngrep y el par Accept-Encoding / Content-Encoding se envió / devolvió correctamente.
Si creo un archivo con algún contenido ficticio y lo gzip, puedo leerlo desde mi Go! programa.
El programa que utilicé para probar:
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)
}
¿He pasado por alto algo?
De acuerdo con net / http docs (línea 110), si configura manualmente el encabezado de solicitud de codificación y aceptación , la respuesta de gzipped no se descomprimirá automáticamente por el http.Transport. De lo contrario, el comportamiento es controlado por el booleano DisableCompression del transporte .
net/http#Transport
maneja las respuestas comprimidas de gzip
. No tienes que hacer nada especial.
EDITAR: El siguiente es un ejemplo de manejo manual de compresión. Si no configura el encabezado, el transporte predeterminado lo hará por usted y luego se descomprimirá mientras lee la respuesta.
client := new(http.Client)
request, err := http.NewRequest("GET", "http://.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
Error de manejo eliminado por brevedad. Me quedé con los difers.