diff --git a/app/router.go b/app/router.go index fce7c7311..f818a52ad 100644 --- a/app/router.go +++ b/app/router.go @@ -1,8 +1,6 @@ package app import ( - "compress/gzip" - "encoding/gob" "io" "net/http" "net/url" @@ -122,43 +120,22 @@ func RegisterReportPostHandler(a Adder, router *mux.Router) { post := router.Methods("POST").Subrouter() post.HandleFunc("/api/report", requestContextDecorator(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { var ( - rpt report.Report - reader = r.Body - err error - compressedSize, uncompressedSize uint64 + rpt report.Report + reader = r.Body ) - if log.GetLevel() == log.DebugLevel { - reader = byteCounter{next: reader, count: &compressedSize} - } - if strings.Contains(r.Header.Get("Content-Encoding"), "gzip") { - reader, err = gzip.NewReader(reader) - if err != nil { - respondWith(w, http.StatusBadRequest, err) - return - } - } - - if log.GetLevel() == log.DebugLevel { - reader = byteCounter{next: reader, count: &uncompressedSize} - } - decoder := gob.NewDecoder(reader).Decode + gzipped := strings.Contains(r.Header.Get("Content-Encoding"), "gzip") + var handle codec.Handle if strings.HasPrefix(r.Header.Get("Content-Type"), "application/json") { - decoder = codec.NewDecoder(reader, &codec.JsonHandle{}).Decode + handle = &codec.JsonHandle{} } else if strings.HasPrefix(r.Header.Get("Content-Type"), "application/msgpack") { - decoder = codec.NewDecoder(reader, &codec.MsgpackHandle{}).Decode + handle = &codec.MsgpackHandle{} } - if err := decoder(&rpt); err != nil { + if err := rpt.ReadBinary(reader, gzipped, handle); err != nil { respondWith(w, http.StatusBadRequest, err) return } - log.Debugf( - "Received report sizes: compressed %d bytes, uncompressed %d bytes (%.2f%%)", - compressedSize, - uncompressedSize, - float32(compressedSize)/float32(uncompressedSize)*100, - ) if err := a.Add(ctx, rpt); err != nil { log.Errorf("Error Adding report: %v", err) diff --git a/report/marshal.go b/report/marshal.go index 39fa7704d..e477b5771 100644 --- a/report/marshal.go +++ b/report/marshal.go @@ -2,6 +2,7 @@ package report import ( "compress/gzip" + "encoding/gob" "io" "github.com/ugorji/go/codec" @@ -21,12 +22,22 @@ func (rep Report) WriteBinary(w io.Writer) error { } // ReadBinary reads into a Report from a gzipped msgpack. -func (rep *Report) ReadBinary(r io.Reader) error { - reader, err := gzip.NewReader(r) - if err != nil { - return err +// +// Will decompress the binary if gzipped is true, and will use the given +// codecHandle to decode it. If codecHandle is nil, will decode as a gob. +func (rep *Report) ReadBinary(r io.Reader, gzipped bool, codecHandle codec.Handle) error { + var err error + if gzipped { + r, err = gzip.NewReader(r) + if err != nil { + return err + } } - if err := codec.NewDecoder(reader, &codec.MsgpackHandle{}).Decode(&rep); err != nil { + decoder := gob.NewDecoder(r).Decode + if codecHandle != nil { + decoder = codec.NewDecoder(r, codecHandle).Decode + } + if err := decoder(&rep); err != nil { return err } return nil @@ -35,7 +46,7 @@ func (rep *Report) ReadBinary(r io.Reader) error { // MakeFromBinary constructs a Report from a gzipped msgpack. func MakeFromBinary(r io.Reader) (*Report, error) { rep := MakeReport() - if err := rep.ReadBinary(r); err != nil { + if err := rep.ReadBinary(r, true, &codec.MsgpackHandle{}); err != nil { return nil, err } return &rep, nil