diff --git a/client/rpc_codec.go b/client/rpc_codec.go index 95ff1da1..f5c9401f 100644 --- a/client/rpc_codec.go +++ b/client/rpc_codec.go @@ -5,6 +5,8 @@ import ( errs "errors" "github.com/micro/go-micro/codec" + "github.com/micro/go-micro/codec/json" + "github.com/micro/go-micro/codec/proto" "github.com/micro/go-micro/codec/jsonrpc" "github.com/micro/go-micro/codec/protorpc" "github.com/micro/go-micro/errors" @@ -65,9 +67,9 @@ var ( defaultContentType = "application/octet-stream" defaultCodecs = map[string]codec.NewCodec{ - "application/json": jsonrpc.NewCodec, + "application/protobuf": proto.NewCodec, + "application/json": json.NewCodec, "application/json-rpc": jsonrpc.NewCodec, - "application/protobuf": protorpc.NewCodec, "application/proto-rpc": protorpc.NewCodec, "application/octet-stream": protorpc.NewCodec, } @@ -110,7 +112,7 @@ func (c *rpcCodec) WriteRequest(req *request, body interface{}) error { Method: req.ServiceMethod, Type: codec.Request, Header: map[string]string{ - "X-Micro-Target": req.Service, + "X-Micro-Service": req.Service, "X-Micro-Method": req.ServiceMethod, }, } diff --git a/codec/json/json.go b/codec/json/json.go new file mode 100644 index 00000000..6389541c --- /dev/null +++ b/codec/json/json.go @@ -0,0 +1,43 @@ +// Package json provides a json codec +package json + +import ( + "encoding/json" + "io" + + "github.com/micro/go-micro/codec" +) + +type Codec struct { + Conn io.ReadWriteCloser + Encoder *json.Encoder + Decoder *json.Decoder +} + +func (c *Codec) ReadHeader(m *codec.Message, t codec.MessageType) error { + return nil +} + +func (c *Codec) ReadBody(b interface{}) error { + return c.Decoder.Decode(b) +} + +func (c *Codec) Write(m *codec.Message, b interface{}) error { + return c.Encoder.Encode(b) +} + +func (c *Codec) Close() error { + return c.Conn.Close() +} + +func (c *Codec) String() string { + return "json" +} + +func NewCodec(c io.ReadWriteCloser) codec.Codec { + return &Codec{ + Conn: c, + Decoder: json.NewDecoder(c), + Encoder: json.NewEncoder(c), + } +} diff --git a/codec/proto/proto.go b/codec/proto/proto.go new file mode 100644 index 00000000..339c08c1 --- /dev/null +++ b/codec/proto/proto.go @@ -0,0 +1,49 @@ +// Package proto provides a proto codec +package proto + +import ( + "io" + "io/ioutil" + + "github.com/golang/protobuf/proto" + "github.com/micro/go-micro/codec" +) + +type Codec struct { + Conn io.ReadWriteCloser +} + +func (c *Codec) ReadHeader(m *codec.Message, t codec.MessageType) error { + return nil +} + +func (c *Codec) ReadBody(b interface{}) error { + buf, err := ioutil.ReadAll(c.Conn) + if err != nil { + return err + } + return proto.Unmarshal(buf, b.(proto.Message)) +} + +func (c *Codec) Write(m *codec.Message, b interface{}) error { + buf, err := proto.Marshal(b.(proto.Message)) + if err != nil { + return err + } + _, err = c.Conn.Write(buf) + return err +} + +func (c *Codec) Close() error { + return c.Conn.Close() +} + +func (c *Codec) String() string { + return "proto" +} + +func NewCodec(c io.ReadWriteCloser) codec.Codec { + return &Codec{ + Conn: c, + } +} diff --git a/server/rpc_codec.go b/server/rpc_codec.go index 87a32795..fee01940 100644 --- a/server/rpc_codec.go +++ b/server/rpc_codec.go @@ -4,6 +4,8 @@ import ( "bytes" "github.com/micro/go-micro/codec" + "github.com/micro/go-micro/codec/json" + "github.com/micro/go-micro/codec/proto" "github.com/micro/go-micro/codec/jsonrpc" "github.com/micro/go-micro/codec/protorpc" "github.com/micro/go-micro/transport" @@ -25,9 +27,9 @@ type readWriteCloser struct { var ( defaultCodecs = map[string]codec.NewCodec{ - "application/json": jsonrpc.NewCodec, + "application/json": json.NewCodec, "application/json-rpc": jsonrpc.NewCodec, - "application/protobuf": protorpc.NewCodec, + "application/protobuf": proto.NewCodec, "application/proto-rpc": protorpc.NewCodec, "application/octet-stream": protorpc.NewCodec, } @@ -77,6 +79,10 @@ func (c *rpcCodec) ReadRequestHeader(r *request, first bool) error { m.Header = tm.Header } + // set some internal things + m.Target = m.Header["X-Micro-Service"] + m.Method = m.Header["X-Micro-Method"] + err := c.codec.ReadHeader(&m, codec.Request) r.ServiceMethod = m.Method r.Seq = m.Id