Sha256: 43d45b73508b7e80e0000664a49d7e20d649f91eabf935b7c3c4e72df4360419

Contents?: true

Size: 2 KB

Versions: 1

Compression:

Stored size: 2 KB

Contents

#compatibility with Ruby 1.9.2 preview1 to allow reading raw responses
class StringIO
  alias_method :read_nonblock, :sysread
end

module WebMock
  
  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
      end
      @options[:headers] = Util::Headers.normalize_headers(@options[:headers]) unless @options[:headers].is_a?(Proc)
    end

    def headers
      @options[:headers]
    end

    def body
      return '' unless @options.has_key?(:body)
      stringify_body!
      @options[:body]
    end

    def status
      @options.has_key?(:status) ? @options[:status] : 200
    end

    def raise_error_if_any
      raise @options[:exception].new('Exception from WebMock') if @options.has_key?(:exception)
    end

    def options=(options)
      @options = options
      stringify_body!
    end

    def dup
      dup_response = super
      dup_response.options = options.dup
      dup_response
    end

    def ==(other)
      options == other.options
    end
    
    private 

    def stringify_body!
      if @options[:body].is_a?(IO)
        io = @options[:body]
        @options[:body] = io.read
        io.close
      end
    end
    
    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      
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
webmock-0.9.0 lib/webmock/response.rb