mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 18:20:27 +00:00
Make ReadBinary more general and re-use in router
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user