Sha256: b6247b09f43772b6c5b4ef3a9e5e3d0f41e0a728f1bbfcd7e880709ca32ae3ef

Contents?: true

Size: 1.85 KB

Versions: 3

Compression:

Stored size: 1.85 KB

Contents

module Aitch
  class Response
    extend Forwardable

    def_delegators :@http_response, :content_type
    attr_accessor :redirected_from, :url

    def initialize(options, http_response)
      @options = options
      @http_response = http_response
    end

    ERRORS.each do |status_code, exception|
      method_name = Utils.underscore(exception.name.split("::").last).gsub("_error", "")

      define_method "#{method_name}?" do
        code == status_code
      end
    end

    def code
      @http_response.code.to_i
    end

    def body
      @body ||= Body.new(@http_response).to_s
    end

    def success?
      code >= 200 && code <= 399
    end
    alias_method :ok?, :success?

    def redirect?
      code >= 300 && code <= 399
    end

    def error?
      code >= 400 && code <= 599
    end

    def error
      error? && ERRORS.fetch(code)
    end

    def json?
      content_type =~ /json/
    end

    def xml?
      content_type =~ /xml/
    end

    def html?
      content_type =~ /html/
    end

    def data
      if json?
        @options[:json_parser].load(body)
      elsif xml?
        @options[:xml_parser].load(body)
      elsif html?
        @options[:html_parser].load(body)
      else
        body
      end
    end
    alias_method :xml, :data
    alias_method :html, :data
    alias_method :json, :data

    def headers
      @headers ||= {}.tap do |headers|
        @http_response.each_header do |name, value|
          headers[name.gsub(/^x-/, "")] = value
        end
      end
    end

    def method_missing(name, *args, &block)
      return headers[name.to_s] if headers.key?(name.to_s)
      super
    end

    def respond_to_missing?(name, include_private = false)
      headers.key?(name.to_s)
    end

    def inspect
      "#<#{self.class} #{code} #{@http_response.msg} (#{content_type})>"
    end

    alias_method :to_s, :inspect
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
aitch-0.4.1 lib/aitch/response.rb
aitch-0.4.0 lib/aitch/response.rb
aitch-0.3.0 lib/aitch/response.rb