www tag near length gorenew espanol and go

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.