diff --git a/examples/examplepb/a_bit_of_everything.pb.go b/examples/examplepb/a_bit_of_everything.pb.go index 6c48370b972..470928b33ca 100644 --- a/examples/examplepb/a_bit_of_everything.pb.go +++ b/examples/examplepb/a_bit_of_everything.pb.go @@ -765,6 +765,8 @@ var _ABitOfEverythingService_serviceDesc = grpc.ServiceDesc{ }, } +func init() { proto.RegisterFile("examples/examplepb/a_bit_of_everything.proto", fileDescriptor1) } + var fileDescriptor1 = []byte{ // 1216 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xc4, 0x57, 0xdd, 0x6e, 0x1b, 0x45, diff --git a/examples/examplepb/a_bit_of_everything.pb.gw.go b/examples/examplepb/a_bit_of_everything.pb.gw.go index 1621993de27..c50f6bfcef7 100644 --- a/examples/examplepb/a_bit_of_everything.pb.gw.go +++ b/examples/examplepb/a_bit_of_everything.pb.gw.go @@ -439,35 +439,42 @@ func request_ABitOfEverythingService_BulkEcho_0(ctx context.Context, marshaler r return nil, metadata, err } dec := marshaler.NewDecoder(req.Body) - for { + handleSend := func() error { var protoReq sub.StringMessage err = dec.Decode(&protoReq) - if err == io.EOF { - break - } if err != nil { grpclog.Printf("Failed to decode request: %v", err) - return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + return err } if err = stream.Send(&protoReq); err != nil { grpclog.Printf("Failed to send request: %v", err) - return nil, metadata, err + return err } + return nil } - - if err := stream.CloseSend(); err != nil { - grpclog.Printf("Failed to terminate client stream: %v", err) + if err := handleSend(); err != nil { + if err := stream.CloseSend(); err != nil { + grpclog.Printf("Failed to terminate client stream: %v", err) + } return nil, metadata, err } + go func() { + for { + if err := handleSend(); err != nil { + break + } + } + if err := stream.CloseSend(); err != nil { + grpclog.Printf("Failed to terminate client stream: %v", err) + } + }() header, err := stream.Header() if err != nil { grpclog.Printf("Failed to get header from client: %v", err) return nil, metadata, err } metadata.HeaderMD = header - return stream, metadata, nil - } func request_ABitOfEverythingService_DeepPathEcho_0(ctx context.Context, marshaler runtime.Marshaler, client ABitOfEverythingServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { diff --git a/examples/examplepb/echo_service.pb.go b/examples/examplepb/echo_service.pb.go index 1eadb59e9d9..68e395dc7fa 100644 --- a/examples/examplepb/echo_service.pb.go +++ b/examples/examplepb/echo_service.pb.go @@ -177,6 +177,8 @@ var _EchoService_serviceDesc = grpc.ServiceDesc{ Streams: []grpc.StreamDesc{}, } +func init() { proto.RegisterFile("examples/examplepb/echo_service.proto", fileDescriptor0) } + var fileDescriptor0 = []byte{ // 233 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x52, 0x4d, 0xad, 0x48, 0xcc, diff --git a/examples/examplepb/flow_combination.pb.go b/examples/examplepb/flow_combination.pb.go index 345f7ed5a8a..a924a96dc04 100644 --- a/examples/examplepb/flow_combination.pb.go +++ b/examples/examplepb/flow_combination.pb.go @@ -632,6 +632,8 @@ var _FlowCombination_serviceDesc = grpc.ServiceDesc{ }, } +func init() { proto.RegisterFile("examples/examplepb/flow_combination.proto", fileDescriptor2) } + var fileDescriptor2 = []byte{ // 658 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xbc, 0x96, 0xbf, 0x6f, 0xd3, 0x40, diff --git a/examples/examplepb/flow_combination.pb.gw.go b/examples/examplepb/flow_combination.pb.gw.go index ca2e4a9caa9..9901591b3a4 100644 --- a/examples/examplepb/flow_combination.pb.gw.go +++ b/examples/examplepb/flow_combination.pb.gw.go @@ -102,35 +102,42 @@ func request_FlowCombination_StreamEmptyStream_0(ctx context.Context, marshaler return nil, metadata, err } dec := marshaler.NewDecoder(req.Body) - for { + handleSend := func() error { var protoReq EmptyProto err = dec.Decode(&protoReq) - if err == io.EOF { - break - } if err != nil { grpclog.Printf("Failed to decode request: %v", err) - return nil, metadata, grpc.Errorf(codes.InvalidArgument, "%v", err) + return err } if err = stream.Send(&protoReq); err != nil { grpclog.Printf("Failed to send request: %v", err) - return nil, metadata, err + return err } + return nil } - - if err := stream.CloseSend(); err != nil { - grpclog.Printf("Failed to terminate client stream: %v", err) + if err := handleSend(); err != nil { + if err := stream.CloseSend(); err != nil { + grpclog.Printf("Failed to terminate client stream: %v", err) + } return nil, metadata, err } + go func() { + for { + if err := handleSend(); err != nil { + break + } + } + if err := stream.CloseSend(); err != nil { + grpclog.Printf("Failed to terminate client stream: %v", err) + } + }() header, err := stream.Header() if err != nil { grpclog.Printf("Failed to get header from client: %v", err) return nil, metadata, err } metadata.HeaderMD = header - return stream, metadata, nil - } func request_FlowCombination_RpcBodyRpc_0(ctx context.Context, marshaler runtime.Marshaler, client FlowCombinationClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { diff --git a/examples/sub/message.pb.go b/examples/sub/message.pb.go index dc117712bb7..8ac5568bbf0 100644 --- a/examples/sub/message.pb.go +++ b/examples/sub/message.pb.go @@ -49,6 +49,8 @@ func init() { proto.RegisterType((*StringMessage)(nil), "gengo.grpc.gateway.examples.sub.StringMessage") } +func init() { proto.RegisterFile("examples/sub/message.proto", fileDescriptor0) } + var fileDescriptor0 = []byte{ // 115 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0xad, 0x48, 0xcc, diff --git a/examples/sub2/message.pb.go b/examples/sub2/message.pb.go index 20e67f637db..8f6f432b49a 100644 --- a/examples/sub2/message.pb.go +++ b/examples/sub2/message.pb.go @@ -41,6 +41,8 @@ func init() { proto.RegisterType((*IdMessage)(nil), "sub2.IdMessage") } +func init() { proto.RegisterFile("examples/sub2/message.proto", fileDescriptor0) } + var fileDescriptor0 = []byte{ // 124 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0xad, 0x48, 0xcc, diff --git a/protoc-gen-grpc-gateway/gengateway/template.go b/protoc-gen-grpc-gateway/gengateway/template.go index f9782172b66..ff34f396584 100644 --- a/protoc-gen-grpc-gateway/gengateway/template.go +++ b/protoc-gen-grpc-gateway/gengateway/template.go @@ -117,7 +117,9 @@ var _ = utilities.NewDoubleArray `)) handlerTemplate = template.Must(template.New("handler").Parse(` -{{if .Method.GetClientStreaming}} +{{if and .Method.GetClientStreaming .Method.GetServerStreaming}} +{{template "bidi-streaming-request-func" .}} +{{else if .Method.GetClientStreaming}} {{template "client-streaming-request-func" .}} {{else}} {{template "client-rpc-request-func" .}} @@ -234,6 +236,54 @@ var ( {{end}} }`)) + _ = template.Must(handlerTemplate.New("bidi-streaming-request-func").Parse(` +{{template "request-func-signature" .}} { + var metadata runtime.ServerMetadata + stream, err := client.{{.Method.GetName}}(ctx) + if err != nil { + grpclog.Printf("Failed to start streaming: %v", err) + return nil, metadata, err + } + dec := marshaler.NewDecoder(req.Body) + handleSend := func() error { + var protoReq {{.Method.RequestType.GoType .Method.Service.File.GoPkg.Path}} + err = dec.Decode(&protoReq) + if err != nil { + grpclog.Printf("Failed to decode request: %v", err) + return err + } + if err = stream.Send(&protoReq); err != nil { + grpclog.Printf("Failed to send request: %v", err) + return err + } + return nil + } + if err := handleSend(); err != nil { + if err := stream.CloseSend(); err != nil { + grpclog.Printf("Failed to terminate client stream: %v", err) + } + return nil, metadata, err + } + go func() { + for { + if err := handleSend(); err != nil { + break + } + } + if err := stream.CloseSend(); err != nil { + grpclog.Printf("Failed to terminate client stream: %v", err) + } + }() + header, err := stream.Header() + if err != nil { + grpclog.Printf("Failed to get header from client: %v", err) + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil +} +`)) + trailerTemplate = template.Must(template.New("trailer").Parse(` {{range $svc := .}} // Register{{$svc.GetName}}HandlerFromEndpoint is same as Register{{$svc.GetName}}Handler but diff --git a/runtime/stream_chunk.pb.go b/runtime/stream_chunk.pb.go index f45504e2291..2905054a3a0 100644 --- a/runtime/stream_chunk.pb.go +++ b/runtime/stream_chunk.pb.go @@ -44,6 +44,8 @@ func init() { proto.RegisterType((*StreamError)(nil), "gengo.grpc.gateway.runtime.StreamError") } +func init() { proto.RegisterFile("runtime/stream_chunk.proto", fileDescriptor0) } + var fileDescriptor0 = []byte{ // 175 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x34, 0x8e, 0xbd, 0x0e, 0x82, 0x30, diff --git a/third_party/googleapis/google/api/annotations.pb.go b/third_party/googleapis/google/api/annotations.pb.go index 21fca4856a2..f051b70b873 100644 --- a/third_party/googleapis/google/api/annotations.pb.go +++ b/third_party/googleapis/google/api/annotations.pb.go @@ -43,6 +43,8 @@ func init() { proto.RegisterExtension(E_Http) } +func init() { proto.RegisterFile("google/api/annotations.proto", fileDescriptor0) } + var fileDescriptor0 = []byte{ // 167 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x92, 0x49, 0xcf, 0xcf, 0x4f, diff --git a/third_party/googleapis/google/api/http.pb.go b/third_party/googleapis/google/api/http.pb.go index 022102dd569..d340935a293 100644 --- a/third_party/googleapis/google/api/http.pb.go +++ b/third_party/googleapis/google/api/http.pb.go @@ -335,6 +335,8 @@ func init() { proto.RegisterType((*CustomHttpPattern)(nil), "google.api.CustomHttpPattern") } +func init() { proto.RegisterFile("google/api/http.proto", fileDescriptor1) } + var fileDescriptor1 = []byte{ // 277 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x64, 0x51, 0xbd, 0x6a, 0xf3, 0x40,