class WebMock::Response
Constants
- InvalidBody
Public Class Methods
new(options = {})
click to toggle source
# File lib/webmock/response.rb, line 16 def initialize(options = {}) if options.is_a?(IO) || options.is_a?(String) self.options = read_raw_response(options) else self.options = options end end
Public Instance Methods
==(other)
click to toggle source
# File lib/webmock/response.rb, line 92 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 35 def body @body || '' end
body=(body)
click to toggle source
# File lib/webmock/response.rb, line 39 def body=(body) @body = body assert_valid_body! stringify_body! end
evaluate(request_signature)
click to toggle source
# File lib/webmock/response.rb, line 83 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 53 def exception @exception end
exception=(exception)
click to toggle source
# File lib/webmock/response.rb, line 57 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 24 def headers @headers end
headers=(headers)
click to toggle source
# File lib/webmock/response.rb, line 28 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 73 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 65 def raise_error_if_any raise @exception if @exception end
should_timeout()
click to toggle source
# File lib/webmock/response.rb, line 69 def should_timeout @should_timeout == true end
status()
click to toggle source
# File lib/webmock/response.rb, line 45 def status @status || [200, ""] end
status=(status)
click to toggle source
# File lib/webmock/response.rb, line 49 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 110 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(raw_response)
click to toggle source
# File lib/webmock/response.rb, line 123 def read_raw_response(raw_response) if raw_response.is_a?(IO) string = raw_response.read raw_response.close raw_response = string end socket = ::Net::BufferedIO.new(raw_response) 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 end
stringify_body!()
click to toggle source
# File lib/webmock/response.rb, line 102 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