Sha256: fc63c47588fffccc9840caf5462b20cadeb0e60c7abb01af3ccf8dcd3f8a503d

Contents?: true

Size: 1.35 KB

Versions: 4

Compression:

Stored size: 1.35 KB

Contents

module Smoke
  class Request # :nodoc:
    class Failure < Exception # :nodoc:
      attr_reader :uri
      
      def initialize(uri, msg)
        @uri = URI.parse(uri)
        Smoke.log.error "Smoke Request: Failed to get from #{@uri} (#{msg})"
      end
    end
    
    SUPPORTED_TYPES = %w(json xml javascript)
    attr_reader :uri, :content_type, :body, :type
       
    def initialize(uri, *options)
      @uri = uri
      @options = options
      dispatch
    end
    
    private
    def dispatch
      Thread.new {
        open(@uri, "User-Agent" => "Ruby/#{RUBY_VERSION}/Smoke") do |request|
          @content_type = request.content_type
          @body = request.read
        end
      }.join
      
      unless @options.include?(:raw_response)
        present!
      end
    rescue OpenURI::HTTPError => e
      Failure.new(@uri, e)
    end
    
    def present!
      set_type
      parse!
    end
    
    def set_type
      @type = (SUPPORTED_TYPES.detect{|t| @content_type =~ /#{t}/ } || "unknown").to_sym
    end
    
    def parse!
      case @type
        when :json, :javascript
          @body = ::Crack::JSON.parse(@body).symbolize_keys!
        when :xml
          @body = ::Crack::XML.parse(@body).symbolize_keys!
        when :unknown
          Smoke.log.warn "Smoke Request: Format unknown for #{@uri} (#{@content_type})"
      end      
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
benschwarz-smoke-0.2.4 lib/smoke/request.rb
benschwarz-smoke-0.3.4 lib/smoke/request.rb
benschwarz-smoke-0.3.5 lib/smoke/request.rb
benschwarz-smoke-0.3.6 lib/smoke/request.rb