add cruft
This commit is contained in:
		| @@ -2,13 +2,16 @@ package grpc | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/golang/protobuf/proto" | 	"github.com/golang/protobuf/proto" | ||||||
| 	"github.com/json-iterator/go" | 	"github.com/json-iterator/go" | ||||||
| 	"github.com/micro/go-micro/codec" | 	"github.com/micro/go-micro/codec" | ||||||
|  | 	"github.com/micro/go-micro/codec/bytes" | ||||||
| 	"github.com/micro/go-micro/codec/jsonrpc" | 	"github.com/micro/go-micro/codec/jsonrpc" | ||||||
| 	"github.com/micro/go-micro/codec/protorpc" | 	"github.com/micro/go-micro/codec/protorpc" | ||||||
| 	"google.golang.org/grpc/encoding" | 	"google.golang.org/grpc/encoding" | ||||||
|  | 	"google.golang.org/grpc" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type jsonCodec struct{} | type jsonCodec struct{} | ||||||
| @@ -52,7 +55,28 @@ func (w wrapCodec) String() string { | |||||||
| 	return w.Codec.Name() | 	return w.Codec.Name() | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (w wrapCodec) Marshal(v interface{}) ([]byte, error) { | ||||||
|  | 	b, ok := v.(*bytes.Frame) | ||||||
|  | 	if ok { | ||||||
|  | 		return b.Data, nil | ||||||
|  | 	} | ||||||
|  | 	return w.Codec.Marshal(v) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (w wrapCodec) Unmarshal(data []byte, v interface{}) error { | ||||||
|  | 	b, ok := v.(*bytes.Frame) | ||||||
|  | 	if ok { | ||||||
|  | 		b.Data = data | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return w.Codec.Unmarshal(data, v) | ||||||
|  | } | ||||||
|  |  | ||||||
| func (protoCodec) Marshal(v interface{}) ([]byte, error) { | func (protoCodec) Marshal(v interface{}) ([]byte, error) { | ||||||
|  | 	b, ok := v.(*bytes.Frame) | ||||||
|  | 	if ok { | ||||||
|  | 		return b.Data, nil | ||||||
|  | 	} | ||||||
| 	return proto.Marshal(v.(proto.Message)) | 	return proto.Marshal(v.(proto.Message)) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -96,3 +120,68 @@ func (jsonCodec) Unmarshal(data []byte, v interface{}) error { | |||||||
| func (jsonCodec) Name() string { | func (jsonCodec) Name() string { | ||||||
| 	return "json" | 	return "json" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type grpcCodec struct { | ||||||
|  | 	// headers | ||||||
|  | 	id string | ||||||
|  | 	target string | ||||||
|  | 	method string | ||||||
|  | 	endpoint string | ||||||
|  |  | ||||||
|  | 	s grpc.ClientStream | ||||||
|  | 	c encoding.Codec | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (g *grpcCodec) ReadHeader(m *codec.Message, mt codec.MessageType) error { | ||||||
|  | 	md, err := g.s.Header() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if m == nil { | ||||||
|  | 		m = new(codec.Message) | ||||||
|  | 	} | ||||||
|  | 	if m.Header == nil { | ||||||
|  | 		m.Header = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 	for k, v := range md { | ||||||
|  | 		m.Header[k] = strings.Join(v, ",") | ||||||
|  | 	} | ||||||
|  | 	m.Id = g.id | ||||||
|  | 	m.Target = g.target | ||||||
|  | 	m.Method = g.method | ||||||
|  | 	m.Endpoint = g.endpoint | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (g *grpcCodec) ReadBody(v interface{}) error { | ||||||
|  | 	frame := &bytes.Frame{} | ||||||
|  | 	if err := g.s.RecvMsg(frame); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return g.c.Unmarshal(frame.Data, v) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (g *grpcCodec) Write(m *codec.Message, v interface{}) error { | ||||||
|  | 	// if we don't have a body | ||||||
|  | 	if len(m.Body) == 0 { | ||||||
|  | 		b, err := g.c.Marshal(v) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		m.Body = b | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// create an encoded frame | ||||||
|  | 	frame := &bytes.Frame{m.Body} | ||||||
|  | 	// write the body using the framing codec | ||||||
|  | 	return g.s.SendMsg(frame) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (g *grpcCodec) Close() error { | ||||||
|  | 	return g.s.CloseSend() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (g *grpcCodec) String() string { | ||||||
|  | 	return g.c.Name() | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -177,7 +177,10 @@ func (g *grpcClient) stream(ctx context.Context, node *registry.Node, req client | |||||||
| 		dialCtx, cancel = context.WithCancel(ctx) | 		dialCtx, cancel = context.WithCancel(ctx) | ||||||
| 	} | 	} | ||||||
| 	defer cancel() | 	defer cancel() | ||||||
| 	cc, err := grpc.DialContext(dialCtx, address, grpc.WithDefaultCallOptions(grpc.ForceCodec(cf)), g.secure()) |  | ||||||
|  | 	wc := wrapCodec{cf} | ||||||
|  |  | ||||||
|  | 	cc, err := grpc.DialContext(dialCtx, address, grpc.WithDefaultCallOptions(grpc.ForceCodec(wc)), g.secure()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, errors.InternalServerError("go.micro.client", fmt.Sprintf("Error sending request: %v", err)) | 		return nil, errors.InternalServerError("go.micro.client", fmt.Sprintf("Error sending request: %v", err)) | ||||||
| 	} | 	} | ||||||
| @@ -193,6 +196,14 @@ func (g *grpcClient) stream(ctx context.Context, node *registry.Node, req client | |||||||
| 		return nil, errors.InternalServerError("go.micro.client", fmt.Sprintf("Error creating stream: %v", err)) | 		return nil, errors.InternalServerError("go.micro.client", fmt.Sprintf("Error creating stream: %v", err)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// set request codec | ||||||
|  | 	if r, ok := req.(*grpcRequest); ok { | ||||||
|  | 		r.codec = &grpcCodec{ | ||||||
|  | 			s: st, | ||||||
|  | 			c: wc, | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	rsp := &response{ | 	rsp := &response{ | ||||||
| 		conn:   cc, | 		conn:   cc, | ||||||
| 		stream: st, | 		stream: st, | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import ( | |||||||
|  |  | ||||||
| 	"github.com/golang/protobuf/proto" | 	"github.com/golang/protobuf/proto" | ||||||
| 	"github.com/micro/go-micro/codec" | 	"github.com/micro/go-micro/codec" | ||||||
|  | 	"github.com/micro/go-micro/codec/bytes" | ||||||
| 	"github.com/micro/go-micro/codec/jsonrpc" | 	"github.com/micro/go-micro/codec/jsonrpc" | ||||||
| 	"github.com/micro/go-micro/codec/protorpc" | 	"github.com/micro/go-micro/codec/protorpc" | ||||||
| 	"google.golang.org/grpc/encoding" | 	"google.golang.org/grpc/encoding" | ||||||
| @@ -14,6 +15,7 @@ import ( | |||||||
| type jsonCodec struct{} | type jsonCodec struct{} | ||||||
| type bytesCodec struct{} | type bytesCodec struct{} | ||||||
| type protoCodec struct{} | type protoCodec struct{} | ||||||
|  | type wrapCodec struct { encoding.Codec } | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	defaultGRPCCodecs = map[string]encoding.Codec{ | 	defaultGRPCCodecs = map[string]encoding.Codec{ | ||||||
| @@ -36,6 +38,27 @@ var ( | |||||||
| 	} | 	} | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | func (w wrapCodec) String() string { | ||||||
|  |         return w.Codec.Name() | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (w wrapCodec) Marshal(v interface{}) ([]byte, error) { | ||||||
|  |         b, ok := v.(*bytes.Frame) | ||||||
|  |         if ok { | ||||||
|  |                 return b.Data, nil | ||||||
|  |         } | ||||||
|  |         return w.Codec.Marshal(v) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (w wrapCodec) Unmarshal(data []byte, v interface{}) error { | ||||||
|  |         b, ok := v.(*bytes.Frame) | ||||||
|  |         if ok { | ||||||
|  |                 b.Data = data | ||||||
|  |                 return nil | ||||||
|  |         } | ||||||
|  |         return w.Codec.Unmarshal(data, v) | ||||||
|  | } | ||||||
|  |  | ||||||
| func (protoCodec) Marshal(v interface{}) ([]byte, error) { | func (protoCodec) Marshal(v interface{}) ([]byte, error) { | ||||||
| 	return proto.Marshal(v.(proto.Message)) | 	return proto.Marshal(v.(proto.Message)) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -56,8 +56,8 @@ type grpcServer struct { | |||||||
| } | } | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| 	encoding.RegisterCodec(jsonCodec{}) | 	encoding.RegisterCodec(wrapCodec{jsonCodec{}}) | ||||||
| 	encoding.RegisterCodec(bytesCodec{}) | 	encoding.RegisterCodec(wrapCodec{bytesCodec{}}) | ||||||
| } | } | ||||||
|  |  | ||||||
| func newGRPCServer(opts ...server.Option) server.Server { | func newGRPCServer(opts ...server.Option) server.Server { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user