class HTTPI::Adapter::Rack

HTTPI::Adapter::Rack

Adapter for Rack::MockRequest. Due to limitations, not all features are supported. github.com/rack/rack/blob/master/lib/rack/mock.rb

Usage:

HTTPI::Adapter::Rack.mount 'application', RackApplication
HTTPI.get("http://application/path", :rack)

Attributes

mounted_apps[RW]
client[R]

Public Class Methods

mount(host, application) click to toggle source

Attaches Rack endpoint at specified host. Endpoint will be acessible at {host/ host/} url.

# File lib/httpi/adapter/rack.rb, line 31
def self.mount(host, application)
  self.mounted_apps[host] = application
end
new(request) click to toggle source
# File lib/httpi/adapter/rack.rb, line 40
def initialize(request)
  @app = self.class.mounted_apps[request.url.host]


  if @app.nil?
    message  = "Application '#{request.url.host}' not mounted: ";
    message += "use `HTTPI::Adapter::Rack.mount('#{request.url.host}', RackApplicationClass)`"

    raise message
  end

  @request = request
  @client  = ::Rack::MockRequest.new(@app)
end
unmount(host) click to toggle source

Removes Rack endpoint.

# File lib/httpi/adapter/rack.rb, line 36
def self.unmount(host)
  self.mounted_apps.delete(host)
end

Public Instance Methods

request(method) click to toggle source

Executes arbitrary HTTP requests. You have to mount required Rack application before you can use it.

@see .mount @see HTTPI.request

# File lib/httpi/adapter/rack.rb, line 60
def request(method)
  unless REQUEST_METHODS.include? method
    raise NotSupportedError, "Rack adapter does not support custom HTTP methods"
  end

  if @request.proxy
    raise NotSupportedError, "Rack adapter does not support proxying"
  end

  if @request.auth.http?
    if @request.auth.basic?
      basic_auth = @request.auth.basic.join(':')
      encoded = Base64.encode64(basic_auth).gsub('\n', '')
      @request.headers['Authorization'] = "Basic #{encoded}"
    else
      raise NotSupportedError, "Rack adapter does not support HTTP #{@request.auth.type} auth"
    end
  end

  if @request.auth.ssl?
    raise NotSupportedError, "Rack adapter does not support SSL client auth"
  end

  if @request.on_body
    raise NotSupportedError, "Rack adapter does not support response streaming"
  end

  env = {}
  @request.headers.each do |header, value|
    env["HTTP_#{header.gsub('-', '_').upcase}"] = value
  end

  response = @client.request(method.to_s.upcase, @request.url.to_s,
        { :fatal => true, :input => @request.body.to_s }.merge(env))

  Response.new(response.status, response.headers, response.body)
end