class Pliny::Middleware::Versioning
Public Class Methods
new(app, options={})
click to toggle source
# File lib/pliny/middleware/versioning.rb, line 5 def initialize(app, options={}) @app = app @default = options[:default] || raise("missing=default") @app_name = options[:app_name] || raise("missing=app_name") end
Public Instance Methods
call(env)
click to toggle source
# File lib/pliny/middleware/versioning.rb, line 11 def call(env) Pliny.log middleware: :versioning, id: env["REQUEST_ID"] do detect_api_version(env) end end
Private Instance Methods
accept_headers()
click to toggle source
# File lib/pliny/middleware/versioning.rb, line 56 def accept_headers [ "application/vnd.#{@app_name}", "application/vnd.#{@app_name}+json", "application/*+json", ] end
detect_api_version(env)
click to toggle source
# File lib/pliny/middleware/versioning.rb, line 19 def detect_api_version(env) media_types = HTTPAccept.parse(env["HTTP_ACCEPT"]) version = nil media_types.map! do |media_type| if accept_headers.include?(media_type.format) unless media_type.params['version'] error = { id: :bad_version, message: <<-eos } Please specify a version along with the MIME type. For example, `Accept: application/vnd.#{@app_name}+json; version=1`. eos return [400, { "Content-Type" => "application/json; charset=utf-8" }, [MultiJson.encode(error)]] end unless version version = media_type.params["version"] end # replace the MIME with a simplified version for easier # parsing down the stack media_type.format = "application/json" media_type.params.delete("version") end media_type.to_s end env['HTTP_ACCEPT'] = media_types.join(', ') version ||= @default set_api_version(env, version) @app.call(env) end
set_api_version(env, version)
click to toggle source
# File lib/pliny/middleware/versioning.rb, line 51 def set_api_version(env, version) # API modules will look for the version in env env["HTTP_X_API_VERSION"] = version end