Sha256: 999c6325340c6b374b0c08a35cfcc023128abdd59c370d448b38a91307c00021

Contents?: true

Size: 1.41 KB

Versions: 2

Compression:

Stored size: 1.41 KB

Contents

require "httpi/adapter/httpclient"
require "httpi/adapter/curb"
require "httpi/adapter/net_http"

module HTTPI

  # = HTTPI::Adapter
  #
  # Manages the adapter classes. Currently supports:
  #
  # * httpclient
  # * curb
  # * net/http
  module Adapter

    ADAPTERS = {
      :httpclient => HTTPClient,
      :curb       => Curb,
      :net_http   => NetHTTP
    }

    DEPENDENCIES = [
      [:httpclient, ["httpclient"]],
      [:curb,       ["curb"]],
      [:net_http,   ["net/https", "net/ntlm_http"]]
    ]

    class << self

      def use=(adapter)
        @adapter = adapter.nil? ? nil : validate_adapter!(adapter)
      end

      def use
        @adapter ||= default_adapter
      end

      def load(adapter = nil)
        adapter = adapter ? validate_adapter!(adapter) : use
        [adapter, ADAPTERS[adapter]]
      end

    private

      def validate_adapter!(adapter)
        raise ArgumentError, "Invalid HTTPI adapter: #{adapter}" unless ADAPTERS[adapter]
        adapter
      end

      def default_adapter
        return :httpclient if defined?(::HTTPClient)
        return :curb if defined?(::Curl::Easy)
        return :net_http if defined?(::Net::HTTP)

        DEPENDENCIES.each do |(adapter, dependencies)|
          begin
            dependencies.each { |dependency| require dependency }
            return adapter
          rescue LoadError
            next
          end
        end
      end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
httpi-0.9.2 lib/httpi/adapter.rb
httpi-0.9.1 lib/httpi/adapter.rb