|
|
|
@ -1,7 +1,9 @@
|
|
|
|
|
package grpcall
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"context"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"sort"
|
|
|
|
@ -67,7 +69,7 @@ func (this Grpcall) invokeUnary(ctx context.Context, stub grpcdynamic.Stub, meth
|
|
|
|
|
// 创建请求 message
|
|
|
|
|
req := msgFactory.NewMessage(method.GetInputType())
|
|
|
|
|
// 将数据格式化到 message
|
|
|
|
|
if err := NewJsonRequestParser(anyResolver, data).Next(req); err != nil {
|
|
|
|
|
if err := NewJsonRequestParser(anyResolver, strings.NewReader(data)).Next(req); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -86,14 +88,21 @@ func (this Grpcall) invokeUnary(ctx context.Context, stub grpcdynamic.Stub, meth
|
|
|
|
|
AnyResolver: anyResolver,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
respData, err := marshaler.MarshalToString(respMsg)
|
|
|
|
|
pReader, pWriter := io.Pipe()
|
|
|
|
|
|
|
|
|
|
resp := &Response{
|
|
|
|
|
method: method,
|
|
|
|
|
header: respHeaders,
|
|
|
|
|
data: respData,
|
|
|
|
|
recv: pReader,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
defer pWriter.Close()
|
|
|
|
|
if err = marshaler.Marshal(pWriter, respMsg); err != nil {
|
|
|
|
|
pWriter.CloseWithError(err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
return resp, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -101,7 +110,7 @@ func (this Grpcall) invokeServStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
// 创建请求 message
|
|
|
|
|
req := msgFactory.NewMessage(method.GetInputType())
|
|
|
|
|
// 将数据格式化到 message
|
|
|
|
|
if err := NewJsonRequestParser(anyResolver, data).Next(req); err != nil {
|
|
|
|
|
if err := NewJsonRequestParser(anyResolver, strings.NewReader(data)).Next(req); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -114,11 +123,12 @@ func (this Grpcall) invokeServStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pReader, pWriter := io.Pipe()
|
|
|
|
|
|
|
|
|
|
resp := &Response{
|
|
|
|
|
method: method,
|
|
|
|
|
header: &metadata.MD{},
|
|
|
|
|
recv: make(chan string),
|
|
|
|
|
done: make(chan error),
|
|
|
|
|
recv: pReader,
|
|
|
|
|
cancel: cancel,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -129,9 +139,8 @@ func (this Grpcall) invokeServStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
|
close(resp.done)
|
|
|
|
|
close(resp.recv)
|
|
|
|
|
cancel()
|
|
|
|
|
pWriter.Close()
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
@ -139,25 +148,22 @@ func (this Grpcall) invokeServStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
msg, err := stream.RecvMsg()
|
|
|
|
|
|
|
|
|
|
if err == io.EOF {
|
|
|
|
|
resp.done <- nil
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
pWriter.CloseWithError(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if *resp.header, err = stream.Header(); err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
pWriter.CloseWithError(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if data, err := msgParser.MarshalToString(msg); err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
if err = msgParser.Marshal(pWriter, msg); err != nil {
|
|
|
|
|
pWriter.CloseWithError(err)
|
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
resp.recv <- data
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
msg.Reset()
|
|
|
|
@ -171,7 +177,7 @@ func (this Grpcall) invokeBidiStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
// 创建请求 message
|
|
|
|
|
req := msgFactory.NewMessage(method.GetInputType())
|
|
|
|
|
// 将数据格式化到 message
|
|
|
|
|
if err := NewJsonRequestParser(anyResolver, data).Next(req); err != nil {
|
|
|
|
|
if err := NewJsonRequestParser(anyResolver, strings.NewReader(data)).Next(req); err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -189,49 +195,54 @@ func (this Grpcall) invokeBidiStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pRecvReader, pRecvWriter := io.Pipe()
|
|
|
|
|
|
|
|
|
|
resp := &Response{
|
|
|
|
|
method: method,
|
|
|
|
|
header: &metadata.MD{},
|
|
|
|
|
recv: make(chan string),
|
|
|
|
|
send: make(chan string),
|
|
|
|
|
done: make(chan error),
|
|
|
|
|
cancel: cancel,
|
|
|
|
|
method: method,
|
|
|
|
|
header: &metadata.MD{},
|
|
|
|
|
recv: pRecvReader,
|
|
|
|
|
send: make(chan []byte),
|
|
|
|
|
sendCompleted: make(chan error),
|
|
|
|
|
cancel: cancel,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// send
|
|
|
|
|
go func() {
|
|
|
|
|
defer func() {
|
|
|
|
|
stream.CloseSend()
|
|
|
|
|
close(resp.send)
|
|
|
|
|
cancel()
|
|
|
|
|
close(resp.sendCompleted)
|
|
|
|
|
close(resp.send)
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
reqParser := jsonpb.Unmarshaler{AnyResolver: anyResolver}
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case <-cancel_ctx.Done():
|
|
|
|
|
resp.sendCompleted <- nil
|
|
|
|
|
return
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
resp.sendCompleted <- nil
|
|
|
|
|
return
|
|
|
|
|
case msg, ok := <-resp.send:
|
|
|
|
|
if !ok {
|
|
|
|
|
resp.done <- nil
|
|
|
|
|
resp.sendCompleted <- fmt.Errorf("read send message error")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 将数据格式化到 message
|
|
|
|
|
if err := NewJsonRequestParser(anyResolver, msg).Next(req); err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
if err := reqParser.UnmarshalNext(json.NewDecoder(bytes.NewReader(msg)), req); err != nil {
|
|
|
|
|
resp.sendCompleted <- err
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := stream.SendMsg(req); err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
resp.sendCompleted <- err
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case <-cancel_ctx.Done():
|
|
|
|
|
resp.done <- nil
|
|
|
|
|
return
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
resp.done <- nil
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resp.sendCompleted <- nil
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
@ -243,9 +254,8 @@ func (this Grpcall) invokeBidiStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
|
close(resp.done)
|
|
|
|
|
close(resp.recv)
|
|
|
|
|
cancel()
|
|
|
|
|
pRecvWriter.Close()
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
@ -253,25 +263,22 @@ func (this Grpcall) invokeBidiStream(ctx context.Context, stub grpcdynamic.Stub,
|
|
|
|
|
msg, err := stream.RecvMsg()
|
|
|
|
|
|
|
|
|
|
if err == io.EOF {
|
|
|
|
|
resp.done <- nil
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
pRecvWriter.CloseWithError(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if *resp.header, err = stream.Header(); err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
pRecvWriter.CloseWithError(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if data, err := msgParser.MarshalToString(msg); err != nil {
|
|
|
|
|
resp.done <- err
|
|
|
|
|
if err = msgParser.Marshal(pRecvWriter, msg); err != nil {
|
|
|
|
|
pRecvWriter.CloseWithError(err)
|
|
|
|
|
return
|
|
|
|
|
} else {
|
|
|
|
|
resp.recv <- data
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
msg.Reset()
|
|
|
|
|