Class: Versionist::Middleware
- Inherits:
-
Object
- Object
- Versionist::Middleware
- Defined in:
- lib/versionist/middleware.rb
Overview
When your routes don’t include an explicit format in the URL (i.e. ‘match ’foos.(:format)‘ => foos#index`), Rails inspects the Accept header to determine the requested format. Since an Accept header can have multiple values, Rails uses the first one present to determine the format. If your custom version header happens to be the first value in the Accept header, it would incorrectly be interpretted as the format. This middleware moves your custom version header (if found) to the end of the Accept header so as to not interfere with this format logic in Rails.
Constant Summary collapse
- ACCEPT =
"Accept"- HTTP_ACCEPT =
"HTTP_ACCEPT"
Instance Method Summary collapse
- #_call(env) ⇒ Object
- #call(env) ⇒ Object
-
#initialize(app) ⇒ Middleware
constructor
A new instance of Middleware.
Constructor Details
#initialize(app) ⇒ Middleware
Returns a new instance of Middleware.
12 13 14 |
# File 'lib/versionist/middleware.rb', line 12 def initialize(app) @app = app end |
Instance Method Details
#_call(env) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/versionist/middleware.rb', line 20 def _call(env) request = ::Rack::Request.new(env) potential_matches = Versionist.configuration.header_versions.select {|hv| hv.config[:header][:name] == ACCEPT && env[HTTP_ACCEPT].try(:include?, hv.config[:header][:value])} if !potential_matches.empty? strategy = potential_matches.max {|a,b| a.config[:header][:value].length <=> b.config[:header][:value].length} end if !strategy.nil? entries = env[HTTP_ACCEPT].split(',') index = -1 entries.each_with_index do |e, i| e.strip! index = i if e == strategy.config[:header][:value] end if (index != -1) version = entries.delete_at(index) entries << version end env[HTTP_ACCEPT] = entries.join(", ") end @app.call(env) end |
#call(env) ⇒ Object
16 17 18 |
# File 'lib/versionist/middleware.rb', line 16 def call(env) dup._call(env) end |