lib/webmock/response.rb in webmock-0.9.1 vs lib/webmock/response.rb in webmock-1.0.0
- old
+ new
@@ -2,83 +2,139 @@
class StringIO
alias_method :read_nonblock, :sysread
end
module WebMock
+
+ class ResponseFactory
+ def self.response_for(options)
+ if options.respond_to?(:call)
+ WebMock::DynamicResponse.new(options)
+ else
+ WebMock::Response.new(options)
+ end
+ end
+ end
class Response
- attr_reader :options
-
def initialize(options = {})
- if options.is_a?(IO) || options.is_a?(String)
- self.options = read_raw_response(options)
- else
- self.options = options
+ if options.is_a?(IO) || options.is_a?(String)
+ self.options = read_raw_response(options)
+ else
+ self.options = options
end
- @options[:headers] = Util::Headers.normalize_headers(@options[:headers]) unless @options[:headers].is_a?(Proc)
end
def headers
- @options[:headers]
+ @headers
end
+
+ def headers=(headers)
+ @headers = headers
+ if @headers && !@headers.is_a?(Proc)
+ @headers = Util::Headers.normalize_headers(@headers)
+ end
+ end
def body
- return '' unless @options.has_key?(:body)
+ @body || ''
+ end
+
+ def body=(body)
+ @body = body
stringify_body!
- @options[:body]
end
def status
- @options.has_key?(:status) ? @options[:status] : 200
+ @status || [200, ""]
end
+ def status=(status)
+ @status = status.is_a?(Integer) ? [status, ""] : status
+ end
+
+ def exception
+ @exception
+ end
+
def raise_error_if_any
- raise @options[:exception].new('Exception from WebMock') if @options.has_key?(:exception)
+ raise @exception.new('Exception from WebMock') if @exception
end
+ def should_timeout
+ @should_timeout == true
+ end
+
def options=(options)
- @options = options
- stringify_body!
+ self.headers = options[:headers]
+ self.status = options[:status]
+ self.body = options[:body]
+ @exception = options[:exception]
+ @should_timeout = options[:should_timeout]
end
- def dup
- dup_response = super
- dup_response.options = options.dup
- dup_response
+ 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 ==(other)
- options == other.options
+ self.body == other.body &&
+ self.headers === other.headers &&
+ self.status == other.status &&
+ self.exception == other.exception &&
+ self.should_timeout == other.should_timeout
end
-
- private
+ private
+
def stringify_body!
- if @options[:body].is_a?(IO)
- io = @options[:body]
- @options[:body] = io.read
+ if @body.is_a?(IO)
+ io = @body
+ @body = io.read
io.close
end
end
-
+
def read_raw_response(raw_response)
if raw_response.is_a?(IO)
- string = raw_response.read
+ string = raw_response.read
raw_response.close
raw_response = string
- end
- socket = Net::BufferedIO.new(raw_response)
+ 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
- options
+ options[:status] = [response.code.to_i, response.message]
+ options
end
+ end
+
+ class DynamicResponse < Response
+ attr_accessor :responder
+
+ def initialize(responder)
+ @responder = responder
+ end
+
+ def dup
+ self.class.new(@responder)
+ end
+
+ def evaluate!(request_signature)
+ self.options = @responder.call(request_signature)
+ self
+ end
end
end