class WebMock::Response

def ==(other)

def ==(other)
  self.body == other.body &&
    self.headers === other.headers &&
    self.status == other.status &&
    self.exception == other.exception &&
    self.should_timeout == other.should_timeout
end

def assert_valid_body!

def assert_valid_body!
  valid_types = [Proc, IO, Pathname, String, Array]
  return if @body.nil?
  return if valid_types.any? { |c| @body.is_a?(c) }
  if @body.is_a?(Hash)
    raise InvalidBody, "must be one of: #{valid_types}, but you've used a #{@body.class}. " \
      "Please convert it by calling .to_json .to_xml, or otherwise convert it to a string."
  else
    raise InvalidBody, "must be one of: #{valid_types}. '#{@body.class}' given."
  end
end

def body

def body
  @body || String.new("")
end

def body=(body)

def body=(body)
  @body = body
  assert_valid_body!
  stringify_body!
end

def evaluate(request_signature)

def evaluate(request_signature)
  self.body = @body.call(request_signature) if @body.is_a?(Proc)
  self.headers = @headers.call(request_signature) if @headers.is_a?(Proc)
  self.status = @status.call(request_signature) if @status.is_a?(Proc)
  @should_timeout = @should_timeout.call(request_signature) if @should_timeout.is_a?(Proc)
  @exception = @exception.call(request_signature) if @exception.is_a?(Proc)
  self
end

def exception

def exception
  @exception
end

def exception=(exception)

def exception=(exception)
  @exception = case exception
  when String then StandardError.new(exception)
  when Class then exception.new('Exception from WebMock')
  when Exception then exception
  end
end

def headers

def headers
  @headers
end

def headers=(headers)

def headers=(headers)
  @headers = headers
  if @headers && !@headers.is_a?(Proc)
    @headers = Util::Headers.normalize_headers(@headers)
  end
end

def initialize(options = {})

def initialize(options = {})
  case options
  when IO, StringIO
    self.options = read_raw_response(options)
  when String
    self.options = read_raw_response(StringIO.new(options))
  else
    self.options = options
  end
end

def options=(options)

def options=(options)
  options = WebMock::Util::HashKeysStringifier.stringify_keys!(options)
  HashValidator.new(options).validate_keys('headers', 'status', 'body', 'exception', 'should_timeout')
  self.headers = options['headers']
  self.status = options['status']
  self.body = options['body']
  self.exception = options['exception']
  @should_timeout = options['should_timeout']
end

def raise_error_if_any

def raise_error_if_any
  raise @exception if @exception
end

def read_raw_response(io)

def read_raw_response(io)
  socket = ::Net::BufferedIO.new(io)
  response = ::Net::HTTPResponse.read_new(socket)
  transfer_encoding = response.delete('transfer-encoding') #chunks were already read by curl
  response.reading_body(socket, true) {}
  options = {}
  options[:headers] = {}
  response.each_header {|name, value| options[:headers][name] = value}
  options[:headers]['transfer-encoding'] = transfer_encoding if transfer_encoding
  options[:body] = response.read_body
  options[:status] = [response.code.to_i, response.message]
  options
ensure
  socket.close
end

def should_timeout

def should_timeout
  @should_timeout == true
end

def status

def status
  @status || [200, ""]
end

def status=(status)

def status=(status)
  @status = status.is_a?(Integer) ? [status, ""] : status
end

def stringify_body!

def stringify_body!
  if @body.is_a?(IO) || @body.is_a?(Pathname)
    io = @body
    @body = io.read
    io.close if io.respond_to?(:close)
  end
end