change grpc interceptor to chain interceptor (#200)
* change grpc interceptor to chain interceptor * change server rpc interceptors, del testing codemaster
parent
a5fb29a6f0
commit
0a2c2d1eca
@ -1,83 +1,13 @@
|
|||||||
package internal
|
package internal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func WithStreamClientInterceptors(interceptors ...grpc.StreamClientInterceptor) grpc.DialOption {
|
func WithStreamClientInterceptors(interceptors ...grpc.StreamClientInterceptor) grpc.DialOption {
|
||||||
return grpc.WithStreamInterceptor(chainStreamClientInterceptors(interceptors...))
|
return grpc.WithChainStreamInterceptor(interceptors...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithUnaryClientInterceptors(interceptors ...grpc.UnaryClientInterceptor) grpc.DialOption {
|
func WithUnaryClientInterceptors(interceptors ...grpc.UnaryClientInterceptor) grpc.DialOption {
|
||||||
return grpc.WithUnaryInterceptor(chainUnaryClientInterceptors(interceptors...))
|
return grpc.WithChainUnaryInterceptor(interceptors...)
|
||||||
}
|
|
||||||
|
|
||||||
func chainStreamClientInterceptors(interceptors ...grpc.StreamClientInterceptor) grpc.StreamClientInterceptor {
|
|
||||||
switch len(interceptors) {
|
|
||||||
case 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...)
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
return interceptors[0]
|
|
||||||
default:
|
|
||||||
last := len(interceptors) - 1
|
|
||||||
return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn,
|
|
||||||
method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
||||||
var chainStreamer grpc.Streamer
|
|
||||||
var current int
|
|
||||||
|
|
||||||
chainStreamer = func(curCtx context.Context, curDesc *grpc.StreamDesc, curCc *grpc.ClientConn,
|
|
||||||
curMethod string, curOpts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
||||||
if current == last {
|
|
||||||
return streamer(curCtx, curDesc, curCc, curMethod, curOpts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
current++
|
|
||||||
clientStream, err := interceptors[current](curCtx, curDesc, curCc, curMethod, chainStreamer, curOpts...)
|
|
||||||
current--
|
|
||||||
|
|
||||||
return clientStream, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return interceptors[0](ctx, desc, cc, method, chainStreamer, opts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func chainUnaryClientInterceptors(interceptors ...grpc.UnaryClientInterceptor) grpc.UnaryClientInterceptor {
|
|
||||||
switch len(interceptors) {
|
|
||||||
case 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...)
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
return interceptors[0]
|
|
||||||
default:
|
|
||||||
last := len(interceptors) - 1
|
|
||||||
return func(ctx context.Context, method string, req, reply interface{},
|
|
||||||
cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
|
||||||
var chainInvoker grpc.UnaryInvoker
|
|
||||||
var current int
|
|
||||||
|
|
||||||
chainInvoker = func(curCtx context.Context, curMethod string, curReq, curReply interface{},
|
|
||||||
curCc *grpc.ClientConn, curOpts ...grpc.CallOption) error {
|
|
||||||
if current == last {
|
|
||||||
return invoker(curCtx, curMethod, curReq, curReply, curCc, curOpts...)
|
|
||||||
}
|
|
||||||
|
|
||||||
current++
|
|
||||||
err := interceptors[current](curCtx, curMethod, curReq, curReply, curCc, chainInvoker, curOpts...)
|
|
||||||
current--
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return interceptors[0](ctx, method, req, reply, cc, chainInvoker, opts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,81 +1,13 @@
|
|||||||
package internal
|
package internal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func WithStreamServerInterceptors(interceptors ...grpc.StreamServerInterceptor) grpc.ServerOption {
|
func WithStreamServerInterceptors(interceptors ...grpc.StreamServerInterceptor) grpc.ServerOption {
|
||||||
return grpc.StreamInterceptor(chainStreamServerInterceptors(interceptors...))
|
return grpc.ChainStreamInterceptor(interceptors...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func WithUnaryServerInterceptors(interceptors ...grpc.UnaryServerInterceptor) grpc.ServerOption {
|
func WithUnaryServerInterceptors(interceptors ...grpc.UnaryServerInterceptor) grpc.ServerOption {
|
||||||
return grpc.UnaryInterceptor(chainUnaryServerInterceptors(interceptors...))
|
return grpc.ChainUnaryInterceptor(interceptors...)
|
||||||
}
|
|
||||||
|
|
||||||
func chainStreamServerInterceptors(interceptors ...grpc.StreamServerInterceptor) grpc.StreamServerInterceptor {
|
|
||||||
switch len(interceptors) {
|
|
||||||
case 0:
|
|
||||||
return func(srv interface{}, stream grpc.ServerStream, _ *grpc.StreamServerInfo,
|
|
||||||
handler grpc.StreamHandler) error {
|
|
||||||
return handler(srv, stream)
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
return interceptors[0]
|
|
||||||
default:
|
|
||||||
last := len(interceptors) - 1
|
|
||||||
return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo,
|
|
||||||
handler grpc.StreamHandler) error {
|
|
||||||
var chainHandler grpc.StreamHandler
|
|
||||||
var current int
|
|
||||||
|
|
||||||
chainHandler = func(curSrv interface{}, curStream grpc.ServerStream) error {
|
|
||||||
if current == last {
|
|
||||||
return handler(curSrv, curStream)
|
|
||||||
}
|
|
||||||
|
|
||||||
current++
|
|
||||||
err := interceptors[current](curSrv, curStream, info, chainHandler)
|
|
||||||
current--
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return interceptors[0](srv, stream, info, chainHandler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func chainUnaryServerInterceptors(interceptors ...grpc.UnaryServerInterceptor) grpc.UnaryServerInterceptor {
|
|
||||||
switch len(interceptors) {
|
|
||||||
case 0:
|
|
||||||
return func(ctx context.Context, req interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (
|
|
||||||
interface{}, error) {
|
|
||||||
return handler(ctx, req)
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
return interceptors[0]
|
|
||||||
default:
|
|
||||||
last := len(interceptors) - 1
|
|
||||||
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (
|
|
||||||
interface{}, error) {
|
|
||||||
var chainHandler grpc.UnaryHandler
|
|
||||||
var current int
|
|
||||||
|
|
||||||
chainHandler = func(curCtx context.Context, curReq interface{}) (interface{}, error) {
|
|
||||||
if current == last {
|
|
||||||
return handler(curCtx, curReq)
|
|
||||||
}
|
|
||||||
|
|
||||||
current++
|
|
||||||
resp, err := interceptors[current](curCtx, curReq, info, chainHandler)
|
|
||||||
current--
|
|
||||||
|
|
||||||
return resp, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return interceptors[0](ctx, req, info, chainHandler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue