Sha256: 545e407aa33a01ef0ba696e14e6a298f9cac167d1e3aae71ea41ff714c2379c0

Contents?: true

Size: 1.59 KB

Versions: 1

Compression:

Stored size: 1.59 KB

Contents

require 'uri'

module Http
  # Clients make requests and receive responses
  class Client
    include Chainable

    attr_reader :default_options

    def initialize(default_options = {})
      @default_options = Options.new(default_options)
    end

    # Make an HTTP request
    def request(method, uri, options = {})
      opts = @default_options.merge(options)
      headers = opts.headers

      if opts.form
        body = URI.encode_www_form(opts.form)
        headers['Content-Type'] ||= 'application/x-www-form-urlencoded'
      end

      request = Request.new method, uri, headers, body

      opts.callbacks[:request].each { |c| c.call(request) }
      response = perform request
      opts.callbacks[:response].each { |c| c.call(response) }

      format_response method, response, opts.response
    end

    def perform(request)
      uri = request.uri
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = true if uri.is_a? URI::HTTPS
      response = http.request request.to_net_http_request

      Http::Response.new.tap do |res|
        response.each_header do |header, value|
          res[header] = value
        end

        res.status = Integer(response.code)
        res.body   = response.body
      end
    end

    def format_response(method, response, option)
      case option
      when :auto, NilClass
        method == :head ? response : response.parse_body
      when :object
        response
      when :parsed_body
        response.parse_body
      when :body
        response.body
      else raise ArgumentError, "invalid response type: #{option}"
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
http-0.2.0 lib/http/client.rb