Skip to content

Commit 36a1f1b

Browse files
author
Kazuhiko Yamashita
authored
Merge pull request #3 from 2manymws/country-code
To make existing country codes available
2 parents d1e07ad + 337a815 commit 36a1f1b

File tree

4 files changed

+97
-50
lines changed

4 files changed

+97
-50
lines changed

base_limiter_test.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,10 @@
11
package rlutils
22

33
import (
4-
"net/http"
54
"net/http/httptest"
65
"testing"
7-
"time"
8-
9-
"github.com/2manymws/rl"
106
)
117

12-
// Helper function to generate a request context suitable for testing.
13-
func createTestContext(limit int, windowLen time.Duration, next http.Handler) *rl.Context {
14-
return &rl.Context{
15-
StatusCode: http.StatusTooManyRequests,
16-
Err: rl.ErrRateLimitExceeded,
17-
// Limiter, RequestLimit, and other fields would be initialized here as needed
18-
Next: next,
19-
RequestLimit: limit,
20-
RateLimitRemaining: 0,
21-
WindowLen: windowLen,
22-
}
23-
}
248
func TestBaseLimiter_isTargetExtensions(t *testing.T) {
259
tests := []struct {
2610
name string

country_limiter.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ type CountryLimiter struct {
1919
skipCountries map[string]struct{}
2020
BaseLimiter
2121
}
22+
type key int
23+
24+
const ContextCountryKey key = iota
2225

2326
// 国別のリクエスト数を制限する
2427
// 制限単位はIPアドレス
@@ -71,9 +74,15 @@ func (l *CountryLimiter) Rule(r *http.Request) (*rl.Rule, error) {
7174
}
7275

7376
remoteAddr := strings.Split(r.RemoteAddr, ":")[0]
74-
country, err := l.country(remoteAddr)
75-
if err != nil {
76-
return nil, err
77+
country := ""
78+
if r.Context().Value(ContextCountryKey) != nil {
79+
country = r.Context().Value(ContextCountryKey).(string)
80+
} else {
81+
c, err := l.country(remoteAddr)
82+
if err != nil {
83+
return nil, err
84+
}
85+
country = c
7786
}
7887

7988
limit := &rl.Rule{

country_limiter_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package rlutils
22

33
import (
4+
"context"
45
"net/http"
56
"path/filepath"
67
"strings"
@@ -117,3 +118,53 @@ func TestCountryLimiter(t *testing.T) {
117118
})
118119
}
119120
}
121+
122+
func TestCountryLimiterWithContext(t *testing.T) {
123+
abspath, _ := filepath.Abs("./testdata/GeoIP2-Country-Test.mmdb")
124+
reqLimit := 10
125+
126+
// Define your test cases
127+
testCases := []struct {
128+
name string
129+
request *http.Request
130+
countries []string
131+
expectedCountry string
132+
shouldLimit bool
133+
}{
134+
{
135+
name: "Valid IP from United States With Port",
136+
request: testHTTPRequest("50.114.0.1:1234"),
137+
countries: []string{"US"},
138+
shouldLimit: true,
139+
},
140+
}
141+
142+
for _, tc := range testCases {
143+
t.Run(tc.name, func(t *testing.T) {
144+
// Run the country function to get the ISO country code
145+
cl, err := NewCountryLimiter(
146+
abspath,
147+
[]string{"US"},
148+
[]string{},
149+
reqLimit,
150+
1*time.Hour,
151+
nil,
152+
nil,
153+
)
154+
if err != nil {
155+
t.Fatal(err)
156+
}
157+
ctx := tc.request.Context()
158+
ctx = context.WithValue(ctx, ContextCountryKey, "US")
159+
tc.request = tc.request.WithContext(ctx)
160+
rule, _ := cl.Rule(tc.request)
161+
if tc.shouldLimit && (rule == nil || rule.ReqLimit != reqLimit) {
162+
t.Errorf("Expected shouldLimit rule with limit %d, but got %+v", reqLimit, rule)
163+
}
164+
if !tc.shouldLimit && (rule == nil || rule.ReqLimit != -1) {
165+
t.Errorf("Expected disshouldLimit rule with no limiting, but got %+v", rule)
166+
}
167+
168+
})
169+
}
170+
}

coverage.out

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,44 @@
11
mode: count
2-
github.com/2manymws/rlutils/base_limiter.go:26.15,35.2 2 19
2+
github.com/2manymws/rlutils/base_limiter.go:26.15,35.2 2 20
33
github.com/2manymws/rlutils/base_limiter.go:37.70,39.2 1 0
44
github.com/2manymws/rlutils/base_limiter.go:41.37,43.2 1 0
5-
github.com/2manymws/rlutils/base_limiter.go:45.61,47.2 1 20
6-
github.com/2manymws/rlutils/base_limiter.go:49.64,50.34 1 26
7-
github.com/2manymws/rlutils/base_limiter.go:50.34,52.3 1 21
5+
github.com/2manymws/rlutils/base_limiter.go:45.61,47.2 1 21
6+
github.com/2manymws/rlutils/base_limiter.go:49.64,50.34 1 27
7+
github.com/2manymws/rlutils/base_limiter.go:50.34,52.3 1 22
88
github.com/2manymws/rlutils/base_limiter.go:53.2,54.41 2 5
99
github.com/2manymws/rlutils/base_limiter.go:54.41,55.40 1 8
1010
github.com/2manymws/rlutils/base_limiter.go:55.40,57.4 1 3
1111
github.com/2manymws/rlutils/base_limiter.go:59.2,59.14 1 2
12-
github.com/2manymws/rlutils/country_limiter.go:33.28,35.16 2 5
13-
github.com/2manymws/rlutils/country_limiter.go:35.16,37.3 1 0
14-
github.com/2manymws/rlutils/country_limiter.go:38.2,41.30 3 5
15-
github.com/2manymws/rlutils/country_limiter.go:41.30,43.3 1 5
16-
github.com/2manymws/rlutils/country_limiter.go:45.2,45.34 1 5
17-
github.com/2manymws/rlutils/country_limiter.go:45.34,46.15 1 1
18-
github.com/2manymws/rlutils/country_limiter.go:46.15,48.4 1 0
19-
github.com/2manymws/rlutils/country_limiter.go:49.3,49.22 1 1
20-
github.com/2manymws/rlutils/country_limiter.go:51.2,61.8 1 5
21-
github.com/2manymws/rlutils/country_limiter.go:64.40,66.2 1 0
22-
github.com/2manymws/rlutils/country_limiter.go:68.66,69.27 1 5
23-
github.com/2manymws/rlutils/country_limiter.go:69.27,71.3 1 0
24-
github.com/2manymws/rlutils/country_limiter.go:73.2,75.16 3 5
25-
github.com/2manymws/rlutils/country_limiter.go:75.16,77.3 1 1
26-
github.com/2manymws/rlutils/country_limiter.go:79.2,86.19 3 4
27-
github.com/2manymws/rlutils/country_limiter.go:86.19,88.3 1 0
28-
github.com/2manymws/rlutils/country_limiter.go:90.2,90.43 1 4
29-
github.com/2manymws/rlutils/country_limiter.go:90.43,92.3 1 1
30-
github.com/2manymws/rlutils/country_limiter.go:94.2,94.35 1 3
31-
github.com/2manymws/rlutils/country_limiter.go:94.35,97.3 1 0
32-
github.com/2manymws/rlutils/country_limiter.go:99.2,99.39 1 3
33-
github.com/2manymws/rlutils/country_limiter.go:99.39,105.3 1 3
34-
github.com/2manymws/rlutils/country_limiter.go:106.2,106.21 1 0
35-
github.com/2manymws/rlutils/country_limiter.go:109.69,117.16 3 10
36-
github.com/2manymws/rlutils/country_limiter.go:117.16,119.3 1 2
37-
github.com/2manymws/rlutils/country_limiter.go:121.2,121.36 1 8
38-
github.com/2manymws/rlutils/country_limiter.go:124.73,126.2 1 0
12+
github.com/2manymws/rlutils/country_limiter.go:36.28,38.16 2 6
13+
github.com/2manymws/rlutils/country_limiter.go:38.16,40.3 1 0
14+
github.com/2manymws/rlutils/country_limiter.go:41.2,44.30 3 6
15+
github.com/2manymws/rlutils/country_limiter.go:44.30,46.3 1 6
16+
github.com/2manymws/rlutils/country_limiter.go:48.2,48.34 1 6
17+
github.com/2manymws/rlutils/country_limiter.go:48.34,49.15 1 1
18+
github.com/2manymws/rlutils/country_limiter.go:49.15,51.4 1 0
19+
github.com/2manymws/rlutils/country_limiter.go:52.3,52.22 1 1
20+
github.com/2manymws/rlutils/country_limiter.go:54.2,64.8 1 6
21+
github.com/2manymws/rlutils/country_limiter.go:67.40,69.2 1 0
22+
github.com/2manymws/rlutils/country_limiter.go:71.66,72.27 1 6
23+
github.com/2manymws/rlutils/country_limiter.go:72.27,74.3 1 0
24+
github.com/2manymws/rlutils/country_limiter.go:76.2,78.49 3 6
25+
github.com/2manymws/rlutils/country_limiter.go:78.49,80.3 1 1
26+
github.com/2manymws/rlutils/country_limiter.go:80.8,82.17 2 5
27+
github.com/2manymws/rlutils/country_limiter.go:82.17,84.4 1 1
28+
github.com/2manymws/rlutils/country_limiter.go:85.3,85.14 1 4
29+
github.com/2manymws/rlutils/country_limiter.go:88.2,95.19 3 5
30+
github.com/2manymws/rlutils/country_limiter.go:95.19,97.3 1 0
31+
github.com/2manymws/rlutils/country_limiter.go:99.2,99.43 1 5
32+
github.com/2manymws/rlutils/country_limiter.go:99.43,101.3 1 1
33+
github.com/2manymws/rlutils/country_limiter.go:103.2,103.35 1 4
34+
github.com/2manymws/rlutils/country_limiter.go:103.35,106.3 1 0
35+
github.com/2manymws/rlutils/country_limiter.go:108.2,108.39 1 4
36+
github.com/2manymws/rlutils/country_limiter.go:108.39,114.3 1 4
37+
github.com/2manymws/rlutils/country_limiter.go:115.2,115.21 1 0
38+
github.com/2manymws/rlutils/country_limiter.go:118.69,126.16 3 10
39+
github.com/2manymws/rlutils/country_limiter.go:126.16,128.3 1 2
40+
github.com/2manymws/rlutils/country_limiter.go:130.2,130.36 1 8
41+
github.com/2manymws/rlutils/country_limiter.go:133.73,135.2 1 0
3942
github.com/2manymws/rlutils/get_parameter_limiter.go:23.24,33.2 1 3
4043
github.com/2manymws/rlutils/get_parameter_limiter.go:35.45,37.2 1 0
4144
github.com/2manymws/rlutils/get_parameter_limiter.go:39.71,40.27 1 3

0 commit comments

Comments
 (0)