class WebMock::Response

Constants

InvalidBody

Public Class Methods

new(options = {}) click to toggle source
# File lib/webmock/response.rb, line 16
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

Public Instance Methods

==(other) click to toggle source
# File lib/webmock/response.rb, line 95
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
body() click to toggle source
# File lib/webmock/response.rb, line 38
def body
  @body || ''
end
body=(body) click to toggle source
# File lib/webmock/response.rb, line 42
def body=(body)
  @body = body
  assert_valid_body!
  stringify_body!
end
evaluate(request_signature) click to toggle source
# File lib/webmock/response.rb, line 86
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
exception() click to toggle source
# File lib/webmock/response.rb, line 56
def exception
  @exception
end
exception=(exception) click to toggle source
# File lib/webmock/response.rb, line 60
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
headers() click to toggle source
# File lib/webmock/response.rb, line 27
def headers
  @headers
end
headers=(headers) click to toggle source
# File lib/webmock/response.rb, line 31
def headers=(headers)
  @headers = headers
  if @headers && !@headers.is_a?(Proc)
    @headers = Util::Headers.normalize_headers(@headers)
  end
end
options=(options) click to toggle source
# File lib/webmock/response.rb, line 76
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
raise_error_if_any() click to toggle source
# File lib/webmock/response.rb, line 68
def raise_error_if_any
  raise @exception if @exception
end
should_timeout() click to toggle source
# File lib/webmock/response.rb, line 72
def should_timeout
  @should_timeout == true
end
status() click to toggle source
# File lib/webmock/response.rb, line 48
def status
  @status || [200, ""]
end
status=(status) click to toggle source
# File lib/webmock/response.rb, line 52
def status=(status)
  @status = status.is_a?(Integer) ? [status, ""] : status
end

Private Instance Methods

assert_valid_body!() click to toggle source
# File lib/webmock/response.rb, line 113
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.class.is_a?(Hash)
    raise InvalidBody, "must be one of: #{valid_types}, but you've used a #{@body.class}' instead." \
      "\n What shall we encode it to? try calling .to_json .to_xml instead on the hash instead, or otherwise convert it to a string."
  else
    raise InvalidBody, "must be one of: #{valid_types}. '#{@body.class}' given"
  end
end
read_raw_response(io) click to toggle source
# File lib/webmock/response.rb, line 126
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
stringify_body!() click to toggle source
# File lib/webmock/response.rb, line 105
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