@@ -22,18 +22,19 @@ import (
2222)
2323
2424type Rule interface {
25- checkRule (expressions []* object.Expression , req * http.Request ) (bool , string , string , error )
25+ checkRule (expressions []* object.Expression , req * http.Request ) (* RuleResult , error )
2626}
2727
28- type ActionResult struct {
29- Type string
28+ type RuleResult struct {
29+ Action string
3030 StatusCode int
31+ Reason string
3132}
3233
33- func CheckRules (ruleIds []string , r * http.Request ) (* ActionResult , string , error ) {
34+ func CheckRules (ruleIds []string , r * http.Request ) (* RuleResult , error ) {
3435 rules , err := object .GetRulesByRuleIds (ruleIds )
3536 if err != nil {
36- return nil , "" , err
37+ return nil , err
3738 }
3839 for i , rule := range rules {
3940 var ruleObj Rule
@@ -51,63 +52,57 @@ func CheckRules(ruleIds []string, r *http.Request) (*ActionResult, string, error
5152 case "Compound" :
5253 ruleObj = & CompoundRule {}
5354 default :
54- return nil , "" , fmt .Errorf ("unknown rule type: %s for rule: %s" , rule .Type , rule .GetId ())
55+ return nil , fmt .Errorf ("unknown rule type: %s for rule: %s" , rule .Type , rule .GetId ())
5556 }
5657
57- isHit , action , reason , err := ruleObj .checkRule (rule .Expressions , r )
58+ result , err := ruleObj .checkRule (rule .Expressions , r )
5859 if err != nil {
59- return nil , "" , err
60+ return nil , err
6061 }
6162
62- // Use rule's action if no action specified by the rule check
63- if action == "" {
64- action = rule .Action
65- }
66-
67- // Determine status code
68- statusCode := rule .StatusCode
69- if statusCode == 0 {
70- // Set default status codes if not specified
71- switch action {
72- case "Block" :
73- statusCode = 403
74- case "Drop" :
75- statusCode = 400
76- case "Allow" :
77- statusCode = 200
78- case "CAPTCHA" :
79- statusCode = 302
80- default :
81- return nil , "" , fmt .Errorf ("unknown rule action: %s for rule: %s" , action , rule .GetId ())
63+ if result != nil {
64+ // Use rule's action if no action specified by the rule check
65+ if result .Action == "" {
66+ result .Action = rule .Action
8267 }
83- }
84-
85- actionResult := & ActionResult {
86- Type : action ,
87- StatusCode : statusCode ,
88- }
89-
90- if isHit {
91- if action == "Block" || action == "Drop" {
92- if rule .Reason != "" {
93- reason = rule .Reason
68+
69+ // Determine status code
70+ if result .StatusCode == 0 {
71+ if rule .StatusCode != 0 {
72+ result .StatusCode = rule .StatusCode
9473 } else {
95- reason = fmt .Sprintf ("hit rule %s: %s" , ruleIds [i ], reason )
74+ // Set default status codes if not specified
75+ switch result .Action {
76+ case "Block" :
77+ result .StatusCode = 403
78+ case "Drop" :
79+ result .StatusCode = 400
80+ case "Allow" :
81+ result .StatusCode = 200
82+ case "CAPTCHA" :
83+ result .StatusCode = 302
84+ default :
85+ return nil , fmt .Errorf ("unknown rule action: %s for rule: %s" , result .Action , rule .GetId ())
86+ }
87+ }
88+ }
89+
90+ // Update reason if rule has custom reason
91+ if result .Action == "Block" || result .Action == "Drop" {
92+ if rule .Reason != "" {
93+ result .Reason = rule .Reason
94+ } else if result .Reason != "" {
95+ result .Reason = fmt .Sprintf ("hit rule %s: %s" , ruleIds [i ], result .Reason )
9696 }
97- return actionResult , reason , nil
98- } else if action == "Allow" {
99- return actionResult , reason , nil
100- } else if action == "CAPTCHA" {
101- return actionResult , reason , nil
102- } else {
103- return nil , "" , fmt .Errorf ("unknown rule action: %s for rule: %s" , action , rule .GetId ())
10497 }
98+
99+ return result , nil
105100 }
106101 }
107102
108103 // Default action if no rule matched
109- return & ActionResult {
110- Type : "Allow" ,
104+ return & RuleResult {
105+ Action : "Allow" ,
111106 StatusCode : 200 ,
112- }, "" , nil
107+ }, nil
113108}
0 commit comments