class RackSessionAccess::Middleware

Public Class Methods

new(app, options = {}) click to toggle source

Initialize RackSessionAccess middleware

@param app a rack application @param options

Options:

  • :key - rack session key

# File lib/rack_session_access/middleware.rb, line 13
def initialize(app, options = {})
  @app = app
  @key = options[:key] || 'rack.session'
  @routing = [
    [ 'GET', RackSessionAccess.path,      :show   ],
    [ 'GET', RackSessionAccess.edit_path, :edit   ],
    [ 'PUT', RackSessionAccess.path,      :update ]
  ]
end

Public Instance Methods

call(env) click to toggle source
# File lib/rack_session_access/middleware.rb, line 23
def call(env)
  return render(500) do |xml|
    xml.h2("#{@key} env is not initialized")
  end unless env[@key]

  request = ::Rack::Request.new(env)

  if action = dispatch_action(request)
    send(action, request)
  else
    @app.call(env)
  end
end

Protected Instance Methods

edit(request) click to toggle source

Render form for submit new session data

# File lib/rack_session_access/middleware.rb, line 69
def edit(request)
  render do |xml|
    xml.h2 "Update rack session"
    xml.p "Put marshalized and encoded with base64 ruby hash into the form"
    xml.form({
      :action  => action_path(:update),
      :method  => 'post',
      :enctype => 'application/x-www-form-urlencoded'
    }) do |form|
      form.input(:type => 'hidden', :name =>'_method', :value => 'put')
      form.textarea(:cols => 40, :rows => 10, :name => 'data') {}
      form.p do |p|
        p.input(:type => 'submit', :value => "Update")
      end
    end
  end
end
show(request) click to toggle source

List session data

# File lib/rack_session_access/middleware.rb, line 40
def show(request)
  # force load session because it can be lazy loaded
  request.env[@key].delete(:rack_session_access_force_load_session)

  # session hash object
  session_hash = request.env[@key].to_hash

  case File.extname(request.path)
  when ".raw"
    render do |xml|
      xml.h2 "Raw rack session data"
      xml.pre RackSessionAccess.encode(session_hash)
    end
  else
    render do |xml|
      xml.h2 "Rack session data"
      xml.ul do |ul|
        session_hash.each do |k,v|
          ul.li("#{k.inspect} : #{v.inspect}")
        end
      end
      xml.p do |p|
        p.a("Edit", :href => action_path(:edit))
      end
    end
  end
end
update(request) click to toggle source

Update session data

# File lib/rack_session_access/middleware.rb, line 88
def update(request)
  begin
    data = request.params['data']
    hash = RackSessionAccess.decode(data)
    hash.each { |k, v| request.env[@key][k] = v }
  rescue => e
    return render(400) do |xml|
      xml.h2("Bad data #{data.inspect}: #{e.message} ")
    end
  end

  redirect_to action_path(:show)
end

Private Instance Methods

action_path(action) click to toggle source

@return path for given action name

# File lib/rack_session_access/middleware.rb, line 120
def action_path(action)
  @routing.detect { |r| r[2] == action }[1]
end
dispatch_action(request) click to toggle source

Dispatch action from request

# File lib/rack_session_access/middleware.rb, line 105
def dispatch_action(request)
  method = request_method(request)
  path = request.path.sub(/\.\w+$/, '')
  route = @routing.detect { |r| r[0] == method && r[1] == path }
  route[2] if route
end
redirect_to(url) click to toggle source

@return redirect response to specified url

# File lib/rack_session_access/middleware.rb, line 125
def redirect_to(url)
  render(302, {"Location" => url}) do |xml|
    xml.a "You are being redirected", :href => url
  end
end
render(code = 200, headers = {}) { |body| ... } click to toggle source

@return html response

# File lib/rack_session_access/middleware.rb, line 132
def render(code = 200, headers = {})
  headers["Content-Type"] ||= "text/html"

  builder = Builder::XmlMarkup.new(:indent => 2)

  builder.html do |xml|
    xml.body do |body|
      yield body
    end
  end

  [ code, headers, [builder.target!] ]
end
request_method(request) click to toggle source

Return HTTP method, detect emulated method with _method param

# File lib/rack_session_access/middleware.rb, line 113
def request_method(request)
  return request.request_method           if request.request_method != 'POST'
  return request.params['_method'].upcase if request.params['_method']
  request.request_method
end