Class: Grape::Middleware::Versioner::Path

Inherits:
Base
  • Object
show all
Defined in:
lib/grape/middleware/versioner/path.rb

Overview

This middleware sets various version related rack environment variables based on the uri path and removes the version substring from the uri path. If the version substring does not match any potential initialized versions, a 404 error is thrown.

Example: For a uri path

/v1/resource

The following rack env variables are set and path is rewritten to ‘/resource’:

env['api.version'] => 'v1'

Constant Summary

Constants inherited from Base

Base::CASCADE_PASS_HEADER, Base::DEFAULT_OPTIONS

Instance Attribute Summary

Attributes inherited from Base

#available_media_types, #error_headers, #versions

Attributes inherited from Base

#app, #config, #env, #options

Instance Method Summary collapse

Methods inherited from Base

inherited, #potential_version_match?, #version_not_found!

Methods included from PrecomputedContentTypes

#content_type, #content_type_for, #content_types, #mime_types

Methods inherited from Base

#after, #call, #call!, #context, #query_params, #rack_request, #response

Methods included from DSL::Headers

#header

Constructor Details

#initialize(app, **options) ⇒ Path

Returns a new instance of Path.



20
21
22
23
# File 'lib/grape/middleware/versioner/path.rb', line 20

def initialize(app, **options)
  super
  @prefixes = [mount_path, Grape::Util::PathNormalizer.call(prefix)].select { |p| p.present? && p != '/' }.freeze
end

Instance Method Details

#beforeObject



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/grape/middleware/versioner/path.rb', line 25

def before
  path_info = Grape::Util::PathNormalizer.call(env[Rack::PATH_INFO])
  return if path_info == '/'

  path_info = @prefixes.reduce(path_info) do |pi, path|
    pi.start_with?(path) ? pi.delete_prefix(path) : pi
  end

  slash_position = path_info.index('/', 1) # omit the first one
  return unless slash_position

  potential_version = path_info[1..(slash_position - 1)]
  return unless potential_version.match?(pattern)

  version_not_found! unless potential_version_match?(potential_version)
  env[Grape::Env::API_VERSION] = potential_version
end