rack 2.2.8.1 → 3.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +301 -81
  3. data/CONTRIBUTING.md +63 -55
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +328 -0
  6. data/SPEC.rdoc +204 -131
  7. data/lib/rack/auth/abstract/handler.rb +3 -1
  8. data/lib/rack/auth/abstract/request.rb +3 -1
  9. data/lib/rack/auth/basic.rb +1 -4
  10. data/lib/rack/bad_request.rb +8 -0
  11. data/lib/rack/body_proxy.rb +21 -3
  12. data/lib/rack/builder.rb +102 -69
  13. data/lib/rack/cascade.rb +2 -3
  14. data/lib/rack/common_logger.rb +23 -18
  15. data/lib/rack/conditional_get.rb +18 -15
  16. data/lib/rack/constants.rb +67 -0
  17. data/lib/rack/content_length.rb +12 -16
  18. data/lib/rack/content_type.rb +8 -5
  19. data/lib/rack/deflater.rb +40 -26
  20. data/lib/rack/directory.rb +9 -3
  21. data/lib/rack/etag.rb +14 -23
  22. data/lib/rack/events.rb +4 -0
  23. data/lib/rack/files.rb +15 -17
  24. data/lib/rack/head.rb +9 -8
  25. data/lib/rack/headers.rb +238 -0
  26. data/lib/rack/lint.rb +838 -644
  27. data/lib/rack/lock.rb +2 -5
  28. data/lib/rack/logger.rb +3 -0
  29. data/lib/rack/method_override.rb +5 -1
  30. data/lib/rack/mime.rb +14 -5
  31. data/lib/rack/mock.rb +1 -271
  32. data/lib/rack/mock_request.rb +171 -0
  33. data/lib/rack/mock_response.rb +124 -0
  34. data/lib/rack/multipart/generator.rb +7 -5
  35. data/lib/rack/multipart/parser.rb +215 -90
  36. data/lib/rack/multipart/uploaded_file.rb +4 -0
  37. data/lib/rack/multipart.rb +53 -40
  38. data/lib/rack/null_logger.rb +9 -0
  39. data/lib/rack/query_parser.rb +81 -102
  40. data/lib/rack/recursive.rb +2 -0
  41. data/lib/rack/reloader.rb +0 -2
  42. data/lib/rack/request.rb +250 -123
  43. data/lib/rack/response.rb +146 -66
  44. data/lib/rack/rewindable_input.rb +24 -5
  45. data/lib/rack/runtime.rb +7 -6
  46. data/lib/rack/sendfile.rb +30 -25
  47. data/lib/rack/show_exceptions.rb +21 -4
  48. data/lib/rack/show_status.rb +17 -7
  49. data/lib/rack/static.rb +8 -8
  50. data/lib/rack/tempfile_reaper.rb +15 -4
  51. data/lib/rack/urlmap.rb +3 -1
  52. data/lib/rack/utils.rb +232 -233
  53. data/lib/rack/version.rb +1 -9
  54. data/lib/rack.rb +13 -89
  55. metadata +15 -41
  56. data/README.rdoc +0 -320
  57. data/Rakefile +0 -130
  58. data/bin/rackup +0 -5
  59. data/contrib/rack.png +0 -0
  60. data/contrib/rack.svg +0 -150
  61. data/contrib/rack_logo.svg +0 -164
  62. data/contrib/rdoc.css +0 -412
  63. data/example/lobster.ru +0 -6
  64. data/example/protectedlobster.rb +0 -16
  65. data/example/protectedlobster.ru +0 -10
  66. data/lib/rack/auth/digest/md5.rb +0 -131
  67. data/lib/rack/auth/digest/nonce.rb +0 -54
  68. data/lib/rack/auth/digest/params.rb +0 -54
  69. data/lib/rack/auth/digest/request.rb +0 -43
  70. data/lib/rack/chunked.rb +0 -117
  71. data/lib/rack/core_ext/regexp.rb +0 -14
  72. data/lib/rack/file.rb +0 -7
  73. data/lib/rack/handler/cgi.rb +0 -59
  74. data/lib/rack/handler/fastcgi.rb +0 -100
  75. data/lib/rack/handler/lsws.rb +0 -61
  76. data/lib/rack/handler/scgi.rb +0 -71
  77. data/lib/rack/handler/thin.rb +0 -36
  78. data/lib/rack/handler/webrick.rb +0 -129
  79. data/lib/rack/handler.rb +0 -104
  80. data/lib/rack/lobster.rb +0 -70
  81. data/lib/rack/server.rb +0 -466
  82. data/lib/rack/session/abstract/id.rb +0 -523
  83. data/lib/rack/session/cookie.rb +0 -204
  84. data/lib/rack/session/memcache.rb +0 -10
  85. data/lib/rack/session/pool.rb +0 -85
  86. data/rack.gemspec +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7707e75748cda81d20950b3a934018fdc136c5e4c9b551911bdb993418adf31c
4
- data.tar.gz: 7a87520904eb86c7e1761d2895e0ed3c11bb2bded7cbd7d716e75488e27f9b37
3
+ metadata.gz: 3c10c6fa362f15e1169822a88e4fe9edfa36b01e48ba5d338bf55e94889a097f
4
+ data.tar.gz: c205f62d2490fda13b70cc5d0b3be62af5cad3efa950d5ceabc0e1980d3fef83
5
5
  SHA512:
6
- metadata.gz: c38c9c18ec842262eeb25e1c06bbfe0c6b7ef5f74ee43f9952105a53e96d9dfaead4c0786a0a9f2bb999004d45d738e05104b9e3c612f16b35a30b6441afa2e6
7
- data.tar.gz: 890b77739013bc80a83a74c2ecc112dfdd8a68a090d831f7ca3ea5106cf5cad1d61baf4df0c2d39bef3cb3b37e1bb30f44109d8e85ceded57345611090f85a75
6
+ metadata.gz: 466e3dd3536d81196d86f1cc0a3fa8e833cfe96b523843160aef33267aab0e0e46501d5f163f2a72d4e3401385c43312237f67da26932b2d192c9d1bfb3dcfdc
7
+ data.tar.gz: 3bcf798901aeaa5a94524864925160077f07ac26ebaa9e3ad6b080afbe45fb0a7f1f9ee89d990720aeae7d5b8dd73e2e1bf82a264323649219b59682b56cc09a
data/CHANGELOG.md CHANGED
@@ -2,38 +2,245 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
- ## [2.2.7] - 2023-03-13
5
+ ## [3.1.5] - 2024-07-02
6
6
 
7
- - Correct the year number in the changelog ([#2015](https://github.com/rack/rack/pull/2015), [@kimulab](https://github.com/kimulab))
8
- - Support underscore in host names for Rack 2.2 (Fixes [#2070](https://github.com/rack/rack/issues/2070)) ([#2015](https://github.com/rack/rack/pull/2071), [@jeremyevans](https://github.com/jeremyevans))
7
+ ### Security
8
+
9
+ - Fix potential ReDoS attack in `Rack::Request#parse_http_accept_header`. ([GHSA-cj83-2ww7-mvq7](https://github.com/rack/rack/security/advisories/GHSA-cj83-2ww7-mvq7), [@dwisiswant0](https://github.com/dwisiswant0))
10
+
11
+ ## [3.1.4] - 2024-06-22
12
+
13
+ ### Fixed
14
+
15
+ - Fix `Rack::Lint` matching some paths incorrectly as authority form. ([#2220](https://github.com/rack/rack/pull/2220), [@ioquatix])
16
+
17
+ ## [3.1.3] - 2024-06-12
18
+
19
+ ### Fixed
20
+
21
+ - Fix passing non-strings to `Rack::Utils.escape_html`. ([#2202](https://github.com/rack/rack/pull/2202), [@earlopain])
22
+ - `Rack::MockResponse` gracefully handles empty cookies ([#2203](https://github.com/rack/rack/pull/2203) [@wynksaiddestroy](https://github.com/wynksaiddestroy))
23
+
24
+ ## [3.1.2] - 2024-06-11
25
+
26
+ ## Changed
27
+
28
+ - `Rack::Response` will take in to consideration chunked encoding responses ([#2204](https://github.com/rack/rack/pull/2204), [@tenderlove])
29
+
30
+ ## [3.1.1] - 2024-06-11
31
+
32
+ - Oops, I shouldn't have shipped this
33
+
34
+ ## [3.1.0] - 2024-06-11
35
+
36
+ ### SPEC Changes
37
+
38
+ - `rack.input` is now optional. ([#1997](https://github.com/rack/rack/pull/1997), [@ioquatix])
39
+ - `PATH_INFO` is now validated according to the HTTP/1.1 specification. ([#2117](https://github.com/rack/rack/pull/2117), [@ioquatix])
40
+ - `rack.protocol` is an optional environment key and response header for handling connection upgrades.
41
+
42
+ ### Added
43
+
44
+ - Introduce `module Rack::BadRequest` which is included in multipart and query parser errors. ([#2019](https://github.com/rack/rack/pull/2019), [@ioquatix])
45
+ - Add `.mjs` MIME type ([#2057](https://github.com/rack/rack/pull/2057), [@axilleas])
46
+ - `set_cookie_header` utility now supports the `partitioned` cookie attribute. This is required by Chrome in some embedded contexts. ([#2131](https://github.com/rack/rack/pull/2131), [@flavio-b])
47
+ - `rack.early_hints` is now officially supported as an optional feature (already implemented by Unicorn, Puma, and Falcon). ([#1831](https://github.com/rack/rack/pull/1831), [@casperisfine, @jeremyevans])
48
+
49
+ ### Changed
9
50
 
10
- ## [2.2.6.4] - 2023-03-13
51
+ - `rack.input` is now optional, and if missing, will raise an error. Use this to fail on multipart parsing a request without an input body. ([#2018](https://github.com/rack/rack/pull/2018), [@ioquatix])
52
+ - MIME type for JavaScript files (`.js`) changed from `application/javascript` to `text/javascript` ([`1bd0f15`](https://github.com/rack/rack/commit/1bd0f1597d8f4a90d47115f3e156a8ce7870c9c8))
53
+ - Update MIME types associated to `.ttf`, `.woff`, `.woff2` and `.otf` extensions to use mondern `font/*` types. ([#2065](https://github.com/rack/rack/pull/2065), [@davidstosik])
54
+ - `Rack::Utils.escape_html` is now delegated to `CGI.escapeHTML`. `'` is escaped to `#39;` instead of `#x27;`. (decimal vs hexadecimal) ([#2099](https://github.com/rack/rack/pull/2099), [@JunichiIto](https://github.com/JunichiIto))
55
+ - Only cookie keys that are not valid according to the HTTP specifications are escaped. We are planning to deprecate this behaviour, so now a deprecation message will be emitted in this case. In the future, invalid cookie keys may not be accepted. ([#2191](https://github.com/rack/rack/pull/2191), [@ioquatix])
56
+
57
+ ### Removed
58
+
59
+ - Remove non-standard status codes 306, 509, & 510 and update descriptions for 413, 422, & 451. ([#2137](https://github.com/rack/rack/pull/2137), [@wtn])
60
+ - Add fallback lookup and deprecation warning for obsolete status symbols. ([#2137](https://github.com/rack/rack/pull/2137), [@wtn])
61
+ - Deprecate automatic cache invalidation in `Request#{GET,POST}` ([#2073](https://github.com/rack/rack/pull/2073) ([@jeremyevans])
62
+ - `Rack::Logger` is deprecated. ([#2197](https://github.com/rack/rack/pull/2197), [@ioquatix])
63
+
64
+ ### Fixed
65
+
66
+ - In `Rack::Files`, ignore the `Range` header if served file is 0 bytes. ([#2159](https://github.com/rack/rack/pull/2159), [@zarqman])
67
+
68
+ ## [3.0.11] - 2024-05-10
69
+
70
+ - Backport #2062 to 3-0-stable: Do not allow `BodyProxy` to respond to `to_str`, make `to_ary` call close . ([#2062](https://github.com/rack/rack/pull/2062), [@jeremyevans](https://github.com/jeremyevans))
71
+
72
+ ## [3.0.10] - 2024-03-21
73
+
74
+ - Backport #2104 to 3-0-stable: Return empty when parsing a multi-part POST with only one end delimiter. ([#2164](https://github.com/rack/rack/pull/2164), [@JoeDupuis](https://github.com/JoeDupuis))
75
+
76
+ ## [3.0.9.1] - 2024-02-21
77
+
78
+ ### Security
79
+
80
+ * [CVE-2024-26146] Fixed ReDoS in Accept header parsing
81
+ * [CVE-2024-25126] Fixed ReDoS in Content Type header parsing
82
+ * [CVE-2024-26141] Reject Range headers which are too large
83
+
84
+ [CVE-2024-26146]: https://github.com/advisories/GHSA-54rr-7fvw-6x8f
85
+ [CVE-2024-25126]: https://github.com/advisories/GHSA-22f2-v57c-j9cx
86
+ [CVE-2024-26141]: https://github.com/advisories/GHSA-xj5v-6v4g-jfw6
87
+
88
+ ## [3.0.9] - 2024-01-31
89
+
90
+ - Fix incorrect content-length header that was emitted when `Rack::Response#write` was used in some situations. ([#2150](https://github.com/rack/rack/pull/2150), [@mattbrictson](https://github.com/mattbrictson))
91
+
92
+ ## [3.0.8] - 2023-06-14
93
+
94
+ - Fix some unused variable verbose warnings. ([#2084](https://github.com/rack/rack/pull/2084), [@jeremyevans], [@skipkayhil](https://github.com/skipkayhil))
95
+
96
+ ## [3.0.7] - 2023-03-16
97
+
98
+ - Make query parameters without `=` have `nil` values. ([#2059](https://github.com/rack/rack/pull/2059), [@jeremyevans])
99
+
100
+ ## [3.0.6.1] - 2023-03-13
101
+
102
+ ### Security
11
103
 
12
104
  - [CVE-2023-27539] Avoid ReDoS in header parsing
13
105
 
14
- ## [2.2.6.3] - 2023-03-02
106
+ ## [3.0.6] - 2023-03-13
15
107
 
16
- - [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts
108
+ - Add `QueryParser#missing_value` for handling missing values + tests. ([#2052](https://github.com/rack/rack/pull/2052), [@ioquatix])
17
109
 
18
- ## [2.2.6.2] - 2023-01-17
110
+ ## [3.0.5] - 2023-03-13
19
111
 
20
- - [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges
112
+ - Split form/query parsing into two steps. ([#2038](https://github.com/rack/rack/pull/2038), [@matthewd](https://github.com/matthewd))
113
+
114
+ ## [3.0.4.2] - 2023-03-02
115
+
116
+ ### Security
117
+
118
+ - [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts
119
+
120
+ ## [3.0.4.1] - 2023-01-17
21
121
 
22
- ## [2.2.6.1] - 2023-01-17
122
+ ### Security
23
123
 
24
124
  - [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser
125
+ - [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges
25
126
  - [CVE-2022-44572] Forbid control characters in attributes (also ReDoS)
26
127
 
27
- ## [2.2.6] - 2023-01-17
128
+ ## [3.0.4] - 2023-01-17
28
129
 
29
- - Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2011](https://github.com/rack/rack/pull/2011), [@byroot](https://github.com/byroot))
130
+ - `Rack::Request#POST` should consistently raise errors. Cache errors that occur when invoking `Rack::Request#POST` so they can be raised again later. ([#2010](https://github.com/rack/rack/pull/2010), [@ioquatix])
131
+ - Fix `Rack::Lint` error message for `HTTP_CONTENT_TYPE` and `HTTP_CONTENT_LENGTH`. ([#2007](https://github.com/rack/rack/pull/2007), [@byroot](https://github.com/byroot))
132
+ - Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2006](https://github.com/rack/rack/pull/2006), [@byroot](https://github.com/byroot))
30
133
 
31
- ## [2.2.5] - 2022-12-27
134
+ ## [3.0.3] - 2022-12-27
32
135
 
33
136
  ### Fixed
34
137
 
35
138
  - `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng))
36
139
 
140
+ ## [3.0.2] - 2022-12-05
141
+
142
+ ### Fixed
143
+
144
+ - `Utils.build_nested_query` URL-encodes nested field names including the square brackets.
145
+ - Allow `Rack::Response` to pass through streaming bodies. ([#1993](https://github.com/rack/rack/pull/1993), [@ioquatix])
146
+
147
+ ## [3.0.1] - 2022-11-18
148
+
149
+ ### Fixed
150
+
151
+ - `MethodOverride` does not look for an override if a request does not include form/parseable data.
152
+ - `Rack::Lint::Wrapper` correctly handles `respond_to?` with `to_ary`, `each`, `call` and `to_path`, forwarding to the body. ([#1981](https://github.com/rack/rack/pull/1981), [@ioquatix])
153
+
154
+ ## [3.0.0] - 2022-09-06
155
+
156
+ - No changes
157
+
158
+ ## [3.0.0.rc1] - 2022-09-04
159
+
160
+ ### SPEC Changes
161
+
162
+ - Stream argument must implement `<<` https://github.com/rack/rack/pull/1959
163
+ - `close` may be called on `rack.input` https://github.com/rack/rack/pull/1956
164
+ - `rack.response_finished` may be used for executing code after the response has been finished https://github.com/rack/rack/pull/1952
165
+
166
+ ## [3.0.0.beta1] - 2022-08-08
167
+
168
+ ### Security
169
+
170
+ - Do not use semicolon as GET parameter separator. ([#1733](https://github.com/rack/rack/pull/1733), [@jeremyevans])
171
+
172
+ ### SPEC Changes
173
+
174
+ - Response array must now be non-frozen.
175
+ - Response `status` must now be an integer greater than or equal to 100.
176
+ - Response `headers` must now be an unfrozen hash.
177
+ - Response header keys can no longer include uppercase characters.
178
+ - Response header values can be an `Array` to handle multiple values (and no longer supports `\n` encoded headers).
179
+ - Response body can now respond to `#call` (streaming body) instead of `#each` (enumerable body), for the equivalent of response hijacking in previous versions.
180
+ - Middleware must no longer call `#each` on the body, but they can call `#to_ary` on the body if it responds to `#to_ary`.
181
+ - `rack.input` is no longer required to be rewindable.
182
+ - `rack.multithread`/`rack.multiprocess`/`rack.run_once`/`rack.version` are no longer required environment keys.
183
+ - `SERVER_PROTOCOL` is now a required environment key, matching the HTTP protocol used in the request.
184
+ - `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional.
185
+ - `rack.hijack_io` has been removed completely.
186
+ - `rack.response_finished` is an optional environment key which contains an array of callable objects that must accept `#call(env, status, headers, error)` and are invoked after the response is finished (either successfully or unsuccessfully).
187
+ - It is okay to call `#close` on `rack.input` to indicate that you no longer need or care about the input.
188
+ - The stream argument supplied to the streaming body and hijack must support `#<<` for writing output.
189
+
190
+ ### Removed
191
+
192
+ - Remove `rack.multithread`/`rack.multiprocess`/`rack.run_once`. These variables generally come too late to be useful. ([#1720](https://github.com/rack/rack/pull/1720), [@ioquatix], [@jeremyevans]))
193
+ - Remove deprecated Rack::Request::SCHEME_WHITELIST. ([@jeremyevans])
194
+ - Remove internal cookie deletion using pattern matching, there are very few practical cases where it would be useful and browsers handle it correctly without us doing anything special. ([#1844](https://github.com/rack/rack/pull/1844), [@ioquatix])
195
+ - Remove `rack.version` as it comes too late to be useful. ([#1938](https://github.com/rack/rack/pull/1938), [@ioquatix])
196
+ - Extract `rackup` command, `Rack::Server`, `Rack::Handler`, `Rack::Lobster` and related code into a separate gem. ([#1937](https://github.com/rack/rack/pull/1937), [@ioquatix])
197
+
198
+ ### Added
199
+
200
+ - `Rack::Headers` added to support lower-case header keys. ([@jeremyevans])
201
+ - `Rack::Utils#set_cookie_header` now supports `escape_key: false` to avoid key escaping. ([@jeremyevans])
202
+ - `Rack::RewindableInput` supports size. ([@ahorek](https://github.com/ahorek))
203
+ - `Rack::RewindableInput::Middleware` added for making `rack.input` rewindable. ([@jeremyevans])
204
+ - The RFC 7239 Forwarded header is now supported and considered by default when looking for information on forwarding, falling back to the X-Forwarded-* headers. `Rack::Request.forwarded_priority` accessor has been added for configuring the priority of which header to check. ([#1423](https://github.com/rack/rack/issues/1423), [@jeremyevans])
205
+ - Allow response headers to contain array of values. ([#1598](https://github.com/rack/rack/issues/1598), [@ioquatix])
206
+ - Support callable body for explicit streaming support and clarify streaming response body behaviour. ([#1745](https://github.com/rack/rack/pull/1745), [@ioquatix], [#1748](https://github.com/rack/rack/pull/1748), [@wjordan])
207
+ - Allow `Rack::Builder#run` to take a block instead of an argument. ([#1942](https://github.com/rack/rack/pull/1942), [@ioquatix])
208
+ - Add `rack.response_finished` to `Rack::Lint`. ([#1802](https://github.com/rack/rack/pull/1802), [@BlakeWilliams], [#1952](https://github.com/rack/rack/pull/1952), [@ioquatix])
209
+ - The stream argument must implement `#<<`. ([#1959](https://github.com/rack/rack/pull/1959), [@ioquatix])
210
+
211
+ ### Changed
212
+
213
+ - BREAKING CHANGE: Require `status` to be an Integer. ([#1662](https://github.com/rack/rack/pull/1662), [@olleolleolle](https://github.com/olleolleolle))
214
+ - BREAKING CHANGE: Query parsing now treats parameters without `=` as having the empty string value instead of nil value, to conform to the URL spec. ([#1696](https://github.com/rack/rack/issues/1696), [@jeremyevans])
215
+ - Relax validations around `Rack::Request#host` and `Rack::Request#hostname`. ([#1606](https://github.com/rack/rack/issues/1606), [@pvande](https://github.com/pvande))
216
+ - Removed antiquated handlers: FCGI, LSWS, SCGI, Thin. ([#1658](https://github.com/rack/rack/pull/1658), [@ioquatix])
217
+ - Removed options from `Rack::Builder.parse_file` and `Rack::Builder.load_file`. ([#1663](https://github.com/rack/rack/pull/1663), [@ioquatix])
218
+ - `Rack::HTTP_VERSION` has been removed and the `HTTP_VERSION` env setting is no longer set in the CGI and Webrick handlers. ([#970](https://github.com/rack/rack/issues/970), [@jeremyevans])
219
+ - `Rack::Request#[]` and `#[]=` now warn even in non-verbose mode. ([#1277](https://github.com/rack/rack/issues/1277), [@jeremyevans])
220
+ - Decrease default allowed parameter recursion level from 100 to 32. ([#1640](https://github.com/rack/rack/issues/1640), [@jeremyevans])
221
+ - Attempting to parse a multipart response with an empty body now raises Rack::Multipart::EmptyContentError. ([#1603](https://github.com/rack/rack/issues/1603), [@jeremyevans])
222
+ - `Rack::Utils.secure_compare` uses OpenSSL's faster implementation if available. ([#1711](https://github.com/rack/rack/pull/1711), [@bdewater](https://github.com/bdewater))
223
+ - `Rack::Request#POST` now caches an empty hash if input content type is not parseable. ([#749](https://github.com/rack/rack/pull/749), [@jeremyevans])
224
+ - BREAKING CHANGE: Updated `trusted_proxy?` to match full 127.0.0.0/8 network. ([#1781](https://github.com/rack/rack/pull/1781), [@snbloch](https://github.com/snbloch))
225
+ - Explicitly deprecate `Rack::File` which was an alias for `Rack::Files`. ([#1811](https://github.com/rack/rack/pull/1720), [@ioquatix]).
226
+ - Moved `Rack::Session` into [separate gem](https://github.com/rack/rack-session). ([#1805](https://github.com/rack/rack/pull/1805), [@ioquatix])
227
+ - `rackup -D` option to daemonizes no longer changes the working directory to the root. ([#1813](https://github.com/rack/rack/pull/1813), [@jeremyevans])
228
+ - The `x-forwarded-proto` header is now considered before the `x-forwarded-scheme` header for determining the forwarded protocol. `Rack::Request.x_forwarded_proto_priority` accessor has been added for configuring the priority of which header to check. ([#1809](https://github.com/rack/rack/issues/1809), [@jeremyevans])
229
+ - `Rack::Request.forwarded_authority` (and methods that call it, such as `host`) now returns the last authority in the forwarded header, instead of the first, as earlier forwarded authorities can be forged by clients. This restores the Rack 2.1 behavior. ([#1829](https://github.com/rack/rack/issues/1809), [@jeremyevans])
230
+ - Use lower case cookie attributes when creating cookies, and fold cookie attributes to lower case when reading cookies (specifically impacting `secure` and `httponly` attributes). ([#1849](https://github.com/rack/rack/pull/1849), [@ioquatix])
231
+ - The response array must now be mutable (non-frozen) so middleware can modify it without allocating a new Array,therefore reducing object allocations. ([#1887](https://github.com/rack/rack/pull/1887), [#1927](https://github.com/rack/rack/pull/1927), [@amatsuda], [@ioquatix])
232
+ - `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional. `rack.hijack_io` is no longer required/specified. ([#1939](https://github.com/rack/rack/pull/1939), [@ioquatix])
233
+ - Allow calling close on `rack.input`. ([#1956](https://github.com/rack/rack/pull/1956), [@ioquatix])
234
+
235
+ ### Fixed
236
+
237
+ - Make Rack::MockResponse handle non-hash headers. ([#1629](https://github.com/rack/rack/issues/1629), [@jeremyevans])
238
+ - TempfileReaper now deletes temp files if application raises an exception. ([#1679](https://github.com/rack/rack/issues/1679), [@jeremyevans])
239
+ - Handle cookies with values that end in '=' ([#1645](https://github.com/rack/rack/pull/1645), [@lukaso](https://github.com/lukaso))
240
+ - Make `Rack::NullLogger` respond to `#fatal!` [@jeremyevans])
241
+ - Fix multipart filename generation for filenames that contain spaces. Encode spaces as "%20" instead of "+" which will be decoded properly by the multipart parser. ([#1736](https://github.com/rack/rack/pull/1645), [@muirdm](https://github.com/muirdm))
242
+ - `Rack::Request#scheme` returns `ws` or `wss` when one of the `X-Forwarded-Scheme` / `X-Forwarded-Proto` headers is set to `ws` or `wss`, respectively. ([#1730](https://github.com/rack/rack/issues/1730), [@erwanst](https://github.com/erwanst))
243
+
37
244
  ## [2.2.4] - 2022-06-30
38
245
 
39
246
  - Better support for lower case headers in `Rack::ETag` middleware. ([#1919](https://github.com/rack/rack/pull/1919), [@ioquatix](https://github.com/ioquatix))
@@ -46,18 +253,18 @@ All notable changes to this project will be documented in this file. For info on
46
253
  - [CVE-2022-30123] Fix shell escaping issue in Common Logger
47
254
  - [CVE-2022-30122] Restrict parsing of broken MIME attachments
48
255
 
49
- ## [2.2.3] - 2020-02-11
256
+ ## [2.2.3] - 2020-06-15
50
257
 
51
258
  ### Security
52
259
 
53
- - [CVE-2020-8184] Only decode cookie values
260
+ - [[CVE-2020-8184](https://nvd.nist.gov/vuln/detail/CVE-2020-8184)] Do not allow percent-encoded cookie name to override existing cookie names. BREAKING CHANGE: Accessing cookie names that require URL encoding with decoded name no longer works. ([@fletchto99](https://github.com/fletchto99))
54
261
 
55
262
  ## [2.2.2] - 2020-02-11
56
263
 
57
264
  ### Fixed
58
265
 
59
- - Fix incorrect `Rack::Request#host` value. ([#1591](https://github.com/rack/rack/pull/1591), [@ioquatix](https://github.com/ioquatix))
60
- - Revert `Rack::Handler::Thin` implementation. ([#1583](https://github.com/rack/rack/pull/1583), [@jeremyevans](https://github.com/jeremyevans))
266
+ - Fix incorrect `Rack::Request#host` value. ([#1591](https://github.com/rack/rack/pull/1591), [@ioquatix])
267
+ - Revert `Rack::Handler::Thin` implementation. ([#1583](https://github.com/rack/rack/pull/1583), [@jeremyevans])
61
268
  - Double assignment is still needed to prevent an "unused variable" warning. ([#1589](https://github.com/rack/rack/pull/1589), [@kamipo](https://github.com/kamipo))
62
269
  - Fix to handle same_site option for session pool. ([#1587](https://github.com/rack/rack/pull/1587), [@kamipo](https://github.com/kamipo))
63
270
 
@@ -65,105 +272,111 @@ All notable changes to this project will be documented in this file. For info on
65
272
 
66
273
  ### Fixed
67
274
 
68
- - Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix](https://github.com/ioquatix))
275
+ - Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix])
69
276
 
70
277
  ## [2.2.0] - 2020-02-08
71
278
 
72
279
  ### SPEC Changes
73
280
 
74
- - `rack.session` request environment entry must respond to `to_hash` and return unfrozen Hash. ([@jeremyevans](https://github.com/jeremyevans))
75
- - Request environment cannot be frozen. ([@jeremyevans](https://github.com/jeremyevans))
76
- - CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ([@jeremyevans](https://github.com/jeremyevans))
77
- - Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix](https://github.com/ioquatix))
281
+ - `rack.session` request environment entry must respond to `to_hash` and return unfrozen Hash. ([@jeremyevans])
282
+ - Request environment cannot be frozen. ([@jeremyevans])
283
+ - CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ([@jeremyevans])
284
+ - Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix])
78
285
 
79
286
  ### Added
80
287
 
81
- - `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans](https://github.com/jeremyevans))
288
+ - `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans])
82
289
  - `Server` supports an array of paths to require for the `:require` option. ([@khotta](https://github.com/khotta))
83
290
  - `Files` supports multipart range requests. ([@fatkodima](https://github.com/fatkodima))
84
- - `Multipart::UploadedFile` supports an IO-like object instead of using the filesystem, using `:filename` and `:io` options. ([@jeremyevans](https://github.com/jeremyevans))
85
- - `Multipart::UploadedFile` supports keyword arguments `:path`, `:content_type`, and `:binary` in addition to positional arguments. ([@jeremyevans](https://github.com/jeremyevans))
86
- - `Static` supports a `:cascade` option for calling the app if there is no matching file. ([@jeremyevans](https://github.com/jeremyevans))
87
- - `Session::Abstract::SessionHash#dig`. ([@jeremyevans](https://github.com/jeremyevans))
88
- - `Response.[]` and `MockResponse.[]` for creating instances using status, headers, and body. ([@ioquatix](https://github.com/ioquatix))
89
- - Convenient cache and content type methods for `Rack::Response`. ([#1555](https://github.com/rack/rack/pull/1555), [@ioquatix](https://github.com/ioquatix))
291
+ - `Multipart::UploadedFile` supports an IO-like object instead of using the filesystem, using `:filename` and `:io` options. ([@jeremyevans])
292
+ - `Multipart::UploadedFile` supports keyword arguments `:path`, `:content_type`, and `:binary` in addition to positional arguments. ([@jeremyevans])
293
+ - `Static` supports a `:cascade` option for calling the app if there is no matching file. ([@jeremyevans])
294
+ - `Session::Abstract::SessionHash#dig`. ([@jeremyevans])
295
+ - `Response.[]` and `MockResponse.[]` for creating instances using status, headers, and body. ([@ioquatix])
296
+ - Convenient cache and content type methods for `Rack::Response`. ([#1555](https://github.com/rack/rack/pull/1555), [@ioquatix])
90
297
 
91
298
  ### Changed
92
299
 
93
- - `Request#params` no longer rescues EOFError. ([@jeremyevans](https://github.com/jeremyevans))
94
- - `Directory` uses a streaming approach, significantly improving time to first byte for large directories. ([@jeremyevans](https://github.com/jeremyevans))
95
- - `Directory` no longer includes a Parent directory link in the root directory index. ([@jeremyevans](https://github.com/jeremyevans))
96
- - `QueryParser#parse_nested_query` uses original backtrace when reraising exception with new class. ([@jeremyevans](https://github.com/jeremyevans))
97
- - `ConditionalGet` follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ([@jeremyevans](https://github.com/jeremyevans))
300
+ - `Request#params` no longer rescues EOFError. ([@jeremyevans])
301
+ - `Directory` uses a streaming approach, significantly improving time to first byte for large directories. ([@jeremyevans])
302
+ - `Directory` no longer includes a Parent directory link in the root directory index. ([@jeremyevans])
303
+ - `QueryParser#parse_nested_query` uses original backtrace when reraising exception with new class. ([@jeremyevans])
304
+ - `ConditionalGet` follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ([@jeremyevans])
98
305
  - `.ru` files supports the `frozen-string-literal` magic comment. ([@eregon](https://github.com/eregon))
99
- - Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ([@jeremyevans](https://github.com/jeremyevans))
100
- - `Etag` will continue sending ETag even if the response should not be cached. ([@henm](https://github.com/henm))
306
+ - Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ([@jeremyevans])
307
+ - BREAKING CHANGE: `Etag` will continue sending ETag even if the response should not be cached. Streaming no longer works without a workaround, see [#1619](https://github.com/rack/rack/issues/1619#issuecomment-848460528). ([@henm](https://github.com/henm))
101
308
  - `Request#host_with_port` no longer includes a colon for a missing or empty port. ([@AlexWayfer](https://github.com/AlexWayfer))
102
- - All handlers uses keywords arguments instead of an options hash argument. ([@ioquatix](https://github.com/ioquatix))
103
- - `Files` handling of range requests no longer return a body that supports `to_path`, to ensure range requests are handled correctly. ([@jeremyevans](https://github.com/jeremyevans))
104
- - `Multipart::Generator` only includes `Content-Length` for files with paths, and `Content-Disposition` `filename` if the `UploadedFile` instance has one. ([@jeremyevans](https://github.com/jeremyevans))
105
- - `Request#ssl?` is true for the `wss` scheme (secure websockets). ([@jeremyevans](https://github.com/jeremyevans))
106
- - `Rack::HeaderHash` is memoized by default. ([#1549](https://github.com/rack/rack/pull/1549), [@ioquatix](https://github.com/ioquatix))
309
+ - All handlers uses keywords arguments instead of an options hash argument. ([@ioquatix])
310
+ - `Files` handling of range requests no longer return a body that supports `to_path`, to ensure range requests are handled correctly. ([@jeremyevans])
311
+ - `Multipart::Generator` only includes `Content-Length` for files with paths, and `Content-Disposition` `filename` if the `UploadedFile` instance has one. ([@jeremyevans])
312
+ - `Request#ssl?` is true for the `wss` scheme (secure websockets). ([@jeremyevans])
313
+ - `Rack::HeaderHash` is memoized by default. ([#1549](https://github.com/rack/rack/pull/1549), [@ioquatix])
107
314
  - `Rack::Directory` allow directory traversal inside root directory. ([#1417](https://github.com/rack/rack/pull/1417), [@ThomasSevestre](https://github.com/ThomasSevestre))
108
- - Sort encodings by server preference. ([#1184](https://github.com/rack/rack/pull/1184), [@ioquatix](https://github.com/ioquatix), [@wjordan](https://github.com/wjordan))
109
- - Rework host/hostname/authority implementation in `Rack::Request`. `#host` and `#host_with_port` have been changed to correctly return IPv6 addresses formatted with square brackets, as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-3.2.2). ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix](https://github.com/ioquatix))
110
- - `Rack::Builder` parsing options on first `#\` line is deprecated. ([#1574](https://github.com/rack/rack/pull/1574), [@ioquatix](https://github.com/ioquatix))
315
+ - Sort encodings by server preference. ([#1184](https://github.com/rack/rack/pull/1184), [@ioquatix], [@wjordan](https://github.com/wjordan))
316
+ - Rework host/hostname/authority implementation in `Rack::Request`. `#host` and `#host_with_port` have been changed to correctly return IPv6 addresses formatted with square brackets, as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-3.2.2). ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix])
317
+ - `Rack::Builder` parsing options on first `#\` line is deprecated. ([#1574](https://github.com/rack/rack/pull/1574), [@ioquatix])
111
318
 
112
319
  ### Removed
113
320
 
114
- - `Directory#path` as it was not used and always returned nil. ([@jeremyevans](https://github.com/jeremyevans))
115
- - `BodyProxy#each` as it was only needed to work around a bug in Ruby <1.9.3. ([@jeremyevans](https://github.com/jeremyevans))
321
+ - `Directory#path` as it was not used and always returned nil. ([@jeremyevans])
322
+ - `BodyProxy#each` as it was only needed to work around a bug in Ruby <1.9.3. ([@jeremyevans])
116
323
  - `URLMap::INFINITY` and `URLMap::NEGATIVE_INFINITY`, in favor of `Float::INFINITY`. ([@ch1c0t](https://github.com/ch1c0t))
117
324
  - Deprecation of `Rack::File`. It will be deprecated again in rack 2.2 or 3.0. ([@rafaelfranca](https://github.com/rafaelfranca))
118
- - Support for Ruby 2.2 as it is well past EOL. ([@ioquatix](https://github.com/ioquatix))
119
- - Remove `Rack::Files#response_body` as the implementation was broken. ([#1153](https://github.com/rack/rack/pull/1153), [@ioquatix](https://github.com/ioquatix))
120
- - Remove `SERVER_ADDR` which was never part of the original SPEC. ([#1573](https://github.com/rack/rack/pull/1573), [@ioquatix](https://github.com/ioquatix))
325
+ - Support for Ruby 2.2 as it is well past EOL. ([@ioquatix])
326
+ - Remove `Rack::Files#response_body` as the implementation was broken. ([#1153](https://github.com/rack/rack/pull/1153), [@ioquatix])
327
+ - Remove `SERVER_ADDR` which was never part of the original SPEC. ([#1573](https://github.com/rack/rack/pull/1573), [@ioquatix])
121
328
 
122
329
  ### Fixed
123
330
 
124
- - `Directory` correctly handles root paths containing glob metacharacters. ([@jeremyevans](https://github.com/jeremyevans))
125
- - `Cascade` uses a new response object for each call if initialized with no apps. ([@jeremyevans](https://github.com/jeremyevans))
126
- - `BodyProxy` correctly delegates keyword arguments to the body object on Ruby 2.7+. ([@jeremyevans](https://github.com/jeremyevans))
127
- - `BodyProxy#method` correctly handles methods delegated to the body object. ([@jeremyevans](https://github.com/jeremyevans))
331
+ - `Directory` correctly handles root paths containing glob metacharacters. ([@jeremyevans])
332
+ - `Cascade` uses a new response object for each call if initialized with no apps. ([@jeremyevans])
333
+ - `BodyProxy` correctly delegates keyword arguments to the body object on Ruby 2.7+. ([@jeremyevans])
334
+ - `BodyProxy#method` correctly handles methods delegated to the body object. ([@jeremyevans])
128
335
  - `Request#host` and `Request#host_with_port` handle IPv6 addresses correctly. ([@AlexWayfer](https://github.com/AlexWayfer))
129
- - `Lint` checks when response hijacking that `rack.hijack` is called with a valid object. ([@jeremyevans](https://github.com/jeremyevans))
130
- - `Response#write` correctly updates `Content-Length` if initialized with a body. ([@jeremyevans](https://github.com/jeremyevans))
336
+ - `Lint` checks when response hijacking that `rack.hijack` is called with a valid object. ([@jeremyevans])
337
+ - `Response#write` correctly updates `Content-Length` if initialized with a body. ([@jeremyevans])
131
338
  - `CommonLogger` includes `SCRIPT_NAME` when logging. ([@Erol](https://github.com/Erol))
132
- - `Utils.parse_nested_query` correctly handles empty queries, using an empty instance of the params class instead of a hash. ([@jeremyevans](https://github.com/jeremyevans))
339
+ - `Utils.parse_nested_query` correctly handles empty queries, using an empty instance of the params class instead of a hash. ([@jeremyevans])
133
340
  - `Directory` correctly escapes paths in links. ([@yous](https://github.com/yous))
134
- - `Request#delete_cookie` and related `Utils` methods handle `:domain` and `:path` options in same call. ([@jeremyevans](https://github.com/jeremyevans))
135
- - `Request#delete_cookie` and related `Utils` methods do an exact match on `:domain` and `:path` options. ([@jeremyevans](https://github.com/jeremyevans))
341
+ - `Request#delete_cookie` and related `Utils` methods handle `:domain` and `:path` options in same call. ([@jeremyevans])
342
+ - `Request#delete_cookie` and related `Utils` methods do an exact match on `:domain` and `:path` options. ([@jeremyevans])
136
343
  - `Static` no longer adds headers when a gzipped file request has a 304 response. ([@chooh](https://github.com/chooh))
137
- - `ContentLength` sets `Content-Length` response header even for bodies not responding to `to_ary`. ([@jeremyevans](https://github.com/jeremyevans))
138
- - Thin handler supports options passed directly to `Thin::Controllers::Controller`. ([@jeremyevans](https://github.com/jeremyevans))
139
- - WEBrick handler no longer ignores `:BindAddress` option. ([@jeremyevans](https://github.com/jeremyevans))
140
- - `ShowExceptions` handles invalid POST data. ([@jeremyevans](https://github.com/jeremyevans))
141
- - Basic authentication requires a password, even if the password is empty. ([@jeremyevans](https://github.com/jeremyevans))
142
- - `Lint` checks response is array with 3 elements, per SPEC. ([@jeremyevans](https://github.com/jeremyevans))
344
+ - `ContentLength` sets `Content-Length` response header even for bodies not responding to `to_ary`. ([@jeremyevans])
345
+ - Thin handler supports options passed directly to `Thin::Controllers::Controller`. ([@jeremyevans])
346
+ - WEBrick handler no longer ignores `:BindAddress` option. ([@jeremyevans])
347
+ - `ShowExceptions` handles invalid POST data. ([@jeremyevans])
348
+ - Basic authentication requires a password, even if the password is empty. ([@jeremyevans])
349
+ - `Lint` checks response is array with 3 elements, per SPEC. ([@jeremyevans])
143
350
  - Support for using `:SSLEnable` option when using WEBrick handler. (Gregor Melhorn)
144
- - Close response body after buffering it when buffering. ([@ioquatix](https://github.com/ioquatix))
351
+ - Close response body after buffering it when buffering. ([@ioquatix])
145
352
  - Only accept `;` as delimiter when parsing cookies. ([@mrageh](https://github.com/mrageh))
146
- - `Utils::HeaderHash#clear` clears the name mapping as well. ([@raxoft](https://github.com/raxoft))
147
- - Support for passing `nil` `Rack::Files.new`, which notably fixes Rails' current `ActiveStorage::FileServer` implementation. ([@ioquatix](https://github.com/ioquatix))
353
+ - `Utils::HeaderHash#clear` clears the name mapping as well. ([@raxoft](https://github.com/raxoft))
354
+ - Support for passing `nil` `Rack::Files.new`, which notably fixes Rails' current `ActiveStorage::FileServer` implementation. ([@ioquatix])
148
355
 
149
356
  ### Documentation
150
357
 
151
358
  - CHANGELOG updates. ([@aupajo](https://github.com/aupajo))
152
359
  - Added [CONTRIBUTING](CONTRIBUTING.md). ([@dblock](https://github.com/dblock))
153
360
 
361
+ ## [2.0.9] - 2020-02-08
362
+
363
+ - Handle case where session id key is requested but missing ([@jeremyevans])
364
+ - Restore support for code relying on `SessionId#to_s`. ([@jeremyevans])
365
+ - Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul))
366
+
154
367
  ## [2.1.2] - 2020-01-27
155
368
 
156
369
  - Fix multipart parser for some files to prevent denial of service ([@aiomaster](https://github.com/aiomaster))
157
370
  - Fix `Rack::Builder#use` with keyword arguments ([@kamipo](https://github.com/kamipo))
158
- - Skip deflating in Rack::Deflater if Content-Length is 0 ([@jeremyevans](https://github.com/jeremyevans))
371
+ - Skip deflating in Rack::Deflater if Content-Length is 0 ([@jeremyevans])
159
372
  - Remove `SessionHash#transform_keys`, no longer needed ([@pavel](https://github.com/pavel))
160
373
  - Add to_hash to wrap Hash and Session classes ([@oleh-demyanyuk](https://github.com/oleh-demyanyuk))
161
- - Handle case where session id key is requested but missing ([@jeremyevans](https://github.com/jeremyevans))
374
+ - Handle case where session id key is requested but missing ([@jeremyevans])
162
375
 
163
376
  ## [2.1.1] - 2020-01-12
164
377
 
165
- - Remove `Rack::Chunked` from `Rack::Server` default middleware. ([#1475](https://github.com/rack/rack/pull/1475), [@ioquatix](https://github.com/ioquatix))
166
- - Restore support for code relying on `SessionId#to_s`. ([@jeremyevans](https://github.com/jeremyevans))
378
+ - Remove `Rack::Chunked` from `Rack::Server` default middleware. ([#1475](https://github.com/rack/rack/pull/1475), [@ioquatix])
379
+ - Restore support for code relying on `SessionId#to_s`. ([@jeremyevans])
167
380
 
168
381
  ## [2.1.0] - 2020-01-10
169
382
 
@@ -180,13 +393,13 @@ All notable changes to this project will be documented in this file. For info on
180
393
  - Add boot-time profiling capabilities to `rackup`. ([@tenderlove](https://github.com/tenderlove))
181
394
  - Add multi mapping support for `X-Accel-Mappings` header. ([@yoshuki](https://github.com/yoshuki))
182
395
  - Add `sync: false` option to `Rack::Deflater`. (Eric Wong)
183
- - Add `Builder#freeze_app` to freeze application and all middleware instances. ([@jeremyevans](https://github.com/jeremyevans))
396
+ - Add `Builder#freeze_app` to freeze application and all middleware instances. ([@jeremyevans])
184
397
  - Add API to extract cookies from `Rack::MockResponse`. ([@petercline](https://github.com/petercline))
185
398
 
186
399
  ### Changed
187
400
 
188
- - Don't propagate nil values from middleware. ([@ioquatix](https://github.com/ioquatix))
189
- - Lazily initialize the response body and only buffer it if required. ([@ioquatix](https://github.com/ioquatix))
401
+ - Don't propagate nil values from middleware. ([@ioquatix])
402
+ - Lazily initialize the response body and only buffer it if required. ([@ioquatix])
190
403
  - Fix deflater zlib buffer errors on empty body part. ([@felixbuenemann](https://github.com/felixbuenemann))
191
404
  - Set `X-Accel-Redirect` to percent-encoded path. ([@diskkid](https://github.com/diskkid))
192
405
  - Remove unnecessary buffer growing when parsing multipart. ([@tainoe](https://github.com/tainoe))
@@ -199,15 +412,15 @@ All notable changes to this project will be documented in this file. For info on
199
412
  - Make `Utils.status_code` raise an error when the status symbol is invalid instead of `500`. ([@adambutler](https://github.com/adambutler))
200
413
  - Rename `Request::SCHEME_WHITELIST` to `Request::ALLOWED_SCHEMES`.
201
414
  - Make `Multipart::Parser.get_filename` accept files with `+` in their name. ([@lucaskanashiro](https://github.com/lucaskanashiro))
202
- - Add Falcon to the default handler fallbacks. ([@ioquatix](https://github.com/ioquatix))
415
+ - Add Falcon to the default handler fallbacks. ([@ioquatix])
203
416
  - Update codebase to avoid string mutations in preparation for `frozen_string_literals`. ([@pat](https://github.com/pat))
204
417
  - Change `MockRequest#env_for` to rely on the input optionally responding to `#size` instead of `#length`. ([@janko](https://github.com/janko))
205
- - Rename `Rack::File` -> `Rack::Files` and add deprecation notice. ([@postmodern](https://github.com/postmodern)).
206
- - Prefer Base64 “strict encoding” for Base64 cookies. ([@ioquatix](https://github.com/ioquatix))
418
+ - Rename `Rack::File` -> `Rack::Files` and add deprecation notice. ([@postmodern](https://github.com/postmodern))
419
+ - Prefer Base64 “strict encoding” for Base64 cookies. ([@ioquatix])
207
420
 
208
421
  ### Removed
209
422
 
210
- - Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove))
423
+ - BREAKING CHANGE: Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove))
211
424
  - Deprecate `Rack::Session::Memcache` in favor of `Rack::Session::Dalli` from dalli gem ([@fatkodima](https://github.com/fatkodima))
212
425
 
213
426
  ### Fixed
@@ -288,7 +501,7 @@ All notable changes to this project will be documented in this file. For info on
288
501
  ### Added
289
502
 
290
503
  - Allow `Session::Abstract::SessionHash#fetch` to accept a block with a default value. ([@yannvanhalewyn](https://github.com/yannvanhalewyn))
291
- - Add `Builder#freeze_app` to freeze application and all middleware. ([@jeremyevans](https://github.com/jeremyevans))
504
+ - Add `Builder#freeze_app` to freeze application and all middleware. ([@jeremyevans])
292
505
 
293
506
  ### Changed
294
507
 
@@ -300,9 +513,9 @@ All notable changes to this project will be documented in this file. For info on
300
513
  ### Fixed
301
514
 
302
515
  - Handle `NULL` bytes in multipart filenames. ([@casperisfine](https://github.com/casperisfine))
303
- - Remove warnings due to miscapitalized global. ([@ioquatix](https://github.com/ioquatix))
516
+ - Remove warnings due to miscapitalized global. ([@ioquatix])
304
517
  - Prevent exceptions caused by a race condition on multi-threaded servers. ([@sophiedeziel](https://github.com/sophiedeziel))
305
- - Add RDoc as an explicit depencency for `doc` group. ([@tonytonyjan](https://github.com/tonytonyjan))
518
+ - Add RDoc as an explicit dependency for `doc` group. ([@tonytonyjan](https://github.com/tonytonyjan))
306
519
  - Record errors originating from `Multipart::Parser` in the `MethodOverride` middleware instead of letting them bubble up. ([@carlzulauf](https://github.com/carlzulauf))
307
520
  - Remove remaining use of removed `Utils#bytesize` method from the `File` middleware. ([@brauliomartinezlm](https://github.com/brauliomartinezlm))
308
521
 
@@ -620,7 +833,7 @@ Items below this line are from the previously maintained HISTORY.md and NEWS.md
620
833
  - Moved Auth::OpenID to rack-contrib.
621
834
  - SPEC change that relaxes Lint slightly to allow subclasses of the
622
835
  required types
623
- - SPEC change to document rack.input binary mode in greator detail
836
+ - SPEC change to document rack.input binary mode in greater detail
624
837
  - SPEC define optional rack.logger specification
625
838
  - File servers support X-Cascade header
626
839
  - Imported Config middleware
@@ -738,3 +951,10 @@ Items below this line are from the previously maintained HISTORY.md and NEWS.md
738
951
  - Removed Rails adapter, was too alpha.
739
952
 
740
953
  ## [0.1] 2007-03-03
954
+
955
+ [@ioquatix]: https://github.com/ioquatix "Samuel Williams"
956
+ [@jeremyevans]: https://github.com/jeremyevans "Jeremy Evans"
957
+ [@amatsuda]: https://github.com/amatsuda "Akira Matsuda"
958
+ [@wjordan]: https://github.com/wjordan "Will Jordan"
959
+ [@BlakeWilliams]: https://github.com/BlakeWilliams "Blake Williams"
960
+ [@davidstosik]: https://github.com/davidstosik "David Stosik"