...
1 package ratelimit
2
3 import (
4 "context"
5
6 "google.golang.org/grpc"
7 "google.golang.org/grpc/codes"
8 "google.golang.org/grpc/status"
9 )
10
11
12
13
14 type Limiter interface {
15 Limit() bool
16 }
17
18
19 func UnaryServerInterceptor(limiter Limiter) grpc.UnaryServerInterceptor {
20 return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
21 if limiter.Limit() {
22 return nil, status.Errorf(codes.ResourceExhausted, "%s is rejected by grpc_ratelimit middleware, please retry later.", info.FullMethod)
23 }
24 return handler(ctx, req)
25 }
26 }
27
28
29 func StreamServerInterceptor(limiter Limiter) grpc.StreamServerInterceptor {
30 return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
31 if limiter.Limit() {
32 return status.Errorf(codes.ResourceExhausted, "%s is rejected by grpc_ratelimit middleware, please retry later.", info.FullMethod)
33 }
34 return handler(srv, stream)
35 }
36 }
37
View as plain text