@@ -48,15 +48,15 @@ type appsecEnvoyExternalProcessorServer struct {
48
48
envoyextproc.ExternalProcessorServer
49
49
config AppsecEnvoyConfig
50
50
requestCounter atomic.Uint32
51
- messageProcessor proxy.Processor [envoyextproc. ProcessingResponse ]
51
+ messageProcessor proxy.Processor
52
52
}
53
53
54
54
// AppsecEnvoyExternalProcessorServer creates a new external processor server with AAP enabled
55
55
func AppsecEnvoyExternalProcessorServer (userImplementation envoyextproc.ExternalProcessorServer , config AppsecEnvoyConfig ) envoyextproc.ExternalProcessorServer {
56
56
processor := & appsecEnvoyExternalProcessorServer {
57
57
ExternalProcessorServer : userImplementation ,
58
58
config : config ,
59
- messageProcessor : proxy .NewProcessor [envoyextproc. ProcessingResponse ] (proxy.ProcessorConfig [envoyextproc. ProcessingResponse ] {
59
+ messageProcessor : proxy .NewProcessor (proxy.ProcessorConfig {
60
60
BlockingUnavailable : config .BlockingUnavailable ,
61
61
BodyParsingSizeLimit : config .BodyParsingSizeLimit ,
62
62
Framework : "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" ,
@@ -76,10 +76,14 @@ func AppsecEnvoyExternalProcessorServer(userImplementation envoyextproc.External
76
76
return processor
77
77
}
78
78
79
+ type processServerKeyType struct {}
80
+
81
+ var processServerKey processServerKeyType
82
+
79
83
// Process handles the bidirectional stream that Envoy uses to control the filter
80
84
func (s * appsecEnvoyExternalProcessorServer ) Process (processServer envoyextproc.ExternalProcessor_ProcessServer ) error {
81
85
var (
82
- ctx = processServer .Context ()
86
+ ctx = context . WithValue ( processServer .Context (), processServerKey , processServer )
83
87
currentRequest proxy.RequestState
84
88
)
85
89
@@ -92,7 +96,7 @@ func (s *appsecEnvoyExternalProcessorServer) Process(processServer envoyextproc.
92
96
}()
93
97
94
98
for {
95
- if err := s .checkContext (ctx ); err != nil {
99
+ if err := s .checkContext (processServer . Context () ); err != nil {
96
100
return err
97
101
}
98
102
@@ -102,18 +106,12 @@ func (s *appsecEnvoyExternalProcessorServer) Process(processServer envoyextproc.
102
106
}
103
107
104
108
// Process the message
105
- processingResponse , err := s .processMessage (ctx , & processingRequest , & currentRequest )
109
+ err := s .processMessage (ctx , & processingRequest , & currentRequest )
106
110
if err != nil && err != io .EOF {
107
111
instr .Logger ().Error ("external_processing: error processing request: %s\n " , err .Error ())
108
112
return err
109
113
}
110
114
111
- if processingResponse != nil {
112
- if err := s .sendResponse (processServer , processingResponse ); err != nil {
113
- return err
114
- }
115
- }
116
-
117
115
if err == io .EOF {
118
116
return nil
119
117
}
@@ -144,11 +142,11 @@ func (s *appsecEnvoyExternalProcessorServer) handleReceiveError(err error) error
144
142
}
145
143
146
144
// processMessage processes a single message based on its type
147
- func (s * appsecEnvoyExternalProcessorServer ) processMessage (ctx context.Context , req * envoyextproc.ProcessingRequest , currentRequest * proxy.RequestState ) (action * envoyextproc. ProcessingResponse , err error ) {
145
+ func (s * appsecEnvoyExternalProcessorServer ) processMessage (ctx context.Context , req * envoyextproc.ProcessingRequest , currentRequest * proxy.RequestState ) (err error ) {
148
146
switch v := req .Request .(type ) {
149
147
case * envoyextproc.ProcessingRequest_RequestHeaders :
150
- * currentRequest , action , err = s .messageProcessor .OnRequestHeaders (ctx , & messageRequestHeaders {ProcessingRequest : req , HttpHeaders : req .GetRequestHeaders (), integration : s .config .Integration })
151
- return action , err
148
+ * currentRequest , err = s .messageProcessor .OnRequestHeaders (ctx , & messageRequestHeaders {ProcessingRequest : req , HttpHeaders : req .GetRequestHeaders (), integration : s .config .Integration })
149
+ return err
152
150
153
151
case * envoyextproc.ProcessingRequest_RequestBody :
154
152
return s .messageProcessor .OnRequestBody (& messageBody {ProcessingRequest : req , HttpBody : req .GetRequestBody ()}, currentRequest )
@@ -158,7 +156,7 @@ func (s *appsecEnvoyExternalProcessorServer) processMessage(ctx context.Context,
158
156
// Handle case where request headers were never sent
159
157
instr .Logger ().Warn ("external_processing: can't process the response: envoy never sent the beginning of the request, this is a known issue" +
160
158
" and can happen when a malformed request is sent to Envoy where the header Host is missing. See link to issue https://github.com/envoyproxy/envoy/issues/38022" )
161
- return nil , status .Errorf (codes .InvalidArgument , "Error processing response headers from ext_proc: can't process the response" )
159
+ return status .Errorf (codes .InvalidArgument , "Error processing response headers from ext_proc: can't process the response" )
162
160
}
163
161
return s .messageProcessor .OnResponseHeaders (& responseHeadersEnvoy {ProcessingRequest : req , HttpHeaders : req .GetResponseHeaders ()}, currentRequest )
164
162
@@ -172,18 +170,6 @@ func (s *appsecEnvoyExternalProcessorServer) processMessage(ctx context.Context,
172
170
return s .messageProcessor .OnResponseTrailers (currentRequest )
173
171
174
172
default :
175
- return nil , status .Errorf (codes .Unknown , "Unknown request type: %T" , v )
173
+ return status .Errorf (codes .Unknown , "Unknown request type: %T" , v )
176
174
}
177
175
}
178
-
179
- // sendResponse sends a processing response back to Envoy
180
- func (s * appsecEnvoyExternalProcessorServer ) sendResponse (processServer envoyextproc.ExternalProcessor_ProcessServer , response * envoyextproc.ProcessingResponse ) error {
181
- instr .Logger ().Debug ("external_processing: sending response: %v\n " , response )
182
-
183
- if err := processServer .SendMsg (response ); err != nil {
184
- instr .Logger ().Error ("external_processing: error sending response (probably because of an Envoy timeout): %s" , err .Error ())
185
- return status .Errorf (codes .Unknown , "Error sending response (probably because of an Envoy timeout): %s" , err .Error ())
186
- }
187
-
188
- return nil
189
- }
0 commit comments