func TestReportPostHandler(t *testing.T) { test := func(contentType string, encoder func(interface{}) ([]byte, error)) { router := mux.NewRouter() c := app.NewCollector(1 * time.Minute) app.RegisterReportPostHandler(c, router) ts := httptest.NewServer(router) defer ts.Close() b, err := encoder(fixture.Report) if err != nil { t.Fatalf("Content-Type %s: %s", contentType, err) } req, err := http.NewRequest("POST", ts.URL+"/api/report", bytes.NewReader(b)) if err != nil { t.Fatalf("Error posting report: %v", err) } req.Header.Set("Content-Type", contentType) resp, err := http.DefaultClient.Do(req) if err != nil { t.Fatalf("Error posting report %v", err) } _, err = ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { t.Fatalf("Error posting report: %v", err) } if resp.StatusCode != http.StatusOK { t.Fatalf("Error posting report: %d", resp.StatusCode) } ctx := context.Background() report, err := c.Report(ctx) if err != nil { t.Error(err) } if want, have := fixture.Report.Endpoint.Nodes, report.Endpoint.Nodes; len(have) == 0 || len(want) != len(have) { t.Fatalf("Content-Type %s: %v", contentType, test.Diff(have, want)) } } test("", func(v interface{}) ([]byte, error) { buf := &bytes.Buffer{} err := gob.NewEncoder(buf).Encode(v) return buf.Bytes(), err }) test("application/json", func(v interface{}) ([]byte, error) { buf := &bytes.Buffer{} err := codec.NewEncoder(buf, &codec.JsonHandle{}).Encode(v) return buf.Bytes(), err }) test("application/msgpack", func(v interface{}) ([]byte, error) { buf := &bytes.Buffer{} err := codec.NewEncoder(buf, &codec.MsgpackHandle{}).Encode(v) return buf.Bytes(), err }) }
// wrap is used to wrap functions to make them more convenient func (s *HTTPServer) wrap(handler func(resp http.ResponseWriter, req *http.Request) (interface{}, error)) func(resp http.ResponseWriter, req *http.Request) { f := func(resp http.ResponseWriter, req *http.Request) { setHeaders(resp, s.agent.config.HTTPAPIResponseHeaders) // Invoke the handler reqURL := req.URL.String() start := time.Now() defer func() { s.logger.Printf("[DEBUG] http: Request %v (%v)", reqURL, time.Now().Sub(start)) }() obj, err := handler(resp, req) // Check for an error HAS_ERR: if err != nil { s.logger.Printf("[ERR] http: Request %v, error: %v", reqURL, err) code := 500 if http, ok := err.(HTTPCodedError); ok { code = http.Code() } resp.WriteHeader(code) resp.Write([]byte(err.Error())) return } prettyPrint := false if v, ok := req.URL.Query()["pretty"]; ok { if len(v) > 0 && (len(v[0]) == 0 || v[0] != "0") { prettyPrint = true } } // Write out the JSON object if obj != nil { var buf bytes.Buffer if prettyPrint { enc := codec.NewEncoder(&buf, jsonHandlePretty) err = enc.Encode(obj) if err == nil { buf.Write([]byte("\n")) } } else { enc := codec.NewEncoder(&buf, jsonHandle) err = enc.Encode(obj) } if err != nil { goto HAS_ERR } resp.Header().Set("Content-Type", "application/json") resp.Write(buf.Bytes()) } } return f }
func newRPCCodec(conn io.ReadWriteCloser, h codec.Handle) *rpcCodec { bw := bufio.NewWriter(conn) br := bufio.NewReader(conn) bb := new(bytes.Buffer) return &rpcCodec{ rwc: conn, bw: bw, br: br, enc: codec.NewEncoder(bw, h), dec: codec.NewDecoder(br, h), benc: codec.NewEncoder(bb, h), h: h, byteBuf: bb, } }
func TestEdgeMetadatasEncodingNil(t *testing.T) { want := EdgeMetadatas{} { gobs, err := want.GobEncode() if err != nil { t.Fatal(err) } have := EmptyEdgeMetadatas have.GobDecode(gobs) if have.psMap == nil { t.Error("needed to get back a non-nil psMap for EdgeMetadata") } } { for _, h := range []codec.Handle{ codec.Handle(&codec.MsgpackHandle{}), codec.Handle(&codec.JsonHandle{}), } { buf := &bytes.Buffer{} encoder := codec.NewEncoder(buf, h) want.CodecEncodeSelf(encoder) decoder := codec.NewDecoder(buf, h) have := EmptyEdgeMetadatas have.CodecDecodeSelf(decoder) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } } }
// sendTCPUserMsg is used to send a TCP userMsg to another host func (m *Memberlist) sendTCPUserMsg(to net.Addr, sendBuf []byte) error { dialer := net.Dialer{Timeout: m.config.TCPTimeout} conn, err := dialer.Dial("tcp", to.String()) if err != nil { return err } defer conn.Close() bufConn := bytes.NewBuffer(nil) if err := bufConn.WriteByte(byte(userMsg)); err != nil { return err } // Send our node state header := userMsgHeader{UserMsgLen: len(sendBuf)} hd := codec.MsgpackHandle{} enc := codec.NewEncoder(bufConn, &hd) if err := enc.Encode(&header); err != nil { return err } if _, err := bufConn.Write(sendBuf); err != nil { return err } return m.rawSendMsgTCP(conn, bufConn.Bytes()) }
// This test determines the behavior of codec with respect to advancing the // Reader when decoding error scenarios. It seems that the codec advances // the Reader if Decode fails, but sets its own state to expect a specific // type for the next Decode, and thus is functionally the same as not // advancing the Reader. func TestCodec(t *testing.T) { var buf bytes.Buffer mh := &codec.MsgpackHandle{WriteExt: true} enc := codec.NewEncoder(&buf, mh) dec := codec.NewDecoder(&buf, mh) var i int = math.MaxInt32 err := enc.Encode(i) require.Nil(t, err, "expected encoding to succeed") require.Equal(t, 5, len(buf.Bytes()), "expected buffer to contain bytes") var targetInt int err = dec.Decode(&targetInt) require.Nil(t, err, "expected decoding to succeed") require.Equal(t, math.MaxInt32, targetInt, "expected codec to successfully decode int") require.Equal(t, 0, len(buf.Bytes()), "expected buffer to be empty") var targetString string enc.Encode(i) require.Equal(t, 5, len(buf.Bytes()), "expected buffer to contain bytes") err = dec.Decode(&targetString) require.Error(t, err, "expected error while decoding") require.Contains(t, err.Error(), "Unrecognized descriptor byte", "expected error while decoding") require.Equal(t, 4, len(buf.Bytes()), "expected buffer to have bytes") err = dec.Decode(&targetString) require.Error(t, err, "expected error while decoding") require.Contains(t, err.Error(), "Unrecognized descriptor byte", "expected error while decoding") require.Equal(t, 4, len(buf.Bytes()), "expected buffer to have bytes") targetInt = 0 err = dec.Decode(&targetInt) require.Nil(t, err, "expected decoding to succeed") require.Equal(t, math.MaxInt32, targetInt, "expected codec to successfully decode int") require.Equal(t, 0, len(buf.Bytes()), "expected buffer to be empty") }
// loadContents loads or calculates and saves package contents func (collection *PackageCollection) loadContents(p *Package, packagePool aptly.PackagePool) []string { encoded, err := collection.db.Get(p.Key("xC")) if err == nil { contents := []string{} decoder := codec.NewDecoderBytes(encoded, collection.codecHandle) err = decoder.Decode(&contents) if err != nil { panic("unable to decode contents") } return contents } if err != database.ErrNotFound { panic("unable to load contents") } contents := p.CalculateContents(packagePool) var buf bytes.Buffer err = codec.NewEncoder(&buf, collection.codecHandle).Encode(contents) if err != nil { panic("unable to encode contents") } err = collection.db.Put(p.Key("xC"), buf.Bytes()) if err != nil { panic("unable to save contents") } return contents }
// Encode writes an encoded object to a new bytes buffer func encodeMsgPack(in interface{}) (*bytes.Buffer, error) { buf := bytes.NewBuffer(nil) hd := codec.MsgpackHandle{} enc := codec.NewEncoder(buf, &hd) err := enc.Encode(in) return buf, err }
func handleConnection(conn net.Conn, jobd *jobserver.JobServer, cbor *codec.CborHandle) { defer conn.Close() jobdv := reflect.ValueOf(jobd) reader := bufio.NewReader(conn) decoder := codec.NewDecoder(reader, cbor) writer := bufio.NewWriter(conn) encoder := codec.NewEncoder(writer, cbor) for { var request cborrpc.Request err := decoder.Decode(&request) if err == io.EOF { return } else if err != nil { fmt.Printf("Error reading message: %v\n", err) return } fmt.Printf("Request: %v\n", request) response := doRequest(jobdv, request) fmt.Printf("Response: %v\n", response) err = encoder.Encode(response) if err != nil { fmt.Printf("Error encoding response: %v\n", err) return } err = writer.Flush() if err != nil { fmt.Printf("Error writing response: %v\n", err) return } } }
func idHandlerFunc(ctx *fasthttp.RequestCtx, idWorker *goflake.IdWorker, retry int) { ua := string(ctx.UserAgent()) var ( id uint64 err error ) for i := 0; i < retry; i++ { id, err = idWorker.GetId(ua) if err == nil { break } } r := map[string]string{ "id": strconv.FormatUint(id, 10), } if strings.HasSuffix(string(ctx.Path()), ".msgpack") { ctx.SetContentType("application/x-msgpack; charset=UTF-8") if err := codec.NewEncoder(ctx, mh).Encode(r); err != nil { ctx.Error(err.Error(), fasthttp.StatusInternalServerError) } } else { ctx.SetContentType("application/json; charset=UTF-8") if err := json.NewEncoder(ctx).Encode(r); err != nil { ctx.Error(fmt.Sprintf(`{"error":"%v"}`, err.Error()), fasthttp.StatusInternalServerError) } } }
func (c *dynamoDBCollector) Add(ctx context.Context, rep report.Report) error { userid, err := c.userIDer(ctx) if err != nil { return err } var buf bytes.Buffer writer := gzip.NewWriter(&buf) if err := codec.NewEncoder(writer, &codec.MsgpackHandle{}).Encode(&rep); err != nil { return err } writer.Close() now := time.Now() rowKey := fmt.Sprintf("%s-%s", userid, strconv.FormatInt(now.UnixNano()/time.Hour.Nanoseconds(), 10)) _, err = c.db.PutItem(&dynamodb.PutItemInput{ TableName: aws.String(tableName), Item: map[string]*dynamodb.AttributeValue{ hourField: { S: aws.String(rowKey), }, tsField: { N: aws.String(strconv.FormatInt(now.UnixNano(), 10)), }, reportField: { B: buf.Bytes(), }, }, }) if err != nil { return err } return nil }
// getConn is used to get a connection from the pool func (n *NetworkTransport) getConn(target net.Addr) (*netConn, error) { // Check for a pooled conn if conn := n.getPooledConn(target); conn != nil { return conn, nil } // Dial a new connection conn, err := n.stream.Dial(target.String(), n.timeout) if err != nil { return nil, err } // Wrap the conn netConn := &netConn{ target: target, conn: conn, r: bufio.NewReader(conn), w: bufio.NewWriter(conn), } // Setup encoder/decoders netConn.dec = codec.NewDecoder(netConn.r, &codec.MsgpackHandle{}) netConn.enc = codec.NewEncoder(netConn.w, &codec.MsgpackHandle{}) // Done return netConn, nil }
func main() { var m = MsgPackSample{ Name: "ユイにゃん", Num: 17, Message: "AngelBeats!", } mh := &codec.MsgpackHandle{RawToString: true} buf1 := &bytes.Buffer{} buf2 := &bytes.Buffer{} var msgpackExample = MsgPackExample{ mh: mh, buf1: buf1, buf2: buf2, enc: codec.NewEncoder(buf1, mh), dec: codec.NewDecoder(buf2, mh), menc: msgpack.NewEncoder(buf1), mdec: msgpack.NewDecoder(buf2), } msgpackExample.packUnPackMsgPack(m) msgpackExample.packUnPackCodec(m) }
func (output *TDOutput) spawnEmitter() { output.logger.Notice("Spawning emitter") output.wg.Add(1) go func() { defer func() { output.spoolerDaemon.shutdownChan <- struct{}{} output.wg.Done() }() output.logger.Notice("Emitter started") buffer := bytes.Buffer{} for recordSet := range output.emitterChan { buffer.Reset() encoder := codec.NewEncoder(&buffer, output.codec) err := func() error { spooler, err := output.spoolerDaemon.getSpooler(recordSet.Tag) if err != nil { return err } addMetadata(&recordSet, output.metadata) err = encodeRecords(encoder, recordSet.Records) if err != nil { return err } output.logger.Debug("Emitter processed %d entries", len(recordSet.Records)) return spooler.journal.Write(buffer.Bytes()) }() if err != nil { output.logger.Error("%s", err.Error()) continue } } output.logger.Notice("Emitter ended") }() }
func (s *consulSnapshot) Persist(sink raft.SnapshotSink) error { // Register the nodes encoder := codec.NewEncoder(sink, msgpackHandle) // Write the header header := snapshotHeader{ LastIndex: s.state.LastIndex(), } if err := encoder.Encode(&header); err != nil { sink.Cancel() return err } if err := s.persistNodes(sink, encoder); err != nil { sink.Cancel() return err } if err := s.persistSessions(sink, encoder); err != nil { sink.Cancel() return err } if err := s.persistACLs(sink, encoder); err != nil { sink.Cancel() return err } if err := s.persistKV(sink, encoder); err != nil { sink.Cancel() return err } return nil }
// WriteAssets creates the assets in a dir. It expects dir to already exist. func WriteAssets(w io.Writer, shards uint64) { encoder := codec.NewEncoder(w, &codec.JsonHandle{Indent: 2}) ServiceAccount().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") EtcdRc().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") EtcdService().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") RethinkService().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") RethinkRc().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") ObjdRc().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") ObjdService().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") PfsdRc(uint64(shards)).CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") PfsdService().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") PpsdRc().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") PpsdService().CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") RolerRc(uint64(shards)).CodecEncodeSelf(encoder) fmt.Fprintf(w, "\n") }
func TestLatestMapEncodingNil(t *testing.T) { want := LatestMap{} { gobs, err := want.GobEncode() if err != nil { t.Fatal(err) } have := EmptyLatestMap have.GobDecode(gobs) if have.Map == nil { t.Error("Decoded LatestMap.psMap should not be nil") } } { for _, h := range []codec.Handle{ codec.Handle(&codec.MsgpackHandle{}), codec.Handle(&codec.JsonHandle{}), } { buf := &bytes.Buffer{} encoder := codec.NewEncoder(buf, h) want.CodecEncodeSelf(encoder) decoder := codec.NewDecoder(buf, h) have := EmptyLatestMap have.CodecDecodeSelf(decoder) if !reflect.DeepEqual(want, have) { t.Error(test.Diff(want, have)) } } } }
func TestSpanMsgPack(t *testing.T) { span := Span{Id: TestId("33f25a1a750a471db5bafa59309d7d6f"), SpanData: SpanData{ Begin: 1234, End: 5678, Description: "getFileDescriptors", Parents: []SpanId{}, TracerId: "testTracerId", }} mh := new(codec.MsgpackHandle) mh.WriteExt = true w := bytes.NewBuffer(make([]byte, 0, 2048)) enc := codec.NewEncoder(w, mh) err := enc.Encode(span) if err != nil { t.Fatal("Error encoding span as msgpack: " + err.Error()) } buf := w.Bytes() fmt.Printf("span: %s\n", hex.EncodeToString(buf)) mh = new(codec.MsgpackHandle) mh.WriteExt = true dec := codec.NewDecoder(bytes.NewReader(buf), mh) var span2 Span err = dec.Decode(&span2) if err != nil { t.Fatal("Failed to reverse msgpack encoding for " + span.String()) } ExpectSpansEqual(t, &span, &span2) }
func toJSON(out interface{}) ([]byte, error) { buf := &bytes.Buffer{} json := &codec.JsonHandle{} encoder := codec.NewEncoder(buf, json) err := encoder.Encode(out) return buf.Bytes(), err }
// NewRPCClient is used to create a new RPC client given the address. // This will properly dial, handshake, and start listening func NewRPCClient(addr string) (*RPCClient, error) { // Try to dial to serf conn, err := net.Dial("tcp", addr) if err != nil { return nil, err } // Create the client client := &RPCClient{ seq: 0, conn: conn.(*net.TCPConn), reader: bufio.NewReader(conn), writer: bufio.NewWriter(conn), dispatch: make(map[uint64]seqHandler), shutdownCh: make(chan struct{}), } client.dec = codec.NewDecoder(client.reader, &codec.MsgpackHandle{RawToString: true, WriteExt: true}) client.enc = codec.NewEncoder(client.writer, &codec.MsgpackHandle{RawToString: true, WriteExt: true}) go client.listen() // Do the initial handshake if err := client.handshake(); err != nil { client.Close() return nil, err } return client, err }
func (s *Service) handleLongPoll(c net.Conn, msg *LongPoll, data *clientData) error { debugf("handleLongPoll for %#v\n", s.Registry) var ret PollResult if msg.Name == ":lwt" { ret.Message = data.lwt } else { dur, err := time.ParseDuration(msg.Duration) if err != nil { return err } val, err := s.Registry.LongPollCancelable(msg.Name, dur, data.done) if err != nil { return err } if val != nil { debugf("inflight for %s: %#v\n", data.parent.RemoteAddr(), data) data.inflight[val.Message.MessageId] = val ret.Message = val.Message } } c.Write([]byte{uint8(PollResultType)}) enc := codec.NewEncoder(c, &msgpack) return enc.Encode(&ret) }
func TestAPITopologyAddsKubernetes(t *testing.T) { router := mux.NewRouter() c := app.NewCollector(1 * time.Minute) app.RegisterReportPostHandler(c, router) app.RegisterTopologyRoutes(router, c) ts := httptest.NewServer(router) defer ts.Close() body := getRawJSON(t, ts, "/api/topology") var topologies []app.APITopologyDesc decoder := codec.NewDecoderBytes(body, &codec.JsonHandle{}) if err := decoder.Decode(&topologies); err != nil { t.Fatalf("JSON parse error: %s", err) } equals(t, 4, len(topologies)) // Enable the kubernetes topologies rpt := report.MakeReport() rpt.Pod = report.MakeTopology() rpt.Pod.Nodes[fixture.ClientPodNodeID] = kubernetes.NewPod(&api.Pod{ ObjectMeta: api.ObjectMeta{ Name: "pong-a", Namespace: "ping", Labels: map[string]string{"ponger": "true"}, }, Status: api.PodStatus{ HostIP: "1.2.3.4", ContainerStatuses: []api.ContainerStatus{ {ContainerID: "container1"}, {ContainerID: "container2"}, }, }, }).GetNode("") buf := &bytes.Buffer{} encoder := codec.NewEncoder(buf, &codec.MsgpackHandle{}) if err := encoder.Encode(rpt); err != nil { t.Fatalf("GOB encoding error: %s", err) } checkRequest(t, ts, "POST", "/api/report", buf.Bytes()) body = getRawJSON(t, ts, "/api/topology") decoder = codec.NewDecoderBytes(body, &codec.JsonHandle{}) if err := decoder.Decode(&topologies); err != nil { t.Fatalf("JSON parse error: %s", err) } equals(t, 4, len(topologies)) found := false for _, topology := range topologies { if topology.Name == "Pods" { found = true break } } if !found { t.Error("Could not find pods topology") } }
// Do performs some HTTP action. If in is non-nil, the request data is // serialized and sent as the body of, for instance, a POST request. // If out is non-nil, the response data (if any) is deserialized into // this object, which must be of pointer type. func (r *resource) Do(method string, url *url.URL, in, out interface{}) (err error) { json := &codec.JsonHandle{} // Set up the body as serialized JSON, if there is one var body io.Reader if in != nil { reader, writer := io.Pipe() encoder := codec.NewEncoder(writer, json) finished := make(chan error) go func() { err := encoder.Encode(in) err = firstError(err, writer.Close()) finished <- err }() defer func() { err = firstError(err, <-finished) }() body = reader } // Create the request and set headers req, err := http.NewRequest(method, url.String(), body) if err != nil { return err } if in != nil { req.Header.Set("Content-Type", restdata.V1JSONMediaType) } if out != nil { req.Header.Set("Accept", restdata.V1JSONMediaType) } // Actually do the request resp, err := http.DefaultClient.Do(req) if err != nil { return err } // If the response included a body, clean up afterwards if resp.Body != nil { defer func() { err = firstError(err, resp.Body.Close()) }() } // Check the response code if err = checkHTTPStatus(resp); err != nil { return err } // If there is both a body and a requested output, // decode it if resp.Body != nil && out != nil { contentType := resp.Header.Get("Content-Type") err = restdata.Decode(contentType, resp.Body, out) } return err // may be nil }
// sendLocalState is invoked to send our local state over a tcp connection func (m *Memberlist) sendLocalState(conn net.Conn, join bool) error { // Setup a deadline conn.SetDeadline(time.Now().Add(m.config.TCPTimeout)) // Prepare the local node state m.nodeLock.RLock() localNodes := make([]pushNodeState, len(m.nodes)) for idx, n := range m.nodes { localNodes[idx].Name = n.Name localNodes[idx].Addr = n.Addr localNodes[idx].Port = n.Port localNodes[idx].Incarnation = n.Incarnation localNodes[idx].State = n.State localNodes[idx].Meta = n.Meta localNodes[idx].Vsn = []uint8{ n.PMin, n.PMax, n.PCur, n.DMin, n.DMax, n.DCur, } } m.nodeLock.RUnlock() // Get the delegate state var userData []byte if m.config.Delegate != nil { userData = m.config.Delegate.LocalState(join) } // Create a bytes buffer writer bufConn := bytes.NewBuffer(nil) // Send our node state header := pushPullHeader{Nodes: len(localNodes), UserStateLen: len(userData), Join: join} hd := codec.MsgpackHandle{} enc := codec.NewEncoder(bufConn, &hd) // Begin state push if _, err := bufConn.Write([]byte{byte(pushPullMsg)}); err != nil { return err } if err := enc.Encode(&header); err != nil { return err } for i := 0; i < header.Nodes; i++ { if err := enc.Encode(&localNodes[i]); err != nil { return err } } // Write the user state as well if userData != nil { if _, err := bufConn.Write(userData); err != nil { return err } } // Get the send buffer return m.rawSendMsgTCP(conn, bufConn.Bytes()) }
// Converts an object to Msgpack. func (c *MsgpackCodec) Marshal(object interface{}, options map[string]interface{}) ([]byte, error) { byteBuffer := new(bytes.Buffer) enc := codec.NewEncoder(byteBuffer, &msgpackHandle) encErr := enc.Encode(object) return byteBuffer.Bytes(), encErr }
// Encode does msgpack encoding of Snapshot func (s *Snapshot) Encode() []byte { var buf bytes.Buffer encoder := codec.NewEncoder(&buf, &codec.MsgpackHandle{}) encoder.Encode(s) return buf.Bytes() }
// Encode does msgpack encoding of RemoteRepo func (repo *RemoteRepo) Encode() []byte { var buf bytes.Buffer encoder := codec.NewEncoder(&buf, &codec.MsgpackHandle{}) encoder.Encode(repo) return buf.Bytes() }
// Encode does msgpack encoding of Package, []byte should be copied, as buffer would // be used for the next call to Encode func (p *Package) Encode() []byte { encodeBuf.Reset() encoder := codec.NewEncoder(&encodeBuf, &codec.MsgpackHandle{}) encoder.Encode(p) return encodeBuf.Bytes() }
// Init is required to specifiy which reader the msgpacks should be written to func Init(w io.Writer) Msgpack { handle := new(codec.MsgpackHandle) encoder := codec.NewEncoder(w, handle) m := Msgpack{} m.E = encoder m.Init = true return m }
// Encode does msgpack encoding of Package func (p *Package) Encode() []byte { var buf bytes.Buffer encoder := codec.NewEncoder(&buf, &codec.MsgpackHandle{}) encoder.Encode(p) return buf.Bytes() }