Class: Hanami::Routing::HttpRouter Private

Inherits:
HttpRouter show all
Defined in:
lib/hanami/routing/http_router.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

HTTP router

This implementation is based on ::HttpRouter (http_router gem).

Hanami::Router wraps an instance of this class, in order to protect its public API from any future change of ::HttpRouter.

Since:

  • 0.1.0

Constant Summary collapse

SCRIPT_NAME =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Script name - rack environment variable

Since:

  • 0.5.0

'SCRIPT_NAME'.freeze
PATH_INFO =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Path info - rack environment variable

Since:

  • 0.7.0

'PATH_INFO'.freeze
DEFAULT_PATH_INFO =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Default PATH_INFO for Rack requests

Since:

  • 0.7.0

'/'.freeze
URL_SEPARATOR =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

URL separator

Since:

  • 0.7.0

'/'.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}, &blk) ⇒ HttpRouter

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initialize the router.

See Also:

Since:

  • 0.1.0


69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/hanami/routing/http_router.rb', line 69

def initialize(options = {}, &blk)
  if options[:parsers]
    depecration_message = 'Hanami::Router options[:parsers] is deprecated and it will be removed in future versions'
    Hanami::Utils::Deprecation.new(depecration_message)
  end
  @compiled         = false
  @uri_parser       = URI::Parser.new
  super(options, &nil)

  @namespace        = options[:namespace] if options[:namespace]
  @default_scheme   = options[:scheme]    if options[:scheme]
  @default_host     = options[:host]      if options[:host]
  @default_port     = options[:port]      if options[:port]
  @route_class      = options[:route]    || Routing::Route
  @resolver         = options[:resolver] || Routing::EndpointResolver.new(options)
  @parsers          = Routing::Parsers.new(options[:parsers])
  @prefix           = Utils::PathPrefix.new(options[:prefix] || '')
  @force_ssl        = Hanami::Routing::ForceSsl.new(!!options[:force_ssl], host: @default_host, port: @default_port)
end

Instance Attribute Details

#namespaceObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 0.5.0


57
58
59
# File 'lib/hanami/routing/http_router.rb', line 57

def namespace
  @namespace
end

#prefixObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 0.8.0


61
62
63
# File 'lib/hanami/routing/http_router.rb', line 61

def prefix
  @prefix
end

Instance Method Details

#action_separatorObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Separator between controller and action name.

See Also:

Since:

  • 0.1.0


95
96
97
# File 'lib/hanami/routing/http_router.rb', line 95

def action_separator
  @resolver.action_separator
end

#find(options) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Finds a path from the given options.

See Also:

Since:

  • 0.1.0


105
106
107
# File 'lib/hanami/routing/http_router.rb', line 105

def find(options)
  @resolver.find(options)
end

#mount(app, options) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Allow to mount a Rack app

See Also:

Since:

  • 0.1.1


149
150
151
152
153
# File 'lib/hanami/routing/http_router.rb', line 149

def mount(app, options)
  add("#{ options.fetch(:at) }*", host: options[:host]).to(
    @resolver.resolve(to: app)
  )
end

#no_response(request, env) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 0.1.0


177
178
179
180
181
182
183
# File 'lib/hanami/routing/http_router.rb', line 177

def no_response(request, env)
  if request.acceptable_methods.any? && !request.acceptable_methods.include?(env['REQUEST_METHOD'])
    [405, {'Allow' => request.acceptable_methods.sort.join(", ")}, []]
  else
    @default_app.call(env)
  end
end

#options(path, options = {}, &blk) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Support for OPTIONS HTTP verb

See Also:

Since:

  • 0.1.0


139
140
141
# File 'lib/hanami/routing/http_router.rb', line 139

def options(path, options = {}, &blk)
  add_with_request_method(path, :options, options, &blk)
end

#pass_on_response(response) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 0.1.0


172
173
174
# File 'lib/hanami/routing/http_router.rb', line 172

def pass_on_response(response)
  super response.to_a
end

#raw_call(env, &blk) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 0.1.0


156
157
158
159
160
161
162
# File 'lib/hanami/routing/http_router.rb', line 156

def raw_call(env, &blk)
  if response = @force_ssl.call(env)
    response
  else
    super(@parsers.call(env))
  end
end

#raw_path(route, *args) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Generate a relative URL for a specified named route.

See Also:

Since:

  • 0.1.0


115
116
117
118
119
# File 'lib/hanami/routing/http_router.rb', line 115

def raw_path(route, *args)
  _rescue_url_recognition do
    _custom_path(super(route, *args))
  end
end

#raw_url(route, *args) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Generate an absolute URL for a specified named route.

See Also:

Since:

  • 0.1.0


127
128
129
130
131
# File 'lib/hanami/routing/http_router.rb', line 127

def raw_url(route, *args)
  _rescue_url_recognition do
    _custom_path(super(route, *args))
  end
end

#reset!Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 0.1.0


165
166
167
168
169
# File 'lib/hanami/routing/http_router.rb', line 165

def reset!
  uncompile
  @routes, @named_routes, @root = [], Hash.new{|h,k| h[k] = []}, Node::Root.new(self)
  @default_host, @default_port, @default_scheme = 'localhost', 80, 'http'
end

#rewrite_partial_path_info(env, request) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 0.1.0


186
187
188
189
190
191
192
193
194
195
# File 'lib/hanami/routing/http_router.rb', line 186

def rewrite_partial_path_info(env, request)
  if request.path.empty?
    env[SCRIPT_NAME] += env[PATH_INFO]
    env[PATH_INFO]    = DEFAULT_PATH_INFO
  else
    path_info_before  = env[PATH_INFO].dup
    env[PATH_INFO]    = "/#{@uri_parser.escape(request.path.join(URL_SEPARATOR))}"
    env[SCRIPT_NAME] += path_info_before[0, path_info_before.bytesize - env[PATH_INFO].bytesize]
  end
end