Skip to content

Commit 055c27c

Browse files
authored
Fix: only build middleware chain once (#1437)
1 parent e1a0384 commit 055c27c

File tree

1 file changed

+23
-43
lines changed

1 file changed

+23
-43
lines changed

backend/handler_middleware.go

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package backend
33
import (
44
"context"
55
"errors"
6-
"slices"
76
)
87

98
var (
@@ -30,8 +29,7 @@ func (fn HandlerMiddlewareFunc) CreateHandlerMiddleware(next Handler) Handler {
3029

3130
// MiddlewareHandler decorates a Handler with HandlerMiddleware's.
3231
type MiddlewareHandler struct {
33-
middlewares []HandlerMiddleware
34-
finalHandler Handler
32+
handler Handler
3533
}
3634

3735
// HandlerFromMiddlewares creates a new MiddlewareHandler implementing Handler that decorates finalHandler with middlewares.
@@ -41,8 +39,7 @@ func HandlerFromMiddlewares(finalHandler Handler, middlewares ...HandlerMiddlewa
4139
}
4240

4341
return &MiddlewareHandler{
44-
middlewares: middlewares,
45-
finalHandler: finalHandler,
42+
handler: handlerFromMiddlewares(middlewares, finalHandler),
4643
}, nil
4744
}
4845

@@ -62,11 +59,10 @@ func (h *MiddlewareHandler) QueryData(ctx context.Context, req *QueryDataRequest
6259
}
6360

6461
ctx = h.setupContext(ctx, req.PluginContext, EndpointQueryData)
65-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
66-
return handler.QueryData(ctx, req)
62+
return h.handler.QueryData(ctx, req)
6763
}
6864

69-
func (h MiddlewareHandler) CallResource(ctx context.Context, req *CallResourceRequest, sender CallResourceResponseSender) error {
65+
func (h *MiddlewareHandler) CallResource(ctx context.Context, req *CallResourceRequest, sender CallResourceResponseSender) error {
7066
if req == nil {
7167
return errNilRequest
7268
}
@@ -76,51 +72,46 @@ func (h MiddlewareHandler) CallResource(ctx context.Context, req *CallResourceRe
7672
}
7773

7874
ctx = h.setupContext(ctx, req.PluginContext, EndpointCallResource)
79-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
80-
return handler.CallResource(ctx, req, sender)
75+
return h.handler.CallResource(ctx, req, sender)
8176
}
8277

83-
func (h MiddlewareHandler) CollectMetrics(ctx context.Context, req *CollectMetricsRequest) (*CollectMetricsResult, error) {
78+
func (h *MiddlewareHandler) CollectMetrics(ctx context.Context, req *CollectMetricsRequest) (*CollectMetricsResult, error) {
8479
if req == nil {
8580
return nil, errNilRequest
8681
}
8782

8883
ctx = h.setupContext(ctx, req.PluginContext, EndpointCollectMetrics)
89-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
90-
return handler.CollectMetrics(ctx, req)
84+
return h.handler.CollectMetrics(ctx, req)
9185
}
9286

93-
func (h MiddlewareHandler) CheckHealth(ctx context.Context, req *CheckHealthRequest) (*CheckHealthResult, error) {
87+
func (h *MiddlewareHandler) CheckHealth(ctx context.Context, req *CheckHealthRequest) (*CheckHealthResult, error) {
9488
if req == nil {
9589
return nil, errNilRequest
9690
}
9791

9892
ctx = h.setupContext(ctx, req.PluginContext, EndpointCheckHealth)
99-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
100-
return handler.CheckHealth(ctx, req)
93+
return h.handler.CheckHealth(ctx, req)
10194
}
10295

103-
func (h MiddlewareHandler) SubscribeStream(ctx context.Context, req *SubscribeStreamRequest) (*SubscribeStreamResponse, error) {
96+
func (h *MiddlewareHandler) SubscribeStream(ctx context.Context, req *SubscribeStreamRequest) (*SubscribeStreamResponse, error) {
10497
if req == nil {
10598
return nil, errNilRequest
10699
}
107100

108101
ctx = h.setupContext(ctx, req.PluginContext, EndpointSubscribeStream)
109-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
110-
return handler.SubscribeStream(ctx, req)
102+
return h.handler.SubscribeStream(ctx, req)
111103
}
112104

113-
func (h MiddlewareHandler) PublishStream(ctx context.Context, req *PublishStreamRequest) (*PublishStreamResponse, error) {
105+
func (h *MiddlewareHandler) PublishStream(ctx context.Context, req *PublishStreamRequest) (*PublishStreamResponse, error) {
114106
if req == nil {
115107
return nil, errNilRequest
116108
}
117109

118110
ctx = h.setupContext(ctx, req.PluginContext, EndpointPublishStream)
119-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
120-
return handler.PublishStream(ctx, req)
111+
return h.handler.PublishStream(ctx, req)
121112
}
122113

123-
func (h MiddlewareHandler) RunStream(ctx context.Context, req *RunStreamRequest, sender *StreamSender) error {
114+
func (h *MiddlewareHandler) RunStream(ctx context.Context, req *RunStreamRequest, sender *StreamSender) error {
124115
if req == nil {
125116
return errNilRequest
126117
}
@@ -130,51 +121,40 @@ func (h MiddlewareHandler) RunStream(ctx context.Context, req *RunStreamRequest,
130121
}
131122

132123
ctx = h.setupContext(ctx, req.PluginContext, EndpointRunStream)
133-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
134-
return handler.RunStream(ctx, req, sender)
124+
return h.handler.RunStream(ctx, req, sender)
135125
}
136126

137-
func (h MiddlewareHandler) ValidateAdmission(ctx context.Context, req *AdmissionRequest) (*ValidationResponse, error) {
127+
func (h *MiddlewareHandler) ValidateAdmission(ctx context.Context, req *AdmissionRequest) (*ValidationResponse, error) {
138128
if req == nil {
139129
return nil, errNilRequest
140130
}
141131

142132
ctx = h.setupContext(ctx, req.PluginContext, EndpointValidateAdmission)
143-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
144-
return handler.ValidateAdmission(ctx, req)
133+
return h.handler.ValidateAdmission(ctx, req)
145134
}
146135

147-
func (h MiddlewareHandler) MutateAdmission(ctx context.Context, req *AdmissionRequest) (*MutationResponse, error) {
136+
func (h *MiddlewareHandler) MutateAdmission(ctx context.Context, req *AdmissionRequest) (*MutationResponse, error) {
148137
if req == nil {
149138
return nil, errNilRequest
150139
}
151140

152141
ctx = h.setupContext(ctx, req.PluginContext, EndpointMutateAdmission)
153-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
154-
return handler.MutateAdmission(ctx, req)
142+
return h.handler.MutateAdmission(ctx, req)
155143
}
156144

157-
func (h MiddlewareHandler) ConvertObjects(ctx context.Context, req *ConversionRequest) (*ConversionResponse, error) {
145+
func (h *MiddlewareHandler) ConvertObjects(ctx context.Context, req *ConversionRequest) (*ConversionResponse, error) {
158146
if req == nil {
159147
return nil, errNilRequest
160148
}
161149

162150
ctx = h.setupContext(ctx, req.PluginContext, EndpointConvertObjects)
163-
handler := handlerFromMiddlewares(h.middlewares, h.finalHandler)
164-
return handler.ConvertObjects(ctx, req)
151+
return h.handler.ConvertObjects(ctx, req)
165152
}
166153

167154
func handlerFromMiddlewares(middlewares []HandlerMiddleware, finalHandler Handler) Handler {
168-
if len(middlewares) == 0 {
169-
return finalHandler
170-
}
171-
172-
clonedMws := slices.Clone(middlewares)
173-
slices.Reverse(clonedMws)
174155
next := finalHandler
175-
176-
for _, m := range clonedMws {
177-
next = m.CreateHandlerMiddleware(next)
156+
for i := len(middlewares) - 1; i >= 0; i-- {
157+
next = middlewares[i].CreateHandlerMiddleware(next)
178158
}
179159

180160
return next

0 commit comments

Comments
 (0)