Make ReadBinary more general and re-use in router

This commit is contained in:
Jonathan Lange
2016-06-20 18:02:23 +01:00
parent 13269e8110
commit 81b05a33ee
2 changed files with 24 additions and 36 deletions

View File

@@ -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)

View File

@@ -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