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
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