code: func DebugRequestMiddleware(handler func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error) func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  	return func(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
  		logrus.Debugf("Calling %s %s", r.Method, r.RequestURI)
  
  		if r.Method != "POST" {
  			return handler(ctx, w, r, vars)
  		}
  		if err := httputils.CheckForJSON(r); err != nil {
  			return handler(ctx, w, r, vars)
  		}
  		maxBodySize := 4096 // 4KB
  		if r.ContentLength > int64(maxBodySize) {
  			return handler(ctx, w, r, vars)
  		}
  
  		body := r.Body
  		bufReader := bufio.NewReaderSize(body, maxBodySize)
  		r.Body = ioutils.NewReadCloserWrapper(bufReader, func() error { return body.Close() })
  
  		b, err := bufReader.Peek(maxBodySize)
  		if err != io.EOF {
  			// either there was an error reading, or the buffer is full (in which case the request is too large)
  			return handler(ctx, w, r, vars)
  		}
  
  		var postForm map[string]interface{}
  		if err := json.Unmarshal(b, &postForm); err == nil {
  			maskSecretKeys(postForm, r.RequestURI)
  			formStr, errMarshal := json.Marshal(postForm)
  			if errMarshal == nil {
  				logrus.Debugf("form data: %s", string(formStr))
  			} else {
  				logrus.Debugf("form data: %q", postForm)
  			}
  		}
  
  		return handler(ctx, w, r, vars)
  	}
  }
docs: // DebugRequestMiddleware dumps the request to logger