@@ -192,15 +192,21 @@ func (s *StreamingServer) Process(srv extProcPb.ExternalProcessor_ProcessServer)
192
192
193
193
// Message is buffered, we can read and decode.
194
194
if v .ResponseBody .EndOfStream {
195
- err = decoder .Decode (& responseBody )
196
- if err != nil {
197
- logger .V (logutil .DEFAULT ).Error (err , "Error unmarshaling request body" )
195
+ // Don't send a 500 on a response error. Just let the message passthrough and log our error for debugging purposes.
196
+ // We assume the body is valid JSON, err messages are not guaranteed to be json, and so capturing and sending a 500 obfuscates the response message.
197
+ // using the standard 'err' var will send an immediate error response back to the caller.
198
+ var responseErr error
199
+ responseErr = decoder .Decode (& responseBody )
200
+ if responseErr != nil {
201
+ logger .V (logutil .DEFAULT ).Error (responseErr , "Error unmarshaling request body" )
198
202
}
199
203
// Body stream complete. Close the reader pipe.
200
204
reader .Close ()
201
205
202
- reqCtx , err = s .HandleResponseBody (ctx , reqCtx , responseBody )
203
- if err == nil && reqCtx .ResponseComplete {
206
+ reqCtx , responseErr = s .HandleResponseBody (ctx , reqCtx , responseBody )
207
+ if responseErr != nil {
208
+ logger .V (logutil .DEFAULT ).Error (responseErr , "Failed to process response body" , "request" , req )
209
+ } else if reqCtx .ResponseComplete {
204
210
reqCtx .ResponseCompleteTimestamp = time .Now ()
205
211
metrics .RecordRequestLatencies (ctx , reqCtx .Model , reqCtx .ResolvedTargetModel , reqCtx .RequestReceivedTimestamp , reqCtx .ResponseCompleteTimestamp )
206
212
metrics .RecordResponseSizes (reqCtx .Model , reqCtx .ResolvedTargetModel , reqCtx .ResponseSize )
0 commit comments