class HTTP::Request::Body

Represents an HTTP request body with streaming support

def ==(other)

Other tags:
    Api: - public

Returns:
  • (Boolean) -
def ==(other)
  other.is_a?(self.class) && source == other.source
end

def each(&block)

Other tags:
    Api: - public

Returns:
  • (self) -

Other tags:
    Yieldparam: -
def each(&block)
  if @source.is_a?(String)
    yield @source
  elsif @source.respond_to?(:read)
    IO.copy_stream(@source, ProcIO.new(block))
    rewind(@source)
  elsif @source
    @source.each(&block)
  end
  self
end

def empty?

Other tags:
    Api: - public

Returns:
  • (Boolean) -
def empty?
  @source.nil?
end

def initialize(source)

Other tags:
    Api: - public

Returns:
  • (HTTP::Request::Body) -
def initialize(source)
  @source = source
  validate_source_type!
end

def loggable?

Other tags:
    Api: - public

Returns:
  • (Boolean) -
def loggable?
  @source.is_a?(String)
end

def rewind(io)

Other tags:
    Api: - private

Returns:
  • (void) -
def rewind(io)
  io.rewind if io.respond_to? :rewind
rescue Errno::ESPIPE, Errno::EPIPE
  # Pipe IOs respond to `:rewind` but fail when you call it.
  #
  # Calling `IO#rewind` on a pipe, fails with *ESPIPE* on MRI,
  # but *EPIPE* on jRuby.
  #
  # - **ESPIPE** -- "Illegal seek."
  #   Invalid seek operation (such as on a pipe).
  #
  # - **EPIPE** -- "Broken pipe."
  #   There is no process reading from the other end of a pipe. Every
  #   library function that returns this error code also generates
  #   a SIGPIPE signal; this signal terminates the program if not handled
  #   or blocked. Thus, your program will never actually see EPIPE unless
  #   it has handled or blocked SIGPIPE.
  #
  # See: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html
  nil
end

def size

Other tags:
    Api: - public

Returns:
  • (Integer) -
def size
  if @source.is_a?(String)
    @source.bytesize
  elsif @source.respond_to?(:read)
    raise RequestError, "IO object must respond to #size" unless @source.respond_to?(:size)
    @source.size
  elsif @source.nil?
    0
  else
    raise RequestError,
          "cannot determine size of body: #{@source.inspect}; " \
          "set the Content-Length header explicitly or use chunked Transfer-Encoding"
  end
end

def validate_source_type!

Other tags:
    Api: - private

Returns:
  • (void) -
def validate_source_type!
  return if @source.is_a?(String)
  return if @source.respond_to?(:read)
  return if @source.is_a?(Enumerable)
  return if @source.nil?
  raise RequestError, "body of wrong type: #{@source.class}"
end