@@ -282,9 +282,11 @@ func (w *ResponseWriterWrapper) Finalize(c *gin.Context) error {
282282 hasAPIError := len (slicesAPIResponseError ) > 0 || finalStatusCode >= http .StatusBadRequest
283283 forceLog := w .logOnErrorOnly && hasAPIError && ! w .logger .IsEnabled ()
284284 websocketTimelineSource := w .extractWebsocketTimelineSource (c )
285+ apiRequestSource := w .extractAPIRequestSource (c )
286+ apiResponseSource := w .extractAPIResponseSource (c )
285287 apiWebsocketTimelineSource := w .extractAPIWebsocketTimelineSource (c )
286288 if ! w .logger .IsEnabled () && ! forceLog {
287- cleanupFileBodySources (websocketTimelineSource , apiWebsocketTimelineSource )
289+ cleanupFileBodySources (websocketTimelineSource , apiRequestSource , apiResponseSource , apiWebsocketTimelineSource )
288290 return nil
289291 }
290292
@@ -303,33 +305,63 @@ func (w *ResponseWriterWrapper) Finalize(c *gin.Context) error {
303305
304306 // Write API Request and Response to the streaming log before closing
305307 apiRequest := w .extractAPIRequest (c )
306- if len (apiRequest ) > 0 {
307- _ = w .streamWriter .WriteAPIRequest (apiRequest )
308- }
309308 apiResponse := w .extractAPIResponse (c )
310- if len (apiResponse ) > 0 {
311- _ = w .streamWriter .WriteAPIResponse (apiResponse )
309+ if sourceWriter , ok := w .streamWriter .(interface {
310+ WriteAPIRequestSource (* logging.FileBodySource ) error
311+ WriteAPIResponseSource (* logging.FileBodySource ) error
312+ }); ok {
313+ if len (apiRequest ) > 0 {
314+ _ = w .streamWriter .WriteAPIRequest (apiRequest )
315+ }
316+ if apiRequestSource != nil && apiRequestSource .HasPayload () {
317+ _ = sourceWriter .WriteAPIRequestSource (apiRequestSource )
318+ }
319+ if len (apiResponse ) > 0 {
320+ _ = w .streamWriter .WriteAPIResponse (apiResponse )
321+ }
322+ if apiResponseSource != nil && apiResponseSource .HasPayload () {
323+ _ = sourceWriter .WriteAPIResponseSource (apiResponseSource )
324+ }
325+ } else {
326+ var errMerge error
327+ apiRequest , errMerge = mergeFileBodySource (apiRequest , apiRequestSource )
328+ if errMerge != nil {
329+ cleanupFileBodySources (websocketTimelineSource , apiResponseSource , apiWebsocketTimelineSource )
330+ return errMerge
331+ }
332+ apiResponse , errMerge = mergeFileBodySource (apiResponse , apiResponseSource )
333+ if errMerge != nil {
334+ cleanupFileBodySources (websocketTimelineSource , apiWebsocketTimelineSource )
335+ return errMerge
336+ }
337+ if len (apiRequest ) > 0 {
338+ _ = w .streamWriter .WriteAPIRequest (apiRequest )
339+ }
340+ if len (apiResponse ) > 0 {
341+ _ = w .streamWriter .WriteAPIResponse (apiResponse )
342+ }
312343 }
313344 apiWebsocketTimeline := w .extractAPIWebsocketTimeline (c )
314345 var errMerge error
315346 apiWebsocketTimeline , errMerge = mergeFileBodySource (apiWebsocketTimeline , apiWebsocketTimelineSource )
316347 if errMerge != nil {
317- cleanupFileBodySources (websocketTimelineSource )
348+ cleanupFileBodySources (websocketTimelineSource , apiRequestSource , apiResponseSource )
318349 return errMerge
319350 }
320- cleanupFileBodySources (websocketTimelineSource )
321351 if len (apiWebsocketTimeline ) > 0 {
322352 _ = w .streamWriter .WriteAPIWebsocketTimeline (apiWebsocketTimeline )
323353 }
324354 if err := w .streamWriter .Close (); err != nil {
325355 w .streamWriter = nil
356+ cleanupFileBodySources (websocketTimelineSource , apiRequestSource , apiResponseSource )
326357 return err
327358 }
328359 w .streamWriter = nil
360+ cleanupFileBodySources (websocketTimelineSource , apiRequestSource , apiResponseSource )
329361 return nil
330362 }
331363
332- return w .logRequest (w .extractRequestBody (c ), finalStatusCode , w .cloneHeaders (), w .extractResponseBody (c ), w .extractWebsocketTimeline (c ), websocketTimelineSource , w .extractAPIRequest (c ), w .extractAPIResponse (c ), w .extractAPIWebsocketTimeline (c ), apiWebsocketTimelineSource , w .extractAPIResponseTimestamp (c ), slicesAPIResponseError , forceLog )
364+ return w .logRequest (w .extractRequestBody (c ), finalStatusCode , w .cloneHeaders (), w .extractResponseBody (c ), w .extractWebsocketTimeline (c ), websocketTimelineSource , w .extractAPIRequest (c ), apiRequestSource , w .extractAPIResponse (c ), apiResponseSource , w .extractAPIWebsocketTimeline (c ), apiWebsocketTimelineSource , w .extractAPIResponseTimestamp (c ), slicesAPIResponseError , forceLog )
333365}
334366
335367func (w * ResponseWriterWrapper ) cloneHeaders () map [string ][]string {
@@ -369,6 +401,14 @@ func (w *ResponseWriterWrapper) extractAPIResponse(c *gin.Context) []byte {
369401 return data
370402}
371403
404+ func (w * ResponseWriterWrapper ) extractAPIRequestSource (c * gin.Context ) * logging.FileBodySource {
405+ return extractFileBodySource (c , logging .APIRequestSourceContextKey )
406+ }
407+
408+ func (w * ResponseWriterWrapper ) extractAPIResponseSource (c * gin.Context ) * logging.FileBodySource {
409+ return extractFileBodySource (c , logging .APIResponseSourceContextKey )
410+ }
411+
372412func (w * ResponseWriterWrapper ) extractAPIWebsocketTimeline (c * gin.Context ) []byte {
373413 apiTimeline , isExist := c .Get ("API_WEBSOCKET_TIMELINE" )
374414 if ! isExist {
@@ -460,15 +500,53 @@ func extractBodyOverride(c *gin.Context, key string) []byte {
460500 return nil
461501}
462502
463- func (w * ResponseWriterWrapper ) logRequest (requestBody []byte , statusCode int , headers map [string ][]string , body , websocketTimeline []byte , websocketTimelineSource * logging.FileBodySource , apiRequestBody , apiResponseBody , apiWebsocketTimeline []byte , apiWebsocketTimelineSource * logging.FileBodySource , apiResponseTimestamp time.Time , apiResponseErrors []* interfaces.ErrorMessage , forceLog bool ) error {
503+ func (w * ResponseWriterWrapper ) logRequest (requestBody []byte , statusCode int , headers map [string ][]string , body , websocketTimeline []byte , websocketTimelineSource * logging.FileBodySource , apiRequestBody [] byte , apiRequestSource * logging. FileBodySource , apiResponseBody [] byte , apiResponseSource * logging. FileBodySource , apiWebsocketTimeline []byte , apiWebsocketTimelineSource * logging.FileBodySource , apiResponseTimestamp time.Time , apiResponseErrors []* interfaces.ErrorMessage , forceLog bool ) error {
464504 if w .requestInfo == nil {
465- cleanupFileBodySources (websocketTimelineSource , apiWebsocketTimelineSource )
505+ cleanupFileBodySources (websocketTimelineSource , apiRequestSource , apiResponseSource , apiWebsocketTimelineSource )
466506 return nil
467507 }
468508
509+ if loggerWithAllSources , ok := w .logger .(interface {
510+ LogRequestWithOptionsAndAllSources (string , string , map [string ][]string , []byte , int , map [string ][]string , []byte , []byte , * logging.FileBodySource , []byte , * logging.FileBodySource , []byte , * logging.FileBodySource , []byte , * logging.FileBodySource , []* interfaces.ErrorMessage , bool , string , time.Time , time.Time ) error
511+ }); ok {
512+ return loggerWithAllSources .LogRequestWithOptionsAndAllSources (
513+ w .requestInfo .URL ,
514+ w .requestInfo .Method ,
515+ w .requestInfo .Headers ,
516+ requestBody ,
517+ statusCode ,
518+ headers ,
519+ body ,
520+ websocketTimeline ,
521+ websocketTimelineSource ,
522+ apiRequestBody ,
523+ apiRequestSource ,
524+ apiResponseBody ,
525+ apiResponseSource ,
526+ apiWebsocketTimeline ,
527+ apiWebsocketTimelineSource ,
528+ apiResponseErrors ,
529+ forceLog ,
530+ w .requestInfo .RequestID ,
531+ w .requestInfo .Timestamp ,
532+ apiResponseTimestamp ,
533+ )
534+ }
535+
469536 if loggerWithSources , ok := w .logger .(interface {
470537 LogRequestWithOptionsAndSources (string , string , map [string ][]string , []byte , int , map [string ][]string , []byte , []byte , * logging.FileBodySource , []byte , []byte , []byte , * logging.FileBodySource , []* interfaces.ErrorMessage , bool , string , time.Time , time.Time ) error
471538 }); ok {
539+ var errMerge error
540+ apiRequestBody , errMerge = mergeFileBodySource (apiRequestBody , apiRequestSource )
541+ if errMerge != nil {
542+ cleanupFileBodySources (websocketTimelineSource , apiResponseSource , apiWebsocketTimelineSource )
543+ return errMerge
544+ }
545+ apiResponseBody , errMerge = mergeFileBodySource (apiResponseBody , apiResponseSource )
546+ if errMerge != nil {
547+ cleanupFileBodySources (websocketTimelineSource , apiWebsocketTimelineSource )
548+ return errMerge
549+ }
472550 return loggerWithSources .LogRequestWithOptionsAndSources (
473551 w .requestInfo .URL ,
474552 w .requestInfo .Method ,
@@ -493,6 +571,16 @@ func (w *ResponseWriterWrapper) logRequest(requestBody []byte, statusCode int, h
493571
494572 var errMerge error
495573 websocketTimeline , errMerge = mergeFileBodySource (websocketTimeline , websocketTimelineSource )
574+ if errMerge != nil {
575+ cleanupFileBodySources (apiRequestSource , apiResponseSource , apiWebsocketTimelineSource )
576+ return errMerge
577+ }
578+ apiRequestBody , errMerge = mergeFileBodySource (apiRequestBody , apiRequestSource )
579+ if errMerge != nil {
580+ cleanupFileBodySources (apiResponseSource , apiWebsocketTimelineSource )
581+ return errMerge
582+ }
583+ apiResponseBody , errMerge = mergeFileBodySource (apiResponseBody , apiResponseSource )
496584 if errMerge != nil {
497585 cleanupFileBodySources (apiWebsocketTimelineSource )
498586 return errMerge
0 commit comments