process(method, path, parameters = nil, env = nil)
private
Performs the actual request.
Show source
def process(method, path, parameters = nil, env = nil)
env ||= {}
if path =~ %{://}
location = URI.parse(path)
https! URI::HTTPS === location if location.scheme
host! location.host if location.host
path = location.query ? "#{location.path}?#{location.query}" : location.path
end
unless ActionController::Base < ActionController::Testing
ActionController::Base.class_eval do
include ActionController::Testing
end
end
hostname, port = host.split(':')
default_env = {
:method => method,
:params => parameters,
"SERVER_NAME" => hostname,
"SERVER_PORT" => port || (https? ? "443" : "80"),
"HTTPS" => https? ? "on" : "off",
"rack.url_scheme" => https? ? "https" : "http",
"REQUEST_URI" => path,
"HTTP_HOST" => host,
"REMOTE_ADDR" => remote_addr,
"CONTENT_TYPE" => "application/x-www-form-urlencoded",
"HTTP_ACCEPT" => accept
}
session = Rack::Test::Session.new(_mock_session)
env.reverse_merge!(default_env)
uri = URI.parse('/')
uri.scheme ||= env['rack.url_scheme']
uri.host ||= env['SERVER_NAME']
uri.port ||= env['SERVER_PORT'].try(:to_i)
uri += path
session.request(uri.to_s, env)
@request_count += 1
@request = ActionDispatch::Request.new(session.last_request.env)
response = _mock_session.last_response
@response = ActionDispatch::TestResponse.new(response.status, response.headers, response.body)
@html_document = nil
@controller = session.last_request.env['action_controller.instance']
return response.status
end