Skip to content

Commit 90a540e

Browse files
authored
Merge pull request #170 from tmc/concurrent_forward
Add bidirectional streaming support by running Send() and Recv() concurrently
2 parents 9b71cfe + 6e38833 commit 90a540e

File tree

11 files changed

+103
-23
lines changed

11 files changed

+103
-23
lines changed

examples/examplepb/a_bit_of_everything.pb.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/examplepb/a_bit_of_everything.pb.gw.go

Lines changed: 18 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/examplepb/echo_service.pb.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/examplepb/flow_combination.pb.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/examplepb/flow_combination.pb.gw.go

Lines changed: 18 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/sub/message.pb.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/sub2/message.pb.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

protoc-gen-grpc-gateway/gengateway/template.go

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ var _ = utilities.NewDoubleArray
117117
`))
118118

119119
handlerTemplate = template.Must(template.New("handler").Parse(`
120-
{{if .Method.GetClientStreaming}}
120+
{{if and .Method.GetClientStreaming .Method.GetServerStreaming}}
121+
{{template "bidi-streaming-request-func" .}}
122+
{{else if .Method.GetClientStreaming}}
121123
{{template "client-streaming-request-func" .}}
122124
{{else}}
123125
{{template "client-rpc-request-func" .}}
@@ -234,6 +236,54 @@ var (
234236
{{end}}
235237
}`))
236238

239+
_ = template.Must(handlerTemplate.New("bidi-streaming-request-func").Parse(`
240+
{{template "request-func-signature" .}} {
241+
var metadata runtime.ServerMetadata
242+
stream, err := client.{{.Method.GetName}}(ctx)
243+
if err != nil {
244+
grpclog.Printf("Failed to start streaming: %v", err)
245+
return nil, metadata, err
246+
}
247+
dec := marshaler.NewDecoder(req.Body)
248+
handleSend := func() error {
249+
var protoReq {{.Method.RequestType.GoType .Method.Service.File.GoPkg.Path}}
250+
err = dec.Decode(&protoReq)
251+
if err != nil {
252+
grpclog.Printf("Failed to decode request: %v", err)
253+
return err
254+
}
255+
if err = stream.Send(&protoReq); err != nil {
256+
grpclog.Printf("Failed to send request: %v", err)
257+
return err
258+
}
259+
return nil
260+
}
261+
if err := handleSend(); err != nil {
262+
if err := stream.CloseSend(); err != nil {
263+
grpclog.Printf("Failed to terminate client stream: %v", err)
264+
}
265+
return nil, metadata, err
266+
}
267+
go func() {
268+
for {
269+
if err := handleSend(); err != nil {
270+
break
271+
}
272+
}
273+
if err := stream.CloseSend(); err != nil {
274+
grpclog.Printf("Failed to terminate client stream: %v", err)
275+
}
276+
}()
277+
header, err := stream.Header()
278+
if err != nil {
279+
grpclog.Printf("Failed to get header from client: %v", err)
280+
return nil, metadata, err
281+
}
282+
metadata.HeaderMD = header
283+
return stream, metadata, nil
284+
}
285+
`))
286+
237287
trailerTemplate = template.Must(template.New("trailer").Parse(`
238288
{{range $svc := .}}
239289
// Register{{$svc.GetName}}HandlerFromEndpoint is same as Register{{$svc.GetName}}Handler but

runtime/stream_chunk.pb.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

third_party/googleapis/google/api/annotations.pb.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)