code.dwrz.net

Go monorepo.
Log | Files | Refs

middleware_http_logging.go (2085B)


      1 package http
      2 
      3 import (
      4 	"context"
      5 	"fmt"
      6 	"net/http/httputil"
      7 
      8 	"github.com/aws/smithy-go/logging"
      9 	"github.com/aws/smithy-go/middleware"
     10 )
     11 
     12 // RequestResponseLogger is a deserialize middleware that will log the request and response HTTP messages and optionally
     13 // their respective bodies. Will not perform any logging if none of the options are set.
     14 type RequestResponseLogger struct {
     15 	LogRequest         bool
     16 	LogRequestWithBody bool
     17 
     18 	LogResponse         bool
     19 	LogResponseWithBody bool
     20 }
     21 
     22 // ID is the middleware identifier.
     23 func (r *RequestResponseLogger) ID() string {
     24 	return "RequestResponseLogger"
     25 }
     26 
     27 // HandleDeserialize will log the request and response HTTP messages if configured accordingly.
     28 func (r *RequestResponseLogger) HandleDeserialize(
     29 	ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler,
     30 ) (
     31 	out middleware.DeserializeOutput, metadata middleware.Metadata, err error,
     32 ) {
     33 	logger := middleware.GetLogger(ctx)
     34 
     35 	if r.LogRequest || r.LogRequestWithBody {
     36 		smithyRequest, ok := in.Request.(*Request)
     37 		if !ok {
     38 			return out, metadata, fmt.Errorf("unknown transport type %T", in)
     39 		}
     40 
     41 		rc := smithyRequest.Build(ctx)
     42 		reqBytes, err := httputil.DumpRequestOut(rc, r.LogRequestWithBody)
     43 		if err != nil {
     44 			return out, metadata, err
     45 		}
     46 
     47 		logger.Logf(logging.Debug, "Request\n%v", string(reqBytes))
     48 
     49 		if r.LogRequestWithBody {
     50 			smithyRequest, err = smithyRequest.SetStream(rc.Body)
     51 			if err != nil {
     52 				return out, metadata, err
     53 			}
     54 			in.Request = smithyRequest
     55 		}
     56 	}
     57 
     58 	out, metadata, err = next.HandleDeserialize(ctx, in)
     59 
     60 	if (err == nil) && (r.LogResponse || r.LogResponseWithBody) {
     61 		smithyResponse, ok := out.RawResponse.(*Response)
     62 		if !ok {
     63 			return out, metadata, fmt.Errorf("unknown transport type %T", out.RawResponse)
     64 		}
     65 
     66 		respBytes, err := httputil.DumpResponse(smithyResponse.Response, r.LogResponseWithBody)
     67 		if err != nil {
     68 			return out, metadata, fmt.Errorf("failed to dump response %w", err)
     69 		}
     70 
     71 		logger.Logf(logging.Debug, "Response\n%v", string(respBytes))
     72 	}
     73 
     74 	return out, metadata, err
     75 }