Class: RackSessionManipulation::Middleware
- Inherits:
-
Object
- Object
- RackSessionManipulation::Middleware
- Defined in:
- lib/rack_session_manipulation/middleware.rb
Overview
Rack middleware that handles the accessing and modification of session state.
Instance Attribute Summary collapse
-
#app ⇒ Object
readonly
The core Rack application running on top of this middleware.
-
#config ⇒ RackSessionManipulation::Config
readonly
An instance of the configuration provided to this middleware.
-
#routes ⇒ Hash<String=>Symbol>
readonly
Mapping of HTTP methods to local method handler.
Action Handlers collapse
-
#reset(request) ⇒ Array<Fixnum, Hash, String>
Handle requests to entirely reset the session state.
-
#retrieve(request) ⇒ Array<Fixnum, Hash, String>
Retrieve the entire contents of the session and properly encode it before returning.
-
#update(request) ⇒ Array<Fixnum, Hash, String>
Update the current state of the session with the provided data.
Standard Middleware Methods collapse
-
#call(env) ⇒ Array<Fixnum, Hash, String>
Primary entry point of this middleware.
-
#initialize(app, opts = {}) ⇒ Middleware
constructor
Setup the middleware with the primary application passed in, anything we can’t handle will be passed to this application.
Request Handling Helpers collapse
-
#extract_method(request) ⇒ String
Look up what HTTP method was used for this request.
-
#get_action(request) ⇒ Symbol, Nil
Considers the request and if it matches something this middleware handles return the symbol matching the name of the method that should handle the request.
-
#headers(length) ⇒ Hash
A helper mechanism to consistently generate common headers client will expect.
-
#safe_handle(action, request) ⇒ void
Safely handle the middleware requests so we can properly handle errors in the middleware by returning the correct HTTP status code and message.
Constructor Details
#initialize(app, opts = {}) ⇒ Middleware
Setup the middleware with the primary application passed in, anything we can’t handle will be passed to this application.
81 82 83 84 85 86 87 88 89 |
# File 'lib/rack_session_manipulation/middleware.rb', line 81 def initialize(app, opts = {}) @app = app @config = Config.new(opts) @routes = { 'DELETE' => :reset, 'GET' => :retrieve, 'PUT' => :update } end |
Instance Attribute Details
#app ⇒ Object (readonly)
The core Rack application running on top of this middleware.
11 12 13 |
# File 'lib/rack_session_manipulation/middleware.rb', line 11 def app @app end |
#config ⇒ RackSessionManipulation::Config (readonly)
An instance of the configuration provided to this middleware.
11 12 13 |
# File 'lib/rack_session_manipulation/middleware.rb', line 11 def config @config end |
#routes ⇒ Hash<String=>Symbol> (readonly)
Mapping of HTTP methods to local method handler.
11 12 13 |
# File 'lib/rack_session_manipulation/middleware.rb', line 11 def routes @routes end |
Instance Method Details
#call(env) ⇒ Array<Fixnum, Hash, String>
Primary entry point of this middleware. Every request that makes it this far into the stack will be parsed and when it matches something this middleware is designed to handle it will stop the chain and process it appropriately.
67 68 69 70 71 72 |
# File 'lib/rack_session_manipulation/middleware.rb', line 67 def call(env) request = Rack::Request.new(env) action = get_action(request) action.nil? ? app.call(env) : safe_handle(action, request) end |
#extract_method(request) ⇒ String
Look up what HTTP method was used for this request. In the event the client doesn’t support all HTTP methods, the standard ‘_method’ parameter fall back is made available to override the method actually used.
Normally the ‘_method’ fall back is only accepted over the POST method, however, Capybara drivers are only required to implement GET method and so this does not require any particular method to support the override.
When a GET method was used to provide data, a subtle issue can crop up. URLs can’t exceed 1024 characters. Generally this results in them being truncated which in turn will cause a JSON parse error and no changes being made to the session.
109 110 111 112 |
# File 'lib/rack_session_manipulation/middleware.rb', line 109 def extract_method(request) return request.params['_method'].upcase if request.params['_method'] request.request_method end |
#get_action(request) ⇒ Symbol, Nil
Considers the request and if it matches something this middleware handles return the symbol matching the name of the method that should handle the request.
121 122 123 124 |
# File 'lib/rack_session_manipulation/middleware.rb', line 121 def get_action(request) return unless request.path == config.path routes[extract_method(request)] end |
#headers(length) ⇒ Hash
A helper mechanism to consistently generate common headers client will expect.
131 132 133 134 135 136 |
# File 'lib/rack_session_manipulation/middleware.rb', line 131 def headers(length) { 'Content-Length' => length, 'Content-Type' => 'application/json; charset=utf-8' } end |
#reset(request) ⇒ Array<Fixnum, Hash, String>
Handle requests to entirely reset the session state.
20 21 22 23 |
# File 'lib/rack_session_manipulation/middleware.rb', line 20 def reset(request) request.env['rack.session'].clear [204, headers(0), ''] end |
#retrieve(request) ⇒ Array<Fixnum, Hash, String>
Retrieve the entire contents of the session and properly encode it before returning.
30 31 32 33 34 35 |
# File 'lib/rack_session_manipulation/middleware.rb', line 30 def retrieve(request) session_hash = request.env['rack.session'].to_hash content = config.encoder.encode(session_hash) [200, headers(content.length), content] end |
#safe_handle(action, request) ⇒ void
Safely handle the middleware requests so we can properly handle errors in the middleware by returning the correct HTTP status code and message.
143 144 145 146 147 |
# File 'lib/rack_session_manipulation/middleware.rb', line 143 def safe_handle(action, request) send(action, request) rescue => e [500, headers(e..length), e.] end |
#update(request) ⇒ Array<Fixnum, Hash, String>
Update the current state of the session with the provided data. This works effectively like a hash merge on the current session only setting and overriding keys in the session data provided.
43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/rack_session_manipulation/middleware.rb', line 43 def update(request) session_data = request.params['session_data'] config.encoder.decode(session_data).each do |k, v| request.env['rack.session'][k] = v end loc_hdr = { 'Location' => config.path } [303, headers(0).merge(loc_hdr), ''] rescue JSON::ParserError [400, headers(0), ''] end |