4
4
"context"
5
5
"fmt"
6
6
"net/http"
7
- "regexp"
8
7
9
8
"github.com/tomMoulard/htransformation/pkg/handler/deleter"
10
9
"github.com/tomMoulard/htransformation/pkg/handler/join"
@@ -16,10 +15,9 @@ import (
16
15
17
16
// HeadersTransformation holds the necessary components of a Traefik plugin.
18
17
type HeadersTransformation struct {
19
- name string
20
- next http.Handler
21
- rules []types.Rule
22
- ruleHandlers map [types.RuleType ]func (http.ResponseWriter , * http.Request , types.Rule )
18
+ name string
19
+ next http.Handler
20
+ handlers []types.Handler
23
21
}
24
22
25
23
// Config holds configuration to be passed to the plugin.
@@ -36,64 +34,46 @@ func CreateConfig() *Config {
36
34
37
35
// New instantiates and returns the required components used to handle an HTTP request.
38
36
func New (_ context.Context , next http.Handler , config * Config , name string ) (http.Handler , error ) {
39
- ruleHandlers := map [types.RuleType ]func (http. ResponseWriter , * http. Request , types. Rule ){
40
- types .Delete : deleter .Handle ,
41
- types .Join : join .Handle ,
42
- types .Rename : rename .Handle ,
43
- types .RewriteValueRule : rewrite .Handle ,
44
- types .Set : set .Handle ,
37
+ handlerBuilder := map [types.RuleType ]func (types. Rule ) (types. Handler , error ){
38
+ types .Delete : deleter .New ,
39
+ types .Join : join .New ,
40
+ types .Rename : rename .New ,
41
+ types .RewriteValueRule : rewrite .New ,
42
+ types .Set : set .New ,
45
43
}
46
44
47
- validateRules := map [types.RuleType ]func (types.Rule ) error {
48
- types .Delete : deleter .Validate ,
49
- types .Join : join .Validate ,
50
- types .Rename : rename .Validate ,
51
- types .RewriteValueRule : rewrite .Validate ,
52
- types .Set : set .Validate ,
53
- }
45
+ handlers := make ([]types.Handler , 0 , len (config .Rules ))
54
46
55
- for i , rule := range config .Rules {
56
- if _ , ok := ruleHandlers [rule .Type ]; ! ok {
47
+ for _ , rule := range config .Rules {
48
+ newHandler , ok := handlerBuilder [rule .Type ]
49
+ if ! ok {
57
50
return nil , fmt .Errorf ("%w: %s" , types .ErrInvalidRuleType , rule .Name )
58
51
}
59
52
60
- validate , ok := validateRules [ rule . Type ]
61
- if ! ok {
62
- continue
53
+ h , err := newHandler ( rule )
54
+ if err != nil {
55
+ return nil , fmt . Errorf ( "%w: %s" , err , rule . Name )
63
56
}
64
57
65
- if err := validate ( rule ); err != nil {
58
+ if err := h . Validate ( ); err != nil {
66
59
return nil , fmt .Errorf ("%w: %s" , err , rule .Name )
67
60
}
68
61
69
- if rule .Type == types .Rename || rule .Type == types .RewriteValueRule {
70
- re , err := regexp .Compile (rule .Header )
71
- if err != nil { // must be validated before
72
- return nil , fmt .Errorf ("%w: %s" , types .ErrInvalidRegexp , rule .Name )
73
- }
74
-
75
- config .Rules [i ].Regexp = re
76
- }
62
+ handlers = append (handlers , h )
77
63
}
78
64
79
65
return & HeadersTransformation {
80
- name : name ,
81
- next : next ,
82
- rules : config .Rules ,
83
- ruleHandlers : ruleHandlers ,
66
+ name : name ,
67
+ next : next ,
68
+ handlers : handlers ,
84
69
}, nil
85
70
}
86
71
87
72
// Iterate over every header to match the ones specified in the config and
88
73
// return nothing if regexp failed.
89
74
func (u * HeadersTransformation ) ServeHTTP (responseWriter http.ResponseWriter , request * http.Request ) {
90
- for _ , rule := range u .rules {
91
- ruleHandler , ok := u .ruleHandlers [rule .Type ]
92
- if ! ok {
93
- continue
94
- }
95
-
96
- ruleHandler (responseWriter , request , rule )
75
+ for _ , handler := range u .handlers {
76
+ handler .Handle (responseWriter , request )
97
77
}
98
78
99
79
u .next .ServeHTTP (responseWriter , request )
0 commit comments