Module: Jets::Controller::Request::Compat::Request

Extended by:
Memoist
Included in:
Jets::Controller::Request
Defined in:
lib/jets/controller/request/compat/request.rb

Overview

Based on ActionDispatch::Request class

Constant Summary collapse

ENV_METHODS =
%w[ AUTH_TYPE GATEWAY_INTERFACE
PATH_TRANSLATED REMOTE_HOST
REMOTE_IDENT REMOTE_USER REMOTE_ADDR
SERVER_NAME SERVER_PROTOCOL
ORIGINAL_SCRIPT_NAME

HTTP_ACCEPT HTTP_ACCEPT_CHARSET HTTP_ACCEPT_ENCODING
HTTP_ACCEPT_LANGUAGE HTTP_CACHE_CONTROL HTTP_FROM
HTTP_NEGOTIATE HTTP_PRAGMA HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR HTTP_ORIGIN HTTP_VERSION
HTTP_X_CSRF_TOKEN HTTP_X_REQUEST_ID HTTP_X_FORWARDED_HOST
].freeze
LOCALHOST =
Regexp.union [/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/, /^::1$/, /^0:0:0:0:0:0:0:1(%.*)?$/]

Instance Method Summary collapse

Instance Method Details

#authorizationObject

Returns the authorization header regardless of whether it was specified directly or through one of the proxy alternatives.



83
84
85
86
87
88
# File 'lib/jets/controller/request/compat/request.rb', line 83

def authorization
  get_header("HTTP_AUTHORIZATION")   ||
  get_header("X-HTTP_AUTHORIZATION") ||
  get_header("X_HTTP_AUTHORIZATION") ||
  get_header("REDIRECT_X_HTTP_AUTHORIZATION")
end

#controller_class_for(name) ⇒ Object



95
96
97
98
99
# File 'lib/jets/controller/request/compat/request.rb', line 95

def controller_class_for(name)
  controller_param = name.underscore
  const_name = controller_param.camelize << "Controller"
  const_name.constantize
end

#headersObject



52
53
54
# File 'lib/jets/controller/request/compat/request.rb', line 52

def headers
  top_level_headers.merge(http_headers)
end

#http_headersObject



56
57
58
59
60
61
62
# File 'lib/jets/controller/request/compat/request.rb', line 56

def http_headers
  Hash[*env.select {|k,v| k.start_with? 'HTTP_'}
    .collect {|k,v| [k.sub(/^HTTP_/, ''), v]}
    .collect {|k,v| [k.split('_').collect(&:capitalize).join('-'), v]}
    .sort
    .flatten]
end

#local?Boolean

True if the request came from localhost, 127.0.0.1, or ::1.

Returns:

  • (Boolean)


91
92
93
# File 'lib/jets/controller/request/compat/request.rb', line 91

def local?
  LOCALHOST.match?(remote_addr) && LOCALHOST.match?(remote_ip)
end

#remote_ipObject

Returns the IP address of client as a String, usually set by the RemoteIp middleware.



108
109
110
# File 'lib/jets/controller/request/compat/request.rb', line 108

def remote_ip
  @remote_ip ||= (get_header("action_dispatch.remote_ip") || ip).to_s
end

#remote_ip=(remote_ip) ⇒ Object



112
113
114
115
# File 'lib/jets/controller/request/compat/request.rb', line 112

def remote_ip=(remote_ip)
  @remote_ip = nil
  set_header "action_dispatch.remote_ip", remote_ip
end

#request_method_symbolObject Also known as: method_symbol



101
102
103
# File 'lib/jets/controller/request/compat/request.rb', line 101

def request_method_symbol
  request_method.downcase.to_sym
end

#reset_sessionObject



48
49
50
# File 'lib/jets/controller/request/compat/request.rb', line 48

def reset_session
  session.destroy
end

#send_early_hints(links) ⇒ Object

Needed when action_view.preload_links_header = true Rails 6.1 defaults



119
120
121
122
123
# File 'lib/jets/controller/request/compat/request.rb', line 119

def send_early_hints(links)
  return unless env["rack.early_hints"]

  env["rack.early_hints"].call(links)
end

#server_softwareObject

Returns the lowercase name of the HTTP server software.



77
78
79
# File 'lib/jets/controller/request/compat/request.rb', line 77

def server_software
  (get_header("SERVER_SOFTWARE") && /^([a-zA-Z]+)/ =~ get_header("SERVER_SOFTWARE")) ? $1.downcase : nil
end

#sessionObject



30
31
32
33
34
35
36
37
38
# File 'lib/jets/controller/request/compat/request.rb', line 30

def session
  key = ActionDispatch::Request::Session::ENV_SESSION_KEY
  session = env[key]
  if session.nil? # controller dispatch! does not go through middleware
    # mock session that is disabled
    session = ActionDispatch::Request::Session.new(nil, self, enabled: false)
  end
  session
end

#session=(session) ⇒ Object

:nodoc:



40
41
42
# File 'lib/jets/controller/request/compat/request.rb', line 40

def session=(session) # :nodoc:
  ActionDispatch::Request::Session.set self, session
end

#session_options=(options) ⇒ Object



44
45
46
# File 'lib/jets/controller/request/compat/request.rb', line 44

def session_options=(options)
  ActionDispatch::Request::Session::Options.set self, options
end

#top_level_headersObject

These are not part of a Rails headers but believe they make sense to add as it feel like expected behavior.



66
67
68
69
70
71
72
73
74
# File 'lib/jets/controller/request/compat/request.rb', line 66

def top_level_headers
  hash = {
    "Host" => env["HTTP_HOST"],
    "Content-Type" => env["CONTENT_TYPE"],
    "Content-Length" => env["CONTENT_LENGTH"],
  }
  hash.delete_if { |k, v| v.nil? }
  hash
end