def content_hash
      return @content_hash if @content_hash

      if SIGN_FULL_BODY
        @content_hash = hash(@body || '').chomp
      else
        if @body.is_a?(Multipart::MultiIO)
          filepart = @body.ios.find { |io| io.is_a?(Multipart::MultiIO) }
          file     = filepart.ios.find { |io| !io.is_a?(StringIO) }

          @content_hash = hash(file).chomp
        else
          @content_hash = hash(@body || '').chomp
        end
      end

      @content_hash
    end
def content_hash
      return @content_hash if @content_hash

      if SIGN_FULL_BODY
        @content_hash = hash(@body || '').chomp
      else
        if @body.is_a?(Multipart::MultiIO)
          filepart = @body.ios.find { |io| io.is_a?(Multipart::MultiIO) }
          file     = filepart.ios.find { |io| !io.is_a?(StringIO) }

          @content_hash = hash(file).chomp
        else
          @content_hash = hash(@body || '').chomp
        end
      end

      @content_hash
    end
The canonical body. This could be an IO object (such as +#body_stream+),
 an actual string (such as +#body+), or just the empty string if the
 request's body and stream was nil.

 @return [String, IO]