...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ratelimit
15
16 import (
17 "context"
18 "log"
19 "time"
20
21 "github.com/sassoftware/relic/lib/pkcs7"
22 "github.com/sassoftware/relic/lib/pkcs9"
23 "golang.org/x/time/rate"
24 )
25
26 type limiter struct {
27 Timestamper pkcs9.Timestamper
28 Limit *rate.Limiter
29 }
30
31 func New(t pkcs9.Timestamper, r float64, burst int) pkcs9.Timestamper {
32 if r == 0 {
33 return t
34 }
35 if burst < 1 {
36 burst = 1
37 }
38 return &limiter{t, rate.NewLimiter(rate.Limit(r), burst)}
39 }
40
41 func (l *limiter) Timestamp(ctx context.Context, req *pkcs9.Request) (*pkcs7.ContentInfoSignedData, error) {
42 start := time.Now()
43 if err := l.Limit.Wait(ctx); err != nil {
44 return nil, err
45 }
46 if waited := time.Now().Sub(start); waited > 50*time.Millisecond {
47 log.Printf("timestamper: waited %s due to rate limit", waited)
48 }
49 return l.Timestamper.Timestamp(ctx, req)
50 }
51
View as plain text