class SonarSession

Attributes

cookies[R]
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
auth(user, pass)
Alias for: basic_authorize
authorize(user, pass)
Alias for: basic_authorize
basic_authorize(user, pass) click to toggle source
# File lib/sonar/session.rb, line 16
def basic_authorize user, pass
  @basic_auth = [user, pass]
end
Also aliased as: authorize, auth
digest_auth(user, pass)
Alias for: digest_authorize
digest_authorize(user, pass) click to toggle source
# File lib/sonar/session.rb, line 23
def digest_authorize user, pass
  @digest_auth = [user, pass]
end
Also aliased as: digest_auth
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_browser!()
Alias for: reset_app!
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