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