/
apilimiter.go
59 lines (54 loc) · 1.97 KB
/
apilimiter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*
* Tencent is pleased to support the open source community by making 蓝鲸 available.
* Copyright (C) 2017-2018 THL A29 Limited, a Tencent company. All rights reserved.
* Licensed under the MIT License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
* http://opensource.org/licenses/MIT
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language governing permissions and
* limitations under the License.
*/
package metadata
import (
"fmt"
"regexp"
"configcenter/src/common/util"
)
// LimiterRule is a rule for api limiter
type LimiterRule struct {
RuleName string `json:"rulename"`
AppCode string `json:"appcode"`
User string `json:"user"`
IP string `json:"ip"`
Method string `json:"method"`
Url string `json:"url"`
Limit int64 `json:"limit"`
TTL int64 `json:"ttl"`
DenyAll bool `json:"denyall"`
}
// Verify to check the fields of LimiterRule
func (r LimiterRule) Verify() error {
if r.RuleName == "" {
return fmt.Errorf("rulename must be set")
}
if r.AppCode == "" && r.User == "" && r.IP == "" && r.Url == "" && r.Method == "" {
return fmt.Errorf("one of appcode, user, ip, url, method must be set")
}
if r.Method != "" {
if util.Normalize(r.Method) != "POST" && util.Normalize(r.Method) != "GET" && util.Normalize(r.Method) != "PUT" && util.Normalize(r.Method) != "DELETE" {
return fmt.Errorf("method must be one of POST,GET,PUT,DELETE")
}
}
if r.Url != "" {
if _, err := regexp.Compile(r.Url); err != nil {
return fmt.Errorf("url is not a valid regular expression,%s", err.Error())
}
}
if !r.DenyAll {
if r.Limit <= 0 || r.TTL <= 0 {
return fmt.Errorf("both limit and ttl must be set and bigger than 0 when denyall is false")
}
}
return nil
}