go.mod: github.com/grpc-ecosystem/go-grpc-middleware v1.4.0
https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v1.3.0...v1.4.0 Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
This commit is contained in:
		
							
								
								
									
										16
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/.travis.yml
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,16 +0,0 @@
 | 
			
		||||
sudo: false
 | 
			
		||||
language: go
 | 
			
		||||
go:
 | 
			
		||||
  - 1.13.x
 | 
			
		||||
  - 1.14.x
 | 
			
		||||
  - 1.15.x
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  global:
 | 
			
		||||
    - GO111MODULE=on
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
 - make test
 | 
			
		||||
 | 
			
		||||
after_success:
 | 
			
		||||
  - bash <(curl -s https://codecov.io/bash)
 | 
			
		||||
							
								
								
									
										51
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,51 +0,0 @@
 | 
			
		||||
# Changelog
 | 
			
		||||
All notable changes to this project will be documented in this file.
 | 
			
		||||
 | 
			
		||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 | 
			
		||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 | 
			
		||||
 | 
			
		||||
Types of changes:
 | 
			
		||||
- `Added` for new features.
 | 
			
		||||
- `Changed` for changes in existing functionality.
 | 
			
		||||
- `Deprecated` for soon-to-be removed features.
 | 
			
		||||
- `Removed` for now removed features.
 | 
			
		||||
- `Fixed` for any bug fixes.
 | 
			
		||||
- `Security` in case of vulnerabilities.
 | 
			
		||||
 | 
			
		||||
## [Unreleased]
 | 
			
		||||
 | 
			
		||||
### Added
 | 
			
		||||
 | 
			
		||||
- [#223](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/223) Add go-kit logging middleware - [adrien-f](https://github.com/adrien-f)
 | 
			
		||||
 | 
			
		||||
## [v1.1.0] - 2019-09-12
 | 
			
		||||
### Added
 | 
			
		||||
- [#226](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/226) Support for go modules.
 | 
			
		||||
- [#221](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/221) logging/zap add support for gRPC LoggerV2  - [kush-patel-hs](https://github.com/kush-patel-hs)
 | 
			
		||||
- [#181](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/181) Rate Limit support - [ceshihao](https://github.com/ceshihao)
 | 
			
		||||
- [#161](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/161) Retry on server stream call - [lonnblad](https://github.com/lonnblad)
 | 
			
		||||
- [#152](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/152) Exponential backoff functions - [polyfloyd](https://github.com/polyfloyd)
 | 
			
		||||
- [#147](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/147) Jaeger support for ctxtags extraction - [vporoshok](https://github.com/vporoshok)
 | 
			
		||||
- [#184](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/184) ctxTags identifies if the call was sampled
 | 
			
		||||
 | 
			
		||||
### Deprecated
 | 
			
		||||
- [#201](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/201) `golang.org/x/net/context` - [houz42](https://github.com/houz42)
 | 
			
		||||
- [#183](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/183) Documentation Generation in favour of <godoc.org>.
 | 
			
		||||
 | 
			
		||||
### Fixed
 | 
			
		||||
- [172](https://github.com/grpc-ecosystem/go-grpc-middleware/pull/172) Passing ctx into retry and recover - [johanbrandhorst](https://github.com/johanbrandhorst)
 | 
			
		||||
- Numerious documentation fixes.
 | 
			
		||||
 | 
			
		||||
## v1.0.0 - 2018-05-08
 | 
			
		||||
### Added
 | 
			
		||||
- grpc_auth 
 | 
			
		||||
- grpc_ctxtags
 | 
			
		||||
- grpc_zap
 | 
			
		||||
- grpc_logrus
 | 
			
		||||
- grpc_opentracing
 | 
			
		||||
- grpc_retry
 | 
			
		||||
- grpc_validator
 | 
			
		||||
- grpc_recovery
 | 
			
		||||
 | 
			
		||||
[Unreleased]: https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v1.1.0...HEAD 
 | 
			
		||||
[v1.1.0]: https://github.com/grpc-ecosystem/go-grpc-middleware/compare/v1.0.0...v1.1.0 
 | 
			
		||||
							
								
								
									
										55
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										55
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/README.md
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -7,16 +7,23 @@
 | 
			
		||||
[](https://codecov.io/gh/grpc-ecosystem/go-grpc-middleware)
 | 
			
		||||
[](LICENSE)
 | 
			
		||||
[](#status)
 | 
			
		||||
[](https://slack.com/share/IRUQCFC23/9Tm7hxRFVKKNoajQfMOcUiIk/enQtODc4ODI4NTIyMDcxLWM5NDA0ZTE4Njg5YjRjYWZkMTI5MzQwNDY3YzBjMzE1YzdjOGM5ZjI1NDNiM2JmNzI2YjM5ODE5OTRiNTEyOWE)
 | 
			
		||||
[](https://gophers.slack.com/archives/CNJL30P4P)
 | 
			
		||||
 | 
			
		||||
[gRPC Go](https://github.com/grpc/grpc-go) Middleware: interceptors, helpers, utilities.
 | 
			
		||||
 | 
			
		||||
## ⚠️  Status
 | 
			
		||||
 | 
			
		||||
Version [v2](https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2) is about to be released, with migration guide, which will replace v1. Try v2 and give us feedback! 
 | 
			
		||||
 | 
			
		||||
Version v1 is currently in deprecation mode, which means only critical and safety bug fixes will be merged.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Middleware
 | 
			
		||||
 | 
			
		||||
[gRPC Go](https://github.com/grpc/grpc-go) recently acquired support for
 | 
			
		||||
Interceptors, i.e. [middleware](https://medium.com/@matryer/writing-middleware-in-golang-and-how-go-makes-it-so-much-fun-4375c1246e81#.gv7tdlghs) 
 | 
			
		||||
Interceptors, i.e. [middleware](https://medium.com/@matryer/writing-middleware-in-golang-and-how-go-makes-it-so-much-fun-4375c1246e81#.gv7tdlghs)
 | 
			
		||||
that is executed either on the gRPC Server before the request is passed onto the user's application logic, or on the gRPC client around the user call. It is a perfect way to implement
 | 
			
		||||
common patterns: auth, logging, message, validation, retries or monitoring.
 | 
			
		||||
common patterns: auth, logging, message, validation, retries, or monitoring.
 | 
			
		||||
 | 
			
		||||
These are generic building blocks that make it easy to build multiple microservices easily.
 | 
			
		||||
The purpose of this repository is to act as a go-to point for such reusable functionality. It contains
 | 
			
		||||
@@ -29,57 +36,57 @@ import "github.com/grpc-ecosystem/go-grpc-middleware"
 | 
			
		||||
 | 
			
		||||
myServer := grpc.NewServer(
 | 
			
		||||
    grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(
 | 
			
		||||
        grpc_recovery.StreamServerInterceptor(),
 | 
			
		||||
        grpc_ctxtags.StreamServerInterceptor(),
 | 
			
		||||
        grpc_opentracing.StreamServerInterceptor(),
 | 
			
		||||
        grpc_prometheus.StreamServerInterceptor,
 | 
			
		||||
        grpc_zap.StreamServerInterceptor(zapLogger),
 | 
			
		||||
        grpc_auth.StreamServerInterceptor(myAuthFunction),
 | 
			
		||||
        grpc_recovery.StreamServerInterceptor(),
 | 
			
		||||
    )),
 | 
			
		||||
    grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
 | 
			
		||||
        grpc_recovery.UnaryServerInterceptor(),
 | 
			
		||||
        grpc_ctxtags.UnaryServerInterceptor(),
 | 
			
		||||
        grpc_opentracing.UnaryServerInterceptor(),
 | 
			
		||||
        grpc_prometheus.UnaryServerInterceptor,
 | 
			
		||||
        grpc_zap.UnaryServerInterceptor(zapLogger),
 | 
			
		||||
        grpc_auth.UnaryServerInterceptor(myAuthFunction),
 | 
			
		||||
        grpc_recovery.UnaryServerInterceptor(),
 | 
			
		||||
    )),
 | 
			
		||||
)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Interceptors
 | 
			
		||||
 | 
			
		||||
*Please send a PR to add new interceptors or middleware to this list*
 | 
			
		||||
_Please send a PR to add new interceptors or middleware to this list_
 | 
			
		||||
 | 
			
		||||
#### Auth
 | 
			
		||||
   * [`grpc_auth`](auth) - a customizable (via `AuthFunc`) piece of auth middleware 
 | 
			
		||||
 | 
			
		||||
- [`grpc_auth`](auth) - a customizable (via `AuthFunc`) piece of auth middleware
 | 
			
		||||
 | 
			
		||||
#### Logging
 | 
			
		||||
   * [`grpc_ctxtags`](tags/) - a library that adds a `Tag` map to context, with data populated from request body
 | 
			
		||||
   * [`grpc_zap`](logging/zap/) - integration of [zap](https://github.com/uber-go/zap) logging library into gRPC handlers.
 | 
			
		||||
   * [`grpc_logrus`](logging/logrus/) - integration of [logrus](https://github.com/sirupsen/logrus) logging library into gRPC handlers.
 | 
			
		||||
   * [`grpc_kit`](logging/kit/) - integration of [go-kit](https://github.com/go-kit/kit/tree/master/log) logging library into gRPC handlers.
 | 
			
		||||
   * [`grpc_grpc_logsettable`](logging/settable/) - a wrapper around `grpclog.LoggerV2` that allows to replace loggers in runtime (thread-safe).
 | 
			
		||||
 | 
			
		||||
- [`grpc_ctxtags`](tags/) - a library that adds a `Tag` map to context, with data populated from request body
 | 
			
		||||
- [`grpc_zap`](logging/zap/) - integration of [zap](https://github.com/uber-go/zap) logging library into gRPC handlers.
 | 
			
		||||
- [`grpc_logrus`](logging/logrus/) - integration of [logrus](https://github.com/sirupsen/logrus) logging library into gRPC handlers.
 | 
			
		||||
- [`grpc_kit`](logging/kit/) - integration of [go-kit/log](https://github.com/go-kit/log) logging library into gRPC handlers.
 | 
			
		||||
- [`grpc_grpc_logsettable`](logging/settable/) - a wrapper around `grpclog.LoggerV2` that allows to replace loggers in runtime (thread-safe).
 | 
			
		||||
 | 
			
		||||
#### Monitoring
 | 
			
		||||
   * [`grpc_prometheus`⚡](https://github.com/grpc-ecosystem/go-grpc-prometheus) - Prometheus client-side and server-side monitoring middleware
 | 
			
		||||
   * [`otgrpc`⚡](https://github.com/grpc-ecosystem/grpc-opentracing/tree/master/go/otgrpc) - [OpenTracing](http://opentracing.io/) client-side and server-side interceptors
 | 
			
		||||
   * [`grpc_opentracing`](tracing/opentracing) - [OpenTracing](http://opentracing.io/) client-side and server-side interceptors with support for streaming and handler-returned tags
 | 
			
		||||
 | 
			
		||||
- [`grpc_prometheus`⚡](https://github.com/grpc-ecosystem/go-grpc-prometheus) - Prometheus client-side and server-side monitoring middleware
 | 
			
		||||
- [`otgrpc`⚡](https://github.com/grpc-ecosystem/grpc-opentracing/tree/master/go/otgrpc) - [OpenTracing](http://opentracing.io/) client-side and server-side interceptors
 | 
			
		||||
- [`grpc_opentracing`](tracing/opentracing) - [OpenTracing](http://opentracing.io/) client-side and server-side interceptors with support for streaming and handler-returned tags
 | 
			
		||||
- [`otelgrpc`](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/instrumentation/google.golang.org/grpc/otelgrpc) - [OpenTelemetry](https://opentelemetry.io/) client-side and server-side interceptors
 | 
			
		||||
 | 
			
		||||
#### Client
 | 
			
		||||
   * [`grpc_retry`](retry/) - a generic gRPC response code retry mechanism, client-side middleware
 | 
			
		||||
 | 
			
		||||
- [`grpc_retry`](retry/) - a generic gRPC response code retry mechanism, client-side middleware
 | 
			
		||||
 | 
			
		||||
#### Server
 | 
			
		||||
   * [`grpc_validator`](validator/) - codegen inbound message validation from `.proto` options
 | 
			
		||||
   * [`grpc_recovery`](recovery/) - turn panics into gRPC errors
 | 
			
		||||
   * [`ratelimit`](ratelimit/) - grpc rate limiting by your own limiter
 | 
			
		||||
 | 
			
		||||
- [`grpc_validator`](validator/) - codegen inbound message validation from `.proto` options
 | 
			
		||||
- [`grpc_recovery`](recovery/) - turn panics into gRPC errors
 | 
			
		||||
- [`ratelimit`](ratelimit/) - grpc rate limiting by your own limiter
 | 
			
		||||
 | 
			
		||||
## Status
 | 
			
		||||
 | 
			
		||||
This code has been running in *production* since May 2016 as the basis of the gRPC micro services stack at [Improbable](https://improbable.io).
 | 
			
		||||
 | 
			
		||||
Additional tooling will be added, and contributions are welcome.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										132
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										132
									
								
								vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -16,22 +16,41 @@ import (
 | 
			
		||||
// Execution is done in left-to-right order, including passing of context.
 | 
			
		||||
// For example ChainUnaryServer(one, two, three) will execute one before two before three, and three
 | 
			
		||||
// will see context changes of one and two.
 | 
			
		||||
//
 | 
			
		||||
// While this can be useful in some scenarios, it is generally advisable to use google.golang.org/grpc.ChainUnaryInterceptor directly.
 | 
			
		||||
func ChainUnaryServer(interceptors ...grpc.UnaryServerInterceptor) grpc.UnaryServerInterceptor {
 | 
			
		||||
	n := len(interceptors)
 | 
			
		||||
 | 
			
		||||
	// Dummy interceptor maintained for backward compatibility to avoid returning nil.
 | 
			
		||||
	if n == 0 {
 | 
			
		||||
		return func(ctx context.Context, req interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
 | 
			
		||||
			return handler(ctx, req)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// The degenerate case, just return the single wrapped interceptor directly.
 | 
			
		||||
	if n == 1 {
 | 
			
		||||
		return interceptors[0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Return a function which satisfies the interceptor interface, and which is
 | 
			
		||||
	// a closure over the given list of interceptors to be chained.
 | 
			
		||||
	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
 | 
			
		||||
		chainer := func(currentInter grpc.UnaryServerInterceptor, currentHandler grpc.UnaryHandler) grpc.UnaryHandler {
 | 
			
		||||
			return func(currentCtx context.Context, currentReq interface{}) (interface{}, error) {
 | 
			
		||||
				return currentInter(currentCtx, currentReq, info, currentHandler)
 | 
			
		||||
		currHandler := handler
 | 
			
		||||
		// Iterate backwards through all interceptors except the first (outermost).
 | 
			
		||||
		// Wrap each one in a function which satisfies the handler interface, but
 | 
			
		||||
		// is also a closure over the `info` and `handler` parameters. Then pass
 | 
			
		||||
		// each pseudo-handler to the next outer interceptor as the handler to be called.
 | 
			
		||||
		for i := n - 1; i > 0; i-- {
 | 
			
		||||
			// Rebind to loop-local vars so they can be closed over.
 | 
			
		||||
			innerHandler, i := currHandler, i
 | 
			
		||||
			currHandler = func(currentCtx context.Context, currentReq interface{}) (interface{}, error) {
 | 
			
		||||
				return interceptors[i](currentCtx, currentReq, info, innerHandler)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		chainedHandler := handler
 | 
			
		||||
		for i := n - 1; i >= 0; i-- {
 | 
			
		||||
			chainedHandler = chainer(interceptors[i], chainedHandler)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return chainedHandler(ctx, req)
 | 
			
		||||
		// Finally return the result of calling the outermost interceptor with the
 | 
			
		||||
		// outermost pseudo-handler created above as its handler.
 | 
			
		||||
		return interceptors[0](ctx, req, info, currHandler)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -40,22 +59,31 @@ func ChainUnaryServer(interceptors ...grpc.UnaryServerInterceptor) grpc.UnarySer
 | 
			
		||||
// Execution is done in left-to-right order, including passing of context.
 | 
			
		||||
// For example ChainUnaryServer(one, two, three) will execute one before two before three.
 | 
			
		||||
// If you want to pass context between interceptors, use WrapServerStream.
 | 
			
		||||
//
 | 
			
		||||
// While this can be useful in some scenarios, it is generally advisable to use google.golang.org/grpc.ChainStreamInterceptor directly.
 | 
			
		||||
func ChainStreamServer(interceptors ...grpc.StreamServerInterceptor) grpc.StreamServerInterceptor {
 | 
			
		||||
	n := len(interceptors)
 | 
			
		||||
 | 
			
		||||
	return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
 | 
			
		||||
		chainer := func(currentInter grpc.StreamServerInterceptor, currentHandler grpc.StreamHandler) grpc.StreamHandler {
 | 
			
		||||
			return func(currentSrv interface{}, currentStream grpc.ServerStream) error {
 | 
			
		||||
				return currentInter(currentSrv, currentStream, info, currentHandler)
 | 
			
		||||
	// Dummy interceptor maintained for backward compatibility to avoid returning nil.
 | 
			
		||||
	if n == 0 {
 | 
			
		||||
		return func(srv interface{}, stream grpc.ServerStream, _ *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
 | 
			
		||||
			return handler(srv, stream)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if n == 1 {
 | 
			
		||||
		return interceptors[0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
 | 
			
		||||
		currHandler := handler
 | 
			
		||||
		for i := n - 1; i > 0; i-- {
 | 
			
		||||
			innerHandler, i := currHandler, i
 | 
			
		||||
			currHandler = func(currentSrv interface{}, currentStream grpc.ServerStream) error {
 | 
			
		||||
				return interceptors[i](currentSrv, currentStream, info, innerHandler)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		chainedHandler := handler
 | 
			
		||||
		for i := n - 1; i >= 0; i-- {
 | 
			
		||||
			chainedHandler = chainer(interceptors[i], chainedHandler)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return chainedHandler(srv, ss)
 | 
			
		||||
		return interceptors[0](srv, stream, info, currHandler)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -66,19 +94,26 @@ func ChainStreamServer(interceptors ...grpc.StreamServerInterceptor) grpc.Stream
 | 
			
		||||
func ChainUnaryClient(interceptors ...grpc.UnaryClientInterceptor) grpc.UnaryClientInterceptor {
 | 
			
		||||
	n := len(interceptors)
 | 
			
		||||
 | 
			
		||||
	// Dummy interceptor maintained for backward compatibility to avoid returning nil.
 | 
			
		||||
	if n == 0 {
 | 
			
		||||
		return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
 | 
			
		||||
			return invoker(ctx, method, req, reply, cc, opts...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if n == 1 {
 | 
			
		||||
		return interceptors[0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
 | 
			
		||||
		chainer := func(currentInter grpc.UnaryClientInterceptor, currentInvoker grpc.UnaryInvoker) grpc.UnaryInvoker {
 | 
			
		||||
			return func(currentCtx context.Context, currentMethod string, currentReq, currentRepl interface{}, currentConn *grpc.ClientConn, currentOpts ...grpc.CallOption) error {
 | 
			
		||||
				return currentInter(currentCtx, currentMethod, currentReq, currentRepl, currentConn, currentInvoker, currentOpts...)
 | 
			
		||||
		currInvoker := invoker
 | 
			
		||||
		for i := n - 1; i > 0; i-- {
 | 
			
		||||
			innerInvoker, i := currInvoker, i
 | 
			
		||||
			currInvoker = func(currentCtx context.Context, currentMethod string, currentReq, currentRepl interface{}, currentConn *grpc.ClientConn, currentOpts ...grpc.CallOption) error {
 | 
			
		||||
				return interceptors[i](currentCtx, currentMethod, currentReq, currentRepl, currentConn, innerInvoker, currentOpts...)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		chainedInvoker := invoker
 | 
			
		||||
		for i := n - 1; i >= 0; i-- {
 | 
			
		||||
			chainedInvoker = chainer(interceptors[i], chainedInvoker)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return chainedInvoker(ctx, method, req, reply, cc, opts...)
 | 
			
		||||
		return interceptors[0](ctx, method, req, reply, cc, currInvoker, opts...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -89,19 +124,26 @@ func ChainUnaryClient(interceptors ...grpc.UnaryClientInterceptor) grpc.UnaryCli
 | 
			
		||||
func ChainStreamClient(interceptors ...grpc.StreamClientInterceptor) grpc.StreamClientInterceptor {
 | 
			
		||||
	n := len(interceptors)
 | 
			
		||||
 | 
			
		||||
	// Dummy interceptor maintained for backward compatibility to avoid returning nil.
 | 
			
		||||
	if n == 0 {
 | 
			
		||||
		return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
 | 
			
		||||
			return streamer(ctx, desc, cc, method, opts...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if n == 1 {
 | 
			
		||||
		return interceptors[0]
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
 | 
			
		||||
		chainer := func(currentInter grpc.StreamClientInterceptor, currentStreamer grpc.Streamer) grpc.Streamer {
 | 
			
		||||
			return func(currentCtx context.Context, currentDesc *grpc.StreamDesc, currentConn *grpc.ClientConn, currentMethod string, currentOpts ...grpc.CallOption) (grpc.ClientStream, error) {
 | 
			
		||||
				return currentInter(currentCtx, currentDesc, currentConn, currentMethod, currentStreamer, currentOpts...)
 | 
			
		||||
		currStreamer := streamer
 | 
			
		||||
		for i := n - 1; i > 0; i-- {
 | 
			
		||||
			innerStreamer, i := currStreamer, i
 | 
			
		||||
			currStreamer = func(currentCtx context.Context, currentDesc *grpc.StreamDesc, currentConn *grpc.ClientConn, currentMethod string, currentOpts ...grpc.CallOption) (grpc.ClientStream, error) {
 | 
			
		||||
				return interceptors[i](currentCtx, currentDesc, currentConn, currentMethod, innerStreamer, currentOpts...)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		chainedStreamer := streamer
 | 
			
		||||
		for i := n - 1; i >= 0; i-- {
 | 
			
		||||
			chainedStreamer = chainer(interceptors[i], chainedStreamer)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return chainedStreamer(ctx, desc, cc, method, opts...)
 | 
			
		||||
		return interceptors[0](ctx, desc, cc, method, currStreamer, opts...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -109,12 +151,16 @@ func ChainStreamClient(interceptors ...grpc.StreamClientInterceptor) grpc.Stream
 | 
			
		||||
//
 | 
			
		||||
// WithUnaryServerChain is a grpc.Server config option that accepts multiple unary interceptors.
 | 
			
		||||
// Basically syntactic sugar.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: use google.golang.org/grpc.ChainUnaryInterceptor instead.
 | 
			
		||||
func WithUnaryServerChain(interceptors ...grpc.UnaryServerInterceptor) grpc.ServerOption {
 | 
			
		||||
	return grpc.UnaryInterceptor(ChainUnaryServer(interceptors...))
 | 
			
		||||
	return grpc.ChainUnaryInterceptor(interceptors...)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// WithStreamServerChain is a grpc.Server config option that accepts multiple stream interceptors.
 | 
			
		||||
// Basically syntactic sugar.
 | 
			
		||||
//
 | 
			
		||||
// Deprecated: use google.golang.org/grpc.ChainStreamInterceptor instead.
 | 
			
		||||
func WithStreamServerChain(interceptors ...grpc.StreamServerInterceptor) grpc.ServerOption {
 | 
			
		||||
	return grpc.StreamInterceptor(ChainStreamServer(interceptors...))
 | 
			
		||||
	return grpc.ChainStreamInterceptor(interceptors...)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user