Class: Tina4::Request
- Inherits:
-
Object
- Object
- Tina4::Request
- Defined in:
- lib/tina4/request.rb
Defined Under Namespace
Classes: PayloadTooLarge
Constant Summary collapse
- TINA4_MAX_UPLOAD_SIZE =
Maximum upload size in bytes (default 10 MB). Override via TINA4_MAX_UPLOAD_SIZE env var.
Integer(ENV.fetch("TINA4_MAX_UPLOAD_SIZE", 10_485_760))
Instance Attribute Summary collapse
-
#content_type ⇒ Object
readonly
Returns the value of attribute content_type.
-
#env ⇒ Object
readonly
Returns the value of attribute env.
-
#ip ⇒ Object
readonly
Returns the value of attribute ip.
-
#method ⇒ Object
readonly
Returns the value of attribute method.
-
#path ⇒ Object
readonly
Returns the value of attribute path.
-
#path_params ⇒ Object
readonly
Returns the value of attribute path_params.
-
#query_string ⇒ Object
readonly
Returns the value of attribute query_string.
-
#user ⇒ Object
Returns the value of attribute user.
Instance Method Summary collapse
- #[](key) ⇒ Object
- #bearer_token ⇒ Object
-
#body ⇒ Object
Raw body string.
-
#body_parsed ⇒ Object
Parsed body (JSON or form data).
- #cookies ⇒ Object
- #files ⇒ Object
- #header(name) ⇒ Object
-
#headers ⇒ Object
Lazy accessors.
-
#initialize(env, path_params = {}) ⇒ Request
constructor
A new instance of Request.
- #json_body ⇒ Object
-
#param(key, default = nil) ⇒ Object
Look up a param by symbol or string key (indifferent access shortcut).
-
#params ⇒ Object
Merged params: query + body + path_params (path_params highest priority) Supports both string and symbol key access (indifferent access).
-
#query ⇒ Object
Parsed query string as hash.
- #session ⇒ Object
-
#url ⇒ Object
Full URL reconstruction.
Constructor Details
#initialize(env, path_params = {}) ⇒ Request
Returns a new instance of Request.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/tina4/request.rb', line 48 def initialize(env, path_params = {}) @env = env @method = env["REQUEST_METHOD"] @path = env["PATH_INFO"] || "/" @query_string = env["QUERY_STRING"] || "" @content_type = env["CONTENT_TYPE"] || "" @path_params = path_params # Check upload size limit content_length = (env["CONTENT_LENGTH"] || 0).to_i if content_length > TINA4_MAX_UPLOAD_SIZE raise PayloadTooLarge, "Request body (#{content_length} bytes) exceeds TINA4_MAX_UPLOAD_SIZE (#{TINA4_MAX_UPLOAD_SIZE} bytes)" end # Client IP with X-Forwarded-For support @ip = extract_client_ip # Lazy-initialized fields (nil = not yet computed) @headers = nil @cookies = nil @session = nil @body_raw = nil @params = nil @files = nil @json_body = nil @query_hash = nil @body_parsed = nil end |
Instance Attribute Details
#content_type ⇒ Object (readonly)
Returns the value of attribute content_type.
39 40 41 |
# File 'lib/tina4/request.rb', line 39 def content_type @content_type end |
#env ⇒ Object (readonly)
Returns the value of attribute env.
39 40 41 |
# File 'lib/tina4/request.rb', line 39 def env @env end |
#ip ⇒ Object (readonly)
Returns the value of attribute ip.
39 40 41 |
# File 'lib/tina4/request.rb', line 39 def ip @ip end |
#method ⇒ Object (readonly)
Returns the value of attribute method.
39 40 41 |
# File 'lib/tina4/request.rb', line 39 def method @method end |
#path ⇒ Object (readonly)
Returns the value of attribute path.
39 40 41 |
# File 'lib/tina4/request.rb', line 39 def path @path end |
#path_params ⇒ Object (readonly)
Returns the value of attribute path_params.
39 40 41 |
# File 'lib/tina4/request.rb', line 39 def path_params @path_params end |
#query_string ⇒ Object (readonly)
Returns the value of attribute query_string.
39 40 41 |
# File 'lib/tina4/request.rb', line 39 def query_string @query_string end |
#user ⇒ Object
Returns the value of attribute user.
41 42 43 |
# File 'lib/tina4/request.rb', line 41 def user @user end |
Instance Method Details
#[](key) ⇒ Object
133 134 135 |
# File 'lib/tina4/request.rb', line 133 def [](key) params[key.to_s] || params[key.to_sym] || @path_params[key.to_sym] end |
#bearer_token ⇒ Object
149 150 151 152 |
# File 'lib/tina4/request.rb', line 149 def bearer_token auth = header("authorization") || "" auth.sub(/\ABearer\s+/i, "") if auth =~ /\ABearer\s+/i end |
#body ⇒ Object
Raw body string
104 105 106 |
# File 'lib/tina4/request.rb', line 104 def body @body_raw ||= read_body end |
#body_parsed ⇒ Object
Parsed body (JSON or form data)
109 110 111 |
# File 'lib/tina4/request.rb', line 109 def body_parsed @body_parsed ||= parse_body end |
#cookies ⇒ Object
95 96 97 |
# File 'lib/tina4/request.rb', line 95 def @cookies ||= end |
#files ⇒ Object
118 119 120 |
# File 'lib/tina4/request.rb', line 118 def files @files ||= extract_files end |
#header(name) ⇒ Object
137 138 139 |
# File 'lib/tina4/request.rb', line 137 def header(name) headers[name.to_s.downcase.gsub("-", "_")] end |
#headers ⇒ Object
Lazy accessors
91 92 93 |
# File 'lib/tina4/request.rb', line 91 def headers @headers ||= extract_headers end |
#json_body ⇒ Object
141 142 143 144 145 146 147 |
# File 'lib/tina4/request.rb', line 141 def json_body @json_body ||= begin JSON.parse(body) rescue JSON::ParserError, TypeError {} end end |
#param(key, default = nil) ⇒ Object
Look up a param by symbol or string key (indifferent access shortcut).
129 130 131 |
# File 'lib/tina4/request.rb', line 129 def param(key, default = nil) params[key.to_s] || params[key.to_sym] || default end |
#params ⇒ Object
Merged params: query + body + path_params (path_params highest priority) Supports both string and symbol key access (indifferent access).
124 125 126 |
# File 'lib/tina4/request.rb', line 124 def params @params ||= build_params end |
#query ⇒ Object
Parsed query string as hash
114 115 116 |
# File 'lib/tina4/request.rb', line 114 def query @query_hash ||= parse_query_to_hash(@query_string) end |
#session ⇒ Object
99 100 101 |
# File 'lib/tina4/request.rb', line 99 def session @session ||= Tina4::Session.new(@env) end |
#url ⇒ Object
Full URL reconstruction
79 80 81 82 83 84 85 86 87 88 |
# File 'lib/tina4/request.rb', line 79 def url scheme = env["rack.url_scheme"] || "http" host = env["HTTP_HOST"] || env["SERVER_NAME"] || "localhost" port = env["SERVER_PORT"] url_str = "#{scheme}://#{host}" url_str += ":#{port}" if port && port != "80" && port != "443" url_str += @path url_str += "?#{@query_string}" unless @query_string.empty? url_str end |