diff --git a/sdk/api/handlers/handlers.go b/sdk/api/handlers/handlers.go index f70a9dca..5a24c63a 100644 --- a/sdk/api/handlers/handlers.go +++ b/sdk/api/handlers/handlers.go @@ -618,28 +618,21 @@ func (h *BaseAPIHandler) WriteErrorResponse(c *gin.Context, msg *interfaces.Erro } body := BuildErrorResponseBody(status, errText) - // Check if this error was already recorded by the executor (to avoid duplicate logging) - // The executor logs raw error text, so match errText before falling back to the JSON body. - shouldAppend := true + // Append first to preserve upstream response logs, then drop duplicate payloads if already recorded. + var previous []byte if existing, exists := c.Get("API_RESPONSE"); exists { if existingBytes, ok := existing.([]byte); ok && len(existingBytes) > 0 { - trimmedErrText := strings.TrimSpace(errText) - if trimmedErrText != "" && bytes.Contains(existingBytes, []byte(trimmedErrText)) { - // Error already logged by executor, skip appending - shouldAppend = false - } else { - trimmedBody := bytes.TrimSpace(body) - if len(trimmedBody) > 0 && bytes.Contains(existingBytes, trimmedBody) { - // Error already logged by executor, skip appending - shouldAppend = false - } - } + previous = bytes.Clone(existingBytes) } } - if shouldAppend { - // Use appendAPIResponse to preserve any previously captured API response data - // (such as formatted upstream response logs from logging_helpers.go) - appendAPIResponse(c, body) + appendAPIResponse(c, body) + trimmedErrText := strings.TrimSpace(errText) + trimmedBody := bytes.TrimSpace(body) + if len(previous) > 0 { + if (trimmedErrText != "" && bytes.Contains(previous, []byte(trimmedErrText))) || + (len(trimmedBody) > 0 && bytes.Contains(previous, trimmedBody)) { + c.Set("API_RESPONSE", previous) + } } if !c.Writer.Written() {