One suggestion for debugging is to call ioutil.ReadAll() on the Body first (putting it into a bytes.Buffer) then attempt to create a gzip reader from that. That will give you a chance to examine how much and what data exactly you were reading from the client.
On Thu, Apr 12, 2018 at 2:05 PM, Yaroslav Molochko <ono...@gmail.com> wrote: > First of all I would like to thank you for your time and willing to help. > > I've tried to treat error.EOF as real error, but it did not help. What is > interesting, when I tried to debug it, everything seems to be fine, from > gzip point of view, but when it reaches: > > body, err := ioutil.ReadAll(reader) > > if the reader is gzip.Reader - it throws an error: "unexpected EOF" > > > > On Thu, Apr 12, 2018 at 10:45 PM andrey mirtchovski <mirtchov...@gmail.com> > wrote: >> >> from the panic you can see that you're passing to ReadAll a valid >> interface (non-nil type pointer) however the interface contains a nil >> object (nil value pointer): >> >> io/ioutil.ReadAll(0x14ce020, 0x0, 0x0, 0x1a, 0xc420069cb0, 0x1, 0x1) >> >> to understand why there are more arguments than you expect in the >> function call refer to this article and the articles it links to: >> >> https://joeshaw.org/understanding-go-panic-output/ >> >> The cause for this is due to the gzip library attempting to read a >> header from the reader before fully creating it. If it fails it may >> return io.EOF, as described in this comment: >> >> https://golang.org/src/compress/gzip/gunzip.go?#L180 >> >> which will be propagated up to your handler and will cause the error >> checking to fail. >> >> your best source of action, in my opinion, is to treat io.EOF from >> gzip.NewReader() as a real error. >> >> On Thu, Apr 12, 2018 at 1:09 PM, Yaroslav Molochko <ono...@gmail.com> >> wrote: >> > Hi guys, >> > >> > I have following code: >> > >> > func handler(w http.ResponseWriter, r *http.Request) { >> > var reader io.Reader >> > switch r.Header.Get("Content-Encoding") { >> > case "gzip": >> > gz, err := gzip.NewReader(r.Body) >> > if err != nil && err.Error() != "EOF" { >> > fmt.Fprintf(w, >> > "error with gzip reader: %s", >> > err.Error()) >> > } >> > defer gz.Close() >> > reader = gz >> > case "deflate": >> > def := flate.NewReader(r.Body) >> > defer def.Close() >> > reader = def >> > default: >> > // just use the default reader >> > reader = r.Body >> > } >> > body, err := ioutil.ReadAll(reader) >> > fmt.Println(string(body)) >> > } >> > >> > non gzip requests are passing by, but gzip is always falling with panic: >> > 19:46:09.058697 server.go:2923: http: panic serving 127.0.0.1:63744: >> > runtime >> > error: invalid memory address or nil pointer dereference >> > goroutine 29 [running]: >> > net/http.(*conn).serve.func1(0xc4200b5ae0) >> > /usr/local/Cellar/go/1.10/libexec/src/net/http/server.go:1726 >> > +0xd0 >> > panic(0x13fe840, 0x16cfc60) >> > /usr/local/Cellar/go/1.10/libexec/src/runtime/panic.go:505 >> > +0x229 >> > compress/gzip.(*Reader).Close(0x0, 0x1a, 0xc420069cb0) >> > >> > /usr/local/Cellar/go/1.10/libexec/src/compress/gzip/gunzip.go:292 >> > +0x22 >> > panic(0x13fe840, 0x16cfc60) >> > /usr/local/Cellar/go/1.10/libexec/src/runtime/panic.go:505 >> > +0x229 >> > io/ioutil.readAll.func1(0xc420069c00) >> > /usr/local/Cellar/go/1.10/libexec/src/io/ioutil/ioutil.go:30 >> > +0x104 >> > panic(0x13fe840, 0x16cfc60) >> > /usr/local/Cellar/go/1.10/libexec/src/runtime/panic.go:505 >> > +0x229 >> > compress/gzip.(*Reader).Read(0x0, 0xc420204200, 0x200, 0x200, 0x200, >> > 0x200, >> > 0xc420204200) >> > >> > /usr/local/Cellar/go/1.10/libexec/src/compress/gzip/gunzip.go:247 >> > +0x37 >> > bytes.(*Buffer).ReadFrom(0xc4201b78f0, 0x14ce020, 0x0, 0xc4201740a0, >> > 0xc420069c10, 0x10d0211) >> > /usr/local/Cellar/go/1.10/libexec/src/bytes/buffer.go:205 +0xa0 >> > io/ioutil.readAll(0x14ce020, 0x0, 0x200, 0x0, 0x0, 0x0, 0x0, 0x0) >> > /usr/local/Cellar/go/1.10/libexec/src/io/ioutil/ioutil.go:36 >> > +0xb5 >> > io/ioutil.ReadAll(0x14ce020, 0x0, 0x0, 0x1a, 0xc420069cb0, 0x1, 0x1) >> > /usr/local/Cellar/go/1.10/libexec/src/io/ioutil/ioutil.go:45 >> > +0x3e >> > main.handler(0x14d25c0, 0xc420202380, 0xc42013e200) >> > >> > /Users/onorua/dev/go/src/github.com/onorua/gpr-edge/gpr-edge.go:83 >> > +0xe0 >> > net/http.HandlerFunc.ServeHTTP(0x149a500, 0x14d25c0, 0xc420202380, >> > 0xc42013e200) >> > /usr/local/Cellar/go/1.10/libexec/src/net/http/server.go:1947 >> > +0x44 >> > net/http.(*ServeMux).ServeHTTP(0x16df780, 0x14d25c0, 0xc420202380, >> > 0xc42013e200) >> > /usr/local/Cellar/go/1.10/libexec/src/net/http/server.go:2337 >> > +0x130 >> > net/http.serverHandler.ServeHTTP(0xc42009d860, 0x14d25c0, 0xc420202380, >> > 0xc42013e200) >> > /usr/local/Cellar/go/1.10/libexec/src/net/http/server.go:2694 >> > +0xbc >> > net/http.(*conn).serve(0xc4200b5ae0, 0x14d2b40, 0xc42019ea00) >> > /usr/local/Cellar/go/1.10/libexec/src/net/http/server.go:1830 >> > +0x651 >> > created by net/http.(*Server).Serve >> > /usr/local/Cellar/go/1.10/libexec/src/net/http/server.go:2795 >> > +0x27b >> > what am I doing wrong? >> > >> > -- >> > You received this message because you are subscribed to the Google >> > Groups >> > "golang-nuts" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> > an >> > email to golang-nuts+unsubscr...@googlegroups.com. >> > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.