roda 3.83.0 → 3.84.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/lib/roda/plugins/hsts.rb +35 -0
  3. data/lib/roda/response.rb +1 -1
  4. data/lib/roda/version.rb +1 -1
  5. metadata +4 -179
  6. data/CHANGELOG +0 -691
  7. data/README.rdoc +0 -1136
  8. data/doc/conventions.rdoc +0 -177
  9. data/doc/release_notes/3.0.0.txt +0 -84
  10. data/doc/release_notes/3.1.0.txt +0 -24
  11. data/doc/release_notes/3.10.0.txt +0 -132
  12. data/doc/release_notes/3.11.0.txt +0 -54
  13. data/doc/release_notes/3.12.0.txt +0 -19
  14. data/doc/release_notes/3.13.0.txt +0 -38
  15. data/doc/release_notes/3.14.0.txt +0 -36
  16. data/doc/release_notes/3.14.1.txt +0 -43
  17. data/doc/release_notes/3.15.0.txt +0 -21
  18. data/doc/release_notes/3.16.0.txt +0 -52
  19. data/doc/release_notes/3.17.0.txt +0 -62
  20. data/doc/release_notes/3.18.0.txt +0 -170
  21. data/doc/release_notes/3.19.0.txt +0 -229
  22. data/doc/release_notes/3.2.0.txt +0 -22
  23. data/doc/release_notes/3.20.0.txt +0 -7
  24. data/doc/release_notes/3.21.0.txt +0 -5
  25. data/doc/release_notes/3.22.0.txt +0 -24
  26. data/doc/release_notes/3.23.0.txt +0 -28
  27. data/doc/release_notes/3.24.0.txt +0 -14
  28. data/doc/release_notes/3.25.0.txt +0 -12
  29. data/doc/release_notes/3.26.0.txt +0 -15
  30. data/doc/release_notes/3.27.0.txt +0 -15
  31. data/doc/release_notes/3.28.0.txt +0 -13
  32. data/doc/release_notes/3.29.0.txt +0 -15
  33. data/doc/release_notes/3.3.0.txt +0 -291
  34. data/doc/release_notes/3.30.0.txt +0 -14
  35. data/doc/release_notes/3.31.0.txt +0 -11
  36. data/doc/release_notes/3.32.0.txt +0 -42
  37. data/doc/release_notes/3.33.0.txt +0 -8
  38. data/doc/release_notes/3.34.0.txt +0 -17
  39. data/doc/release_notes/3.35.0.txt +0 -12
  40. data/doc/release_notes/3.36.0.txt +0 -17
  41. data/doc/release_notes/3.37.0.txt +0 -42
  42. data/doc/release_notes/3.38.0.txt +0 -5
  43. data/doc/release_notes/3.39.0.txt +0 -16
  44. data/doc/release_notes/3.4.0.txt +0 -24
  45. data/doc/release_notes/3.40.0.txt +0 -24
  46. data/doc/release_notes/3.41.0.txt +0 -9
  47. data/doc/release_notes/3.42.0.txt +0 -21
  48. data/doc/release_notes/3.43.0.txt +0 -34
  49. data/doc/release_notes/3.44.0.txt +0 -23
  50. data/doc/release_notes/3.45.0.txt +0 -22
  51. data/doc/release_notes/3.46.0.txt +0 -19
  52. data/doc/release_notes/3.47.0.txt +0 -13
  53. data/doc/release_notes/3.48.0.txt +0 -10
  54. data/doc/release_notes/3.49.0.txt +0 -18
  55. data/doc/release_notes/3.5.0.txt +0 -31
  56. data/doc/release_notes/3.50.0.txt +0 -21
  57. data/doc/release_notes/3.51.0.txt +0 -20
  58. data/doc/release_notes/3.52.0.txt +0 -20
  59. data/doc/release_notes/3.53.0.txt +0 -14
  60. data/doc/release_notes/3.54.0.txt +0 -48
  61. data/doc/release_notes/3.55.0.txt +0 -12
  62. data/doc/release_notes/3.56.0.txt +0 -33
  63. data/doc/release_notes/3.57.0.txt +0 -34
  64. data/doc/release_notes/3.58.0.txt +0 -16
  65. data/doc/release_notes/3.59.0.txt +0 -17
  66. data/doc/release_notes/3.6.0.txt +0 -21
  67. data/doc/release_notes/3.60.0.txt +0 -56
  68. data/doc/release_notes/3.61.0.txt +0 -24
  69. data/doc/release_notes/3.62.0.txt +0 -41
  70. data/doc/release_notes/3.63.0.txt +0 -36
  71. data/doc/release_notes/3.64.0.txt +0 -26
  72. data/doc/release_notes/3.65.0.txt +0 -12
  73. data/doc/release_notes/3.66.0.txt +0 -23
  74. data/doc/release_notes/3.67.0.txt +0 -25
  75. data/doc/release_notes/3.68.0.txt +0 -21
  76. data/doc/release_notes/3.69.0.txt +0 -33
  77. data/doc/release_notes/3.7.0.txt +0 -123
  78. data/doc/release_notes/3.70.0.txt +0 -19
  79. data/doc/release_notes/3.71.0.txt +0 -33
  80. data/doc/release_notes/3.72.0.txt +0 -48
  81. data/doc/release_notes/3.73.0.txt +0 -33
  82. data/doc/release_notes/3.74.0.txt +0 -28
  83. data/doc/release_notes/3.75.0.txt +0 -19
  84. data/doc/release_notes/3.76.0.txt +0 -18
  85. data/doc/release_notes/3.77.0.txt +0 -8
  86. data/doc/release_notes/3.78.0.txt +0 -99
  87. data/doc/release_notes/3.79.0.txt +0 -148
  88. data/doc/release_notes/3.8.0.txt +0 -27
  89. data/doc/release_notes/3.80.0.txt +0 -31
  90. data/doc/release_notes/3.81.0.txt +0 -24
  91. data/doc/release_notes/3.82.0.txt +0 -43
  92. data/doc/release_notes/3.83.0.txt +0 -6
  93. data/doc/release_notes/3.9.0.txt +0 -67
@@ -1,15 +0,0 @@
1
- = Improvements
2
-
3
- * The common_logger plugin now includes the SCRIPT_NAME when
4
- logging, for greater compatibility with typical web server
5
- logs.
6
-
7
- * The exception_page plugin now handles invalid POST data.
8
- Previously, invalid POST data would cause the exception page
9
- display to raise an exception.
10
-
11
- * An error is now raised if trying to load a plugin that is not a
12
- module or a recognized plugin symbol.
13
-
14
- * Specs and older release notes are no longer shipped in the
15
- gem, reducing gem size by over 35%.
@@ -1,291 +0,0 @@
1
- = New Features
2
-
3
- * A typecast_params plugin has been added for handling the
4
- conversion of params to the expected type. This plugin is
5
- recommended for all applications that deal with submitted
6
- parameters.
7
-
8
- Submitted parameters should be considered untrusted input, and in
9
- standard use with browsers, parameters are submitted as strings
10
- (or a hash/array containing strings). In most cases it makes sense
11
- to explicitly convert the parameter to the desired type. While this
12
- can be done via manual conversion:
13
-
14
- key = request.params['key'].to_i
15
- key = nil unless key > 0
16
-
17
- the typecast_params plugin adds a friendlier interface:
18
-
19
- key = typecast_params.pos_int('key')
20
-
21
- As typecast_params is a fairly long method name, you may want to
22
- consider aliasing it to something more terse in your application,
23
- such as tp.
24
-
25
- One advantage of using typecast_params is that access or conversion
26
- errors are raised as a specific exception class
27
- (Roda::RodaPlugins::TypecastParams::Error). This allows you to
28
- handle this specific exception class globally and return an
29
- appropriate 4xx response to the client. You can use the
30
- Error#param_name and Error#reason methods to get more information
31
- about the error.
32
-
33
- typecast_params offers support for default values:
34
-
35
- key = typecast_params.pos_int('key', 1)
36
-
37
- The default value is only used if no value has been submitted for
38
- the parameter, or if the conversion of the value results in nil.
39
- Handling defaults for parameter conversion manually is more
40
- difficult, since the parameter may not be present at all, or it may
41
- be present but an empty string because the user did not enter a
42
- value on the related form. Use of typecast_params for the
43
- conversion handles both cases.
44
-
45
- In many cases, parameters should be required, and if they aren't
46
- submitted, that should be considered an error. typecast_params
47
- handles this with ! methods:
48
-
49
- key = typecast_params.pos_int!('key')
50
-
51
- These ! methods raise an error instead of returning nil, and do not
52
- allow defaults.
53
-
54
- To make it easy to handle cases where many parameters need the same
55
- conversion done, you can pass an array of keys to a conversion
56
- method, and it will return an array of converted values:
57
-
58
- key1, key2 = typecast_params.pos_int(['key1', 'key2'])
59
-
60
- This is equivalent to:
61
-
62
- key1 = typecast_params.pos_int('key1')
63
- key2 = typecast_params.pos_int('key2')
64
-
65
- The ! methods also support arrays of keys, ensuring that all
66
- parameters have a value:
67
-
68
- key1, key2 = typecast_params.pos_int!(['key1', 'key2'])
69
-
70
- For handling of array parameters, where all entries in the array
71
- use the same conversion, there is an array method which takes the
72
- type as the first argument and the keys to convert as the second
73
- argument:
74
-
75
- keys = typecast_params.array(:pos_int, 'keys')
76
-
77
- If you want to ensure that all entries in the array are converted
78
- successfully and that there is a value for the array itself, you
79
- can use array!:
80
-
81
- keys = typecast_params.array!(:pos_int, 'keys')
82
-
83
- This will raise an exception if any of the values in the array for
84
- parameter keys cannot be converted to a positive integer.
85
-
86
- Both array and array! support default values which are used if no
87
- value is present for the parameter:
88
-
89
- keys = typecast_params.array(:pos_int, 'keys', [])
90
- keys = typecast_params.array!(:pos_int, 'keys', [])
91
-
92
- You can also pass an array of keys to array or array!, if you would
93
- like to perform the same conversion on multiple arrays:
94
-
95
- foo_ids, bar_ids = typecast_params.array!(:pos_int, ['foo_ids', 'bar_ids'])
96
-
97
- The previous examples have shown use of the pos_int method, which
98
- uses to_i to convert the value to an integer, but returns nil if the
99
- resulting integer is not positive. Unless you need to handle
100
- negative numbers, it is recommended to use pos_int instead of int as
101
- int will convert invalid values to 0 (since that is how
102
- <tt>String#to_i</tt> works).
103
-
104
- There are many built in methods for type conversion:
105
-
106
- any :: Returns the value as is without conversion
107
- str :: Raises if value is not already a string
108
- nonempty_str :: Raises if value is not already a string, and
109
- converts the empty string or string containing only
110
- whitespace to nil
111
- bool :: Converts entry to boolean if in one of the recognized
112
- formats (case insensitive for strings):
113
- nil :: nil, ''
114
- true :: true, 1, '1', 't', 'true', 'yes', 'y', 'on'
115
- false :: false, 0, '0', 'f', 'false', 'no', 'n', 'off'
116
- If not in one of those formats, raises an error.
117
- int :: Converts value to integer using to_i (note that invalid
118
- input strings will be converted to 0)
119
- pos_int :: Converts value using to_i, but non-positive values
120
- are converted to nil
121
- Integer :: Converts value to integer using
122
- Kernel::Integer(value, 10)
123
- float :: Converts value to float using to_f (note that invalid
124
- input strings will be converted to 0.0)
125
- Float :: Converts value to float using Kernel::Float(value)
126
- Hash :: Raises if value is not already a hash
127
- date :: Converts value to Date using Date.parse(value)
128
- time :: Converts value to Time using Time.parse(value)
129
- datetime :: Converts value to DateTime using DateTime.parse(value)
130
- file :: Raises if value is not already a hash with a :tempfile key
131
- whose value responds to read (this is the format rack uses
132
- for uploaded files).
133
-
134
- All of these methods also support ! methods (e.g. pos_int!), and all
135
- of them can be used in the array and array! methods to support
136
- arrays of values.
137
-
138
- Since parameter hashes can be nested, the [] method can be used to
139
- access nested
140
- hashes:
141
-
142
- # params: {'key'=>{'sub_key'=>'1'}}
143
- typecast_params['key'].pos_int!('sub_key') # => 1
144
-
145
- This works to an arbitrary depth:
146
-
147
- # params: {'key'=>{'sub_key'=>{'sub_sub_key'=>'1'}}}
148
- typecast_params['key']['sub_key'].pos_int!('sub_sub_key') # => 1
149
-
150
- And also works with arrays at any depth, if those arrays contain
151
- hashes:
152
-
153
- # params: {'key'=>[{'sub_key'=>{'sub_sub_key'=>'1'}}]}
154
- typecast_params['key'][0]['sub_key'].pos_int!('sub_sub_key') # => 1
155
-
156
- # params: {'key'=>[{'sub_key'=>['1']}]}
157
- typecast_params['key'][0].array!(:pos_int, 'sub_key') # => [1]
158
-
159
- To allow easier access to nested data, there is a dig method:
160
-
161
- typecast_params.dig(:pos_int, 'key', 'sub_key')
162
- typecast_params.dig(:pos_int, 'key', 0, 'sub_key', 'sub_sub_key')
163
-
164
- dig will return nil if any access while looking up the nested value
165
- returns nil. There is also a dig! method, which will raise an Error
166
- if dig would return nil:
167
-
168
- typecast_params.dig!(:pos_int, 'key', 'sub_key')
169
- typecast_params.dig!(:pos_int, 'key', 0, 'sub_key', 'sub_sub_key')
170
-
171
- Note that none of these conversion methods modify request.params.
172
- They purely do the conversion and return the converted value.
173
- However, in some cases it is useful to do all the conversion up
174
- front, and then pass a hash of converted parameters to an internal
175
- method that expects to receive values in specific types. The
176
- convert! method does this, and there is also a convert_each! method
177
- designed for converting multiple values using the same block:
178
-
179
- converted_params = typecast_params.convert! do |tp|
180
- tp.int('page')
181
- tp.pos_int!('artist_id')
182
- tp.array!(:pos_int, 'album_ids')
183
- tp.convert!('sales') do |stp|
184
- tp.pos_int!(['num_sold', 'num_shipped'])
185
- end
186
- tp.convert!('members') do |mtp|
187
- mtp.convert_each! do |stp|
188
- stp.str!(['first_name', 'last_name'])
189
- end
190
- end
191
- end
192
-
193
- # converted_params:
194
- # {
195
- # 'page' => 1,
196
- # 'artist_id' => 2,
197
- # 'album_ids' => [3, 4],
198
- # 'sales' => {
199
- # 'num_sold' => 5,
200
- # 'num_shipped' => 6
201
- # },
202
- # 'members' => [
203
- # {'first_name' => 'Foo', 'last_name' => 'Bar'},
204
- # {'first_name' => 'Baz', 'last_name' => 'Quux'}
205
- # ]
206
- # }
207
-
208
- convert! and convert_each! only return values you explicitly specify
209
- for conversion inside the passed block.
210
-
211
- You can specify the :symbolize option to convert! or convert_each!,
212
- which will symbolize the resulting hash keys:
213
-
214
- converted_params = typecast_params.convert!(symbolize: true) do |tp|
215
- tp.int('page')
216
- tp.pos_int!('artist_id')
217
- tp.array!(:pos_int, 'album_ids')
218
- tp.convert!('sales') do |stp|
219
- tp.pos_int!(['num_sold', 'num_shipped'])
220
- end
221
- tp.convert!('members') do |mtp|
222
- mtp.convert_each! do |stp|
223
- stp.str!(['first_name', 'last_name'])
224
- end
225
- end
226
- end
227
-
228
- # converted_params:
229
- # {
230
- # :page => 1,
231
- # :artist_id => 2,
232
- # :album_ids => [3, 4],
233
- # :sales => {
234
- # :num_sold => 5,
235
- # :num_shipped => 6
236
- # },
237
- # :members => [
238
- # {:first_name => 'Foo', :last_name => 'Bar'},
239
- # {:first_name => 'Baz', :last_name => 'Quux'}
240
- # ]
241
- # }
242
-
243
- Using the :symbolize option makes it simpler to transition from
244
- untrusted external data (string keys), to trusted data that can be
245
- used internally (trusted in the sense that the expected types are
246
- used).
247
-
248
- Note that if there are multiple conversion errors raised inside a
249
- convert! or convert_each! block, they are recorded and a single
250
- Roda::RodaPlugins::TypecastParams::Error instance is raised after
251
- processing the block. TypecastParams::Error#param_names can be
252
- called on the exception to get an array of all parameter names
253
- with conversion issues, and TypecastParams::Error#all_errors
254
- can be used to get an array of all Error instances.
255
-
256
- Because of how convert! and convert_each! work, you should avoid
257
- calling TypecastParams::Params#[] inside the block you pass to
258
- these methods, because if the #[] call fails, it will skip the
259
- reminder of the block.
260
-
261
- Be aware that when you use convert! and convert_each!, the
262
- conversion methods called inside the block may return nil if there
263
- is a error raised, and nested calls to convert! and convert_each!
264
- may not return values.
265
-
266
- When loading the typecast_params plugin, a subclass of
267
- TypecastParams::Params is created specific to the Roda application.
268
- You can add support for custom types by passing a block when loading
269
- the typecast_params plugin. This block is executed in the context
270
- of the subclass, and calling handle_type in the block can be used to
271
- add conversion methods. handle_type accepts a type name and the
272
- block used to convert the type:
273
-
274
- plugin :typecast_params do
275
- handle_type(:album) do |value|
276
- if id = convert_pos_int(val)
277
- Album[id]
278
- end
279
- end
280
- end
281
-
282
- By default, the typecast_params conversion procs are passed the
283
- parameter value directly from request.params without modification.
284
- In some cases, it may be beneficial to strip leading and trailing
285
- whitespace from parameter string values before processing, which
286
- you can do by passing the strip: :all> option when loading the
287
- plugin.
288
-
289
- By design, typecast_params only deals with string keys, it is not
290
- possible to use symbol keys as arguments to the conversion methods
291
- and have them converted.
@@ -1,14 +0,0 @@
1
- = New Features
2
-
3
- * A :relative_paths plugin option has been added to the assets
4
- plugin. This option makes the paths to the asset files in the
5
- link and script tags relative paths instead of absolute paths.
6
-
7
- = Other Improvements
8
-
9
- * The :header matcher in the header_matchers plugin now works
10
- correctly for the Content-Type and Content-Length headers, which
11
- are not prefixed with HTTP_ in the rack environment.
12
-
13
- * The run_append_slash and run_handler plugins now work correctly
14
- when used together.
@@ -1,11 +0,0 @@
1
- = New Features
2
-
3
- * A relative_path plugin has been added, adding a relative_path
4
- method that will take an absolute path and make it relative to the
5
- current request by prepending an appropriate prefix. This is
6
- helpful when using Roda as a static site generator to generate a
7
- site that can be hosted at any subpath or directly from the
8
- filesystem.
9
-
10
- * In the path plugin, the path method now accepts a :relative
11
- option for generating relative paths instead of absolute paths.
@@ -1,42 +0,0 @@
1
- = New Features
2
-
3
- * render_each in the render_each plugin now automatically handles
4
- template names with subdirectories and extensions. Previously, these
5
- caused issues unless the :local option was provided. So now you
6
- can use:
7
-
8
- render_each(foos, "items/foo")
9
-
10
- instead of:
11
-
12
- render_each(foos, "items/foo", :local=>:foo)
13
-
14
- * each_partial has been added to the partials plugin. It operates
15
- similarly to render_each, but uses the convention for partial
16
- template naming. So this:
17
-
18
- each_partial(foos, "items/foo")
19
-
20
- is the same as:
21
-
22
- render_each(foos, "items/_foo", :local=>:foo)
23
-
24
- = Other Improvements
25
-
26
- * The :dependencies option in the assets plugin now works correctly
27
- with compiled templates in the render plugin in uncached mode
28
- (the default in development). Previously, modifying a dependency
29
- file would not result in recompiling the asset template when
30
- requesting the main file.
31
-
32
- * Method visibility issues in the following plugins have been fixed:
33
-
34
- * content_security_policy
35
- * default_headers
36
- * indifferent_params
37
- * placeholder_string_matchers
38
- * symbol_matchers
39
-
40
- Previously, these plugins made private methods public by mistake
41
- when overriding them. Additionally, Roda.freeze no longer changes
42
- the visibility of the set_default_headers private method.
@@ -1,8 +0,0 @@
1
- = New Features
2
-
3
- * The path plugin now supports a url method, allowing for returning
4
- the entire URL instead of just the path for class-based paths.
5
-
6
- * The public plugin now supports a :brotli option that will directly
7
- serve brotli-compressed files (with .br extension) similar to how the
8
- :gzip option directly serves gzipped files (with the .gz extension).
@@ -1,17 +0,0 @@
1
- = Improvements
2
-
3
- * Multiple unneeded conditionals have been removed.
4
-
5
- * pre_content and post_context sections in backtraces are no longer
6
- included in the exception_page plugin output if they would be
7
- empty.
8
-
9
- * The match_affix plugin can be loaded again with a single argument.
10
- It was originally designed to accept a single argument, but a bug
11
- introduced in 2.29.0 made it require two arguments.
12
-
13
- * Core Roda and all plugins that ship with Roda now have 100% branch
14
- coverage.
15
-
16
- * The sinatra_helpers plugin no longer emits statement not reached
17
- warnings in verbose mode.
@@ -1,12 +0,0 @@
1
- = New Features
2
-
3
- * An r plugin has been added. This plugin adds an r method for the
4
- request, useful for allowing the use of r.halt and r.redirect even
5
- in methods where the r local variable is not in scope.
6
-
7
- = Other Improvements
8
-
9
- * Attempting to load a plugin with an argument or block when the plugin
10
- does not accept arguments or a block now warns. This is because a
11
- future update to support a block or an optional argument could break
12
- the call.
@@ -1,17 +0,0 @@
1
- = New Features
2
-
3
- * A multi_public plugin has been added, which allows serving static
4
- files from multiple separate directories. This is especially
5
- useful when there are different access control requirements per
6
- directory.
7
-
8
- * The content_security_policy now supports a
9
- content_security_policy.report_to method to set the
10
- report-to directive.
11
-
12
- = Other Improvements
13
-
14
- * When using the type_routing plugin and performing type routing
15
- using the Accept request header, the Vary response header will be
16
- added or updated so that http caches do not cache a response for one
17
- type and serve it for a different type.
@@ -1,42 +0,0 @@
1
- = New Features
2
-
3
- * A custom_matchers plugin has been added, which allows using
4
- arbitrary objects as matchers, as long as the matcher has been
5
- registered. You can register matchers using the custom_matcher
6
- class method, which takes the class of the matcher, and a block
7
- which is yielded the matcher object. The block should return
8
- nil or false if the matcher doesn't match, and any other value
9
- if the matcher does match. Example:
10
-
11
- plugin :custom_matchers
12
- method_segment = Struct.new(:request_method, :next_segment)
13
- custom_matcher(method_segment) do |matcher|
14
- # self is the request instance ("r" yielded in the route block below)
15
- if matcher.request_method == self.request_method
16
- match(matcher.next_segment)
17
- end
18
- end
19
-
20
- get_foo = method_segment.new('GET', 'foo')
21
- post_any = method_segment.new('POST', String)
22
- route do |r|
23
- r.on('baz') do
24
- r.on(get_foo) do
25
- # GET method, /baz/foo prefix
26
- end
27
-
28
- r.is(post_any) do |seg|
29
- # for POST /baz/bar, seg is "bar"
30
- end
31
- end
32
-
33
- r.on('quux') do
34
- r.is(get_foo) do
35
- # GET method, /quux/foo route
36
- end
37
-
38
- r.on(post_any) do |seg|
39
- # for POST /quux/xyz, seg is "xyz"
40
- end
41
- end
42
- end
@@ -1,5 +0,0 @@
1
- = Improvements
2
-
3
- * The error_email and error_mail plugins now rescue invalid parameter
4
- errors when preparing the email body, because you generally don't
5
- want your error handler to raise an exception.
@@ -1,16 +0,0 @@
1
- = Improvements
2
-
3
- * The relative_path plugin is now faster if you are calling
4
- relative_path or relative_prefix more than once when handling a
5
- request.
6
-
7
- * The typecast_params.convert! method in the typecast_params plugin
8
- now handles explicit nil values the same as missing values.
9
- Explicit nil values do not generally occur in normal Rack parameter
10
- parsing, but they can occur when using the json_parser plugin to
11
- parse JSON requests.
12
-
13
- * Roda now avoids method redefinition warnings in verbose mode by
14
- using a self alias. As Ruby 3 is dropping uninitialized instance
15
- variable warnings, Roda will be verbose warning free if you are
16
- using Ruby 3.
@@ -1,24 +0,0 @@
1
- = New Features
2
-
3
- * A middleware_stack plugin has been added for more detailed control
4
- over middleware, allowing for the removal of middleware and the
5
- insertion of middleware before existing middleware. Example:
6
-
7
- plugin :middleware_stack
8
-
9
- # Remove csrf middleware
10
- middleware_stack.remove{|m, *args| m == Rack::Csrf}
11
-
12
- # Insert csrf middleware before logger middleware
13
- middleware_stack.before{|m, *args| m == Rack::CommonLogger}.
14
- use(Rack::Csrf, raise: true)
15
-
16
- # Insert csrf middleware after logger middleware
17
- middleware_stack.after{|m, *args| m == Rack::CommonLogger}.
18
- use(Rack::Csrf, raise: true)
19
-
20
- = Other Improvements
21
-
22
- * The head plugin now calls close on the response body if the body
23
- responds to close. Previously an existing response body was
24
- just ignored.
@@ -1,24 +0,0 @@
1
- = New Features
2
-
3
- * A precompile_views method has been added to the
4
- precompile_templates plugin. This method works with Roda's
5
- optimized compiled view methods, allowing additional memory
6
- sharing between parent and child processes.
7
-
8
- * A freeze_template_caches! method has been added to the
9
- precompile_templates plugin. This freezes the template caches,
10
- preventing the compilation of additional templates, useful for
11
- enforcing that only precompiled templates are used. Additionally,
12
- this speeds up access to the template caches.
13
-
14
- * RodaCache#freeze now returns the frozen internal hash, which can
15
- then be accessed without a mutex. Previously, freeze only froze
16
- the receiver and not the internal hash, so it didn't have the
17
- expected effect.
18
-
19
- = Other Improvements
20
-
21
- * The view method in the render plugin is now faster in most cases
22
- when a single argument is used. When freezing the application,
23
- an additional optimization is performed to increase the
24
- performance of the view method even further.
@@ -1,9 +0,0 @@
1
- = Improvements
2
-
3
- * The performance of the render plugin's view method when passed the
4
- :content option and no other options or arguments has been improved
5
- by about 3x, by calling compiled template methods directly.
6
-
7
- * The compiled template method for the layout is cleared when the
8
- render plugin is loaded again, which can fix issues when it is
9
- loaded with different options that affect the layout.
@@ -1,21 +0,0 @@
1
- = New Features
2
-
3
- * A recheck_precompiled_assets plugin has been added, which allows
4
- for checking for updates to the precompiled asset metadata file,
5
- and automatically using the updated data.
6
-
7
- * The common_logger plugin now supports a :method plugin option to
8
- specify the method to call on the logger.
9
-
10
- = Other Improvements
11
-
12
- * Plugins and middleware that use keyword arguments are now supported
13
- in Ruby 3.
14
-
15
- * The compile_assets class method in the assets plugin now uses an
16
- atomic approach to writing the precompiled asset metadata file.
17
-
18
- * Minor method visibility issues have been fixed. The custom_matchers
19
- plugin no longer makes the unsupported_matcher request method
20
- public, and the render plugin no longer makes the _layout_method
21
- public when the application is frozen.
@@ -1,34 +0,0 @@
1
- = New Features
2
-
3
- * A host_authorization plugin has been added to verify the requested
4
- Host header is authorized. Using it can prevent DNS rebinding
5
- attacks in cases where the application can receive requests for
6
- arbitrary hosts.
7
-
8
- To check for authorized hosts in your routing tree, you call the
9
- check_host_authorization! method. For example, if you want to
10
- check for authorized hosts after serving requests for public
11
- files, you could do:
12
-
13
- plugin :public
14
- plugin :host_authorization, 'my-domain-name.example.com'
15
-
16
- route do |r|
17
- r.public
18
- check_host_authorized!
19
-
20
- # ... rest of routing tree
21
- end
22
-
23
- In addition to handling single domain names via a string, you can
24
- provide an array of domain names, a regexp to match again, or a
25
- proc.
26
-
27
- By default, requests using unauthorized hosts receive an empty 403
28
- response. If you would like to customize the response, you can
29
- pass a block when loading the plugin:
30
-
31
- plugin :host_authorization, 'my-domain-name.example.com' do |r|
32
- response.status = 403
33
- "Response Body Here"
34
- end
@@ -1,23 +0,0 @@
1
- = New Features
2
-
3
- * An optimized_segment_matchers plugin has been added that offers
4
- very fast matchers for arbitrary segments (the same segments
5
- that would be matched by the String class matcher). The
6
- on_segment method it offers accepts no arguments and yields
7
- the next segment if there is a segment. The is_segment method
8
- is similar, but only yields if the next segment is the final
9
- segment.
10
-
11
- = Other Improvements
12
-
13
- * The send_file and attachment methods in the sinatra_helpers plugin
14
- now support RFC 5987 UTF-8 and ISO-8859-1 encoded filenames,
15
- allowing modern browsers to save files with encoded chracters. For
16
- older browsers that do not support RFC 5987, unsupported characters
17
- in filenames are replaced with dashes. This is considered to be an
18
- improvement over the previous behavior of using Ruby's inspect
19
- output for the filename, which could contain backslashes (backslash
20
- is not an allowed chracter in Windows filenames).
21
-
22
- * The performance of the String class matcher has been slightly
23
- improved.
@@ -1,22 +0,0 @@
1
- = Improvements
2
-
3
- * The typecast_params plugin checks now checks for null bytes by
4
- default before typecasting. If null bytes are present, it raises
5
- an error. Most applications do not require null bytes in
6
- parameters, and in some cases allowing them can lead to security
7
- issues, especially when parameters are passed to C extensions.
8
- In general, the benefit of forbidding null bytes in parameters is
9
- greater than the cost.
10
-
11
- If you would like to continue allowing null bytes, use the
12
- :allow_null_bytes option when loading the plugin.
13
-
14
- Note that this change does not affect uploaded files, since those
15
- are expected to contain null bytes.
16
-
17
- = Backwards Compatibility
18
-
19
- * The change to the typecast_params plugin to raise an error for
20
- null bytes can break applications that are expecting null bytes
21
- to be passed in parameters. Such applications should use the
22
- :allow_null_bytes option when loading the plugin.