class SonarSession
Attributes
header[R]
headers[R]
last_request[R]
last_response[R]
Public Class Methods
new(app)
click to toggle source
# File lib/sonar/session.rb, line 8 def initialize app app.respond_to?(:call) || raise('app should be a valid Rack app') @app = app @headers, @cookies = {}, ::SonarCookies.new end
Public Instance Methods
__sonar__session__()
click to toggle source
# File lib/sonar/session.rb, line 63 def __sonar__session__ self end
app(*args)
click to toggle source
# File lib/sonar/session.rb, line 73 def app *args args.any? && raise('It makes no sense to use `%s` with manually created sessions. To test another app, just create a new session.' % __method__) @app end
invoke_request(request_method, uri, params, env)
click to toggle source
# File lib/sonar/session.rb, line 42 def invoke_request request_method, uri, params, env default_env = ::SonarConstants::DEFAULT_ENV.dup.merge(env) default_env.update :method => request_method default_env.update :params => params default_env.update 'HTTP_COOKIE' => cookies.to_s(uri) default_env.update basic_auth_header process_request uri, default_env if @digest_auth && @last_response.status == 401 && (challenge = @last_response['WWW-Authenticate']) default_env.update digest_auth_header(challenge, uri.path, request_method) process_request uri, default_env end cookies.persist(@last_response.header['Set-Cookie'], uri) @last_response.respond_to?(:finish) && @last_response.finish @last_response end
reset_app!()
click to toggle source
# File lib/sonar/session.rb, line 67 def reset_app! raise 'It makes no sense to use `%s` with manually created sessions. To test another app, just create a new session.' % __method__ end
Also aliased as: reset_browser!
reset_auth!()
click to toggle source
# File lib/sonar/session.rb, line 37 def reset_auth! reset_basic_auth! reset_digest_auth! end
reset_basic_auth!()
click to toggle source
# File lib/sonar/session.rb, line 29 def reset_basic_auth! @basic_auth = nil end
reset_digest_auth!()
click to toggle source
# File lib/sonar/session.rb, line 33 def reset_digest_auth! @digest_auth = nil end
Private Instance Methods
basic_auth_header()
click to toggle source
# File lib/sonar/session.rb, line 107 def basic_auth_header (auth = @basic_auth) ? {'HTTP_AUTHORIZATION' => 'Basic %s' % ["#{auth.first}:#{auth.last}"].pack("m*")} : {} end
digest_auth_header(challenge, uri, request_method)
click to toggle source
# File lib/sonar/session.rb, line 113 def digest_auth_header challenge, uri, request_method params = ::Rack::Auth::Digest::Params.parse(challenge.split(" ", 2).last) params.merge!({ "username" => @digest_auth.first, "nc" => "00000001", "cnonce" => "nonsensenonce", "uri" => uri, "method" => request_method, }) params["response"] = MockDigestRequest.new(params).response(@digest_auth.last) {'HTTP_AUTHORIZATION' => 'Digest ' << params.map {|p| '%s="%s"' % p}.join(', ')} end
headers_to_env()
click to toggle source
# File lib/sonar/session.rb, line 97 def headers_to_env headers.keys.inject({}) do |headers, key| value = headers()[key] if (key =~ /\A[[:upper:]].*\-?[[:upper:]]?.*?/) && (key !~ /\AHTTP_|\ACONTENT_TYPE\Z/) key = (key == 'Content-Type' ? '' : 'HTTP_') << key.upcase.gsub('-', '_') end headers.merge key => value end end
process_request(uri, env)
click to toggle source
# File lib/sonar/session.rb, line 79 def process_request uri, env env = ::Rack::MockRequest.env_for(uri.to_s, env.dup) explicit_env = headers_to_env explicit_env['rack.input'] && env['REQUEST_METHOD'] == 'POST' && env.delete('CONTENT_TYPE') env.update explicit_env @last_request = ::Rack::Request.new(env) # initializing params. do not remove! needed for nested params to work @last_request.params status, headers, body = app.call(@last_request.env) @last_response = ::Rack::MockResponse.new(status, headers, body, env['rack.errors'].flush) body.respond_to?(:close) && body.close end