Skip to content

Commit 1a708db

Browse files
author
pyama
committed
Less computational complexity is better.
1 parent 972c569 commit 1a708db

File tree

3 files changed

+45
-29
lines changed

3 files changed

+45
-29
lines changed

base_limiter.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const (
1919
type BaseLimiter struct {
2020
reqLimit int `mapstructure:"req_limit"`
2121
windowLen time.Duration
22-
targetExtensions []string
22+
targetExtensions map[string]struct{}
2323
onRequestLimit func(*rl.Context, string) http.HandlerFunc
2424
rl.Counter
2525
}
@@ -31,12 +31,21 @@ func NewBaseLimiter(
3131
onRequestLimit func(*rl.Context, string) http.HandlerFunc,
3232
) BaseLimiter {
3333
ttl := windowLen * 2 // 最低2回分のウィンドウ分のカウンタを維持する
34+
targetExtensionsMap := make(map[string]struct{}, len(targetExtensions))
35+
if len(targetExtensions) > 0 {
36+
for _, ext := range targetExtensions {
37+
if ext[0] != '.' {
38+
ext = "." + ext
39+
}
40+
targetExtensionsMap[strings.ToLower(ext)] = struct{}{}
41+
}
42+
}
3443
return BaseLimiter{
3544
reqLimit: reqLimit,
3645
windowLen: windowLen,
3746
Counter: counter.New(ttl),
47+
targetExtensions: targetExtensionsMap,
3848
onRequestLimit: onRequestLimit,
39-
targetExtensions: targetExtensions,
4049
}
4150
}
4251

@@ -56,13 +65,9 @@ func (l *BaseLimiter) isTargetExtensions(r *http.Request) bool {
5665
if len(l.targetExtensions) == 0 {
5766
return true
5867
}
59-
extension := filepath.Ext(r.URL.Path)
60-
for _, ext := range l.targetExtensions {
61-
if strings.EqualFold(ext, extension) {
62-
return true
63-
}
64-
}
65-
return false
68+
extension := strings.ToLower(filepath.Ext(r.URL.Path))
69+
_, ok := l.targetExtensions[extension]
70+
return ok
6671
}
6772
func validateKey(key string) error {
6873
for _, k := range []string{RemoteAddrKey, HostKey} {

base_limiter_test.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ func TestBaseLimiter_isTargetExtensions(t *testing.T) {
1818
requestPath: "/file.txt",
1919
want: true,
2020
},
21+
{
22+
name: "Target extension .txt",
23+
targetExtensions: []string{"txt"},
24+
requestPath: "/file.txt",
25+
want: true,
26+
},
2127
{
2228
name: "Target extension .jpg among others",
2329
targetExtensions: []string{".png", ".jpg", ".gif"},
@@ -53,9 +59,12 @@ func TestBaseLimiter_isTargetExtensions(t *testing.T) {
5359
for _, tt := range tests {
5460
t.Run(tt.name, func(t *testing.T) {
5561
// Create a BaseLimiter with specific target extensions.
56-
bl := &BaseLimiter{
57-
targetExtensions: tt.targetExtensions,
58-
}
62+
bl := NewBaseLimiter(
63+
0,
64+
0,
65+
tt.targetExtensions,
66+
nil,
67+
)
5968
// Create an HTTP request with the test case path.
6069
req := httptest.NewRequest("GET", tt.requestPath, nil)
6170
// Check if the request extension is in the target list.

coverage.out

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
mode: count
2-
github.com/2manymws/rlutils/base_limiter.go:32.15,41.2 2 22
3-
github.com/2manymws/rlutils/base_limiter.go:43.70,45.2 1 0
4-
github.com/2manymws/rlutils/base_limiter.go:47.37,49.2 1 0
5-
github.com/2manymws/rlutils/base_limiter.go:51.61,53.2 1 23
6-
github.com/2manymws/rlutils/base_limiter.go:55.64,56.34 1 29
7-
github.com/2manymws/rlutils/base_limiter.go:56.34,58.3 1 24
8-
github.com/2manymws/rlutils/base_limiter.go:59.2,60.41 2 5
9-
github.com/2manymws/rlutils/base_limiter.go:60.41,61.40 1 8
10-
github.com/2manymws/rlutils/base_limiter.go:61.40,63.4 1 3
11-
github.com/2manymws/rlutils/base_limiter.go:65.2,65.14 1 2
12-
github.com/2manymws/rlutils/base_limiter.go:67.36,68.53 1 12
13-
github.com/2manymws/rlutils/base_limiter.go:68.53,69.15 1 22
14-
github.com/2manymws/rlutils/base_limiter.go:69.15,71.4 1 12
15-
github.com/2manymws/rlutils/base_limiter.go:73.2,73.43 1 0
16-
github.com/2manymws/rlutils/base_limiter.go:76.50,77.26 1 7
17-
github.com/2manymws/rlutils/base_limiter.go:77.26,80.3 2 2
18-
github.com/2manymws/rlutils/base_limiter.go:81.2,81.15 1 5
2+
github.com/2manymws/rlutils/base_limiter.go:32.15,35.31 3 29
3+
github.com/2manymws/rlutils/base_limiter.go:35.31,36.40 1 6
4+
github.com/2manymws/rlutils/base_limiter.go:36.40,37.21 1 10
5+
github.com/2manymws/rlutils/base_limiter.go:37.21,39.5 1 1
6+
github.com/2manymws/rlutils/base_limiter.go:40.4,40.58 1 10
7+
github.com/2manymws/rlutils/base_limiter.go:43.2,49.3 1 29
8+
github.com/2manymws/rlutils/base_limiter.go:52.70,54.2 1 0
9+
github.com/2manymws/rlutils/base_limiter.go:56.37,58.2 1 0
10+
github.com/2manymws/rlutils/base_limiter.go:60.61,62.2 1 23
11+
github.com/2manymws/rlutils/base_limiter.go:64.64,65.34 1 30
12+
github.com/2manymws/rlutils/base_limiter.go:65.34,67.3 1 24
13+
github.com/2manymws/rlutils/base_limiter.go:68.2,70.11 3 6
14+
github.com/2manymws/rlutils/base_limiter.go:72.36,73.53 1 12
15+
github.com/2manymws/rlutils/base_limiter.go:73.53,74.15 1 22
16+
github.com/2manymws/rlutils/base_limiter.go:74.15,76.4 1 12
17+
github.com/2manymws/rlutils/base_limiter.go:78.2,78.43 1 0
18+
github.com/2manymws/rlutils/base_limiter.go:81.50,82.26 1 7
19+
github.com/2manymws/rlutils/base_limiter.go:82.26,85.3 2 2
20+
github.com/2manymws/rlutils/base_limiter.go:86.2,86.15 1 5
1921
github.com/2manymws/rlutils/country_limiter.go:36.28,38.16 2 6
2022
github.com/2manymws/rlutils/country_limiter.go:38.16,40.3 1 0
2123
github.com/2manymws/rlutils/country_limiter.go:41.2,44.30 3 6

0 commit comments

Comments
 (0)