Closed
Description
Please answer these questions before submitting your issue. Thanks!
- What version of Go are you using (
go version
)?
go version devel +1f44643 Wed Jun 22 00:12:55 2016 +0000 darwin/amd64 - What operating system and processor architecture are you using (
go env
)?
GOARCH="amd64"
GOBIN="/Users/emmanuelodeke/go/bin"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/emmanuelodeke/go"
GORACE=""
GOROOT="/Users/emmanuelodeke/go/src/go.googlesource.com/go"
GOTOOLDIR="/Users/emmanuelodeke/go/src/go.googlesource.com/go/pkg/tool/darwin_amd64"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/kn/s30g1srd4h50bh6sd322tppm0000gn/T/go-build038095302=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1" - What did you do?
Run program at https://play.golang.org/p/NqqvAkiIao with source of http://ualberta.ca/~odeke/tx.gif
$ go run NqqvAkiIao.go --source http://ualberta.ca/~odeke/tx.gif
If possible, provide a recipe for reproducing the error.
A complete runnable program is good.
A link on play.golang.org is best.
- What did you expect to see?
Successful decoding of a gif with no errors - What did you see instead?
gif: too much image data
/cc @montanaflynn who reported this issue first.
Code inlined
/*
After running this gif
https://67.media.tumblr.com//b02659b27081314a412215f4eb31dacf/tumblr_nu2x4whJgy1udf6d3o1_400.gif
through ffmpeg, Go fails to decode the gif with error:
`gif: too much image data`
Command:
$ ffmpeg -i https://67.media.tumblr.com//b02659b27081314a412215f4eb31dacf/tumblr_nu2x4whJgy1udf6d3o1_400.gif outf.gif
$ go run main.go --source outf.gif
- Repro URL
http://ualberta.ca/~odeke/tx.gif
Interestingly:
- The outfile is 1.0MB.
- The original file is 1.4MB.
*/
package main
import (
"flag"
"image/gif"
"log"
"net/http"
"path/filepath"
"strings"
)
func localAndNetBasedClient() *http.Client {
transport := new(http.Transport)
transport.RegisterProtocol("file", http.NewFileTransport(http.Dir("/")))
client := new(http.Client)
client.Transport = transport
return client
}
var httpPrefixes = []string{"http", "https"}
func ensureFitForFetch(source string) string {
for _, prefix := range httpPrefixes {
if strings.HasPrefix(source, prefix) {
return source
}
}
absSource, err := filepath.Abs(source)
if err == nil {
source = absSource
}
return strings.Join([]string{"file://", source}, "/")
}
func main() {
var source string
flag.StringVar(&source, "source",
"https://67.media.tumblr.com//b02659b27081314a412215f4eb31dacf/tumblr_nu2x4whJgy1udf6d3o1_400.gif",
"the URI of the gif you want to ensure properly decodes in Go")
flag.Parse()
client := localAndNetBasedClient()
source = ensureFitForFetch(source)
res, err := client.Get(source)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
if _, err := gif.DecodeAll(res.Body); err != nil {
log.Fatal(err)
}
}