rack 2.2.8.1 → 3.0.9.1

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 +213 -83
  3. data/CONTRIBUTING.md +53 -47
  4. data/MIT-LICENSE +1 -1
  5. data/README.md +309 -0
  6. data/SPEC.rdoc +174 -126
  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 +0 -2
  10. data/lib/rack/auth/digest/md5.rb +1 -131
  11. data/lib/rack/auth/digest/nonce.rb +1 -54
  12. data/lib/rack/auth/digest/params.rb +1 -54
  13. data/lib/rack/auth/digest/request.rb +1 -43
  14. data/lib/rack/auth/digest.rb +256 -0
  15. data/lib/rack/body_proxy.rb +3 -1
  16. data/lib/rack/builder.rb +83 -63
  17. data/lib/rack/cascade.rb +2 -0
  18. data/lib/rack/chunked.rb +16 -13
  19. data/lib/rack/common_logger.rb +23 -18
  20. data/lib/rack/conditional_get.rb +18 -15
  21. data/lib/rack/constants.rb +64 -0
  22. data/lib/rack/content_length.rb +12 -16
  23. data/lib/rack/content_type.rb +8 -5
  24. data/lib/rack/deflater.rb +40 -26
  25. data/lib/rack/directory.rb +9 -3
  26. data/lib/rack/etag.rb +14 -23
  27. data/lib/rack/events.rb +4 -0
  28. data/lib/rack/file.rb +2 -0
  29. data/lib/rack/files.rb +15 -17
  30. data/lib/rack/head.rb +9 -8
  31. data/lib/rack/headers.rb +154 -0
  32. data/lib/rack/lint.rb +758 -646
  33. data/lib/rack/lock.rb +2 -5
  34. data/lib/rack/logger.rb +2 -0
  35. data/lib/rack/method_override.rb +5 -1
  36. data/lib/rack/mime.rb +8 -0
  37. data/lib/rack/mock.rb +1 -271
  38. data/lib/rack/mock_request.rb +166 -0
  39. data/lib/rack/mock_response.rb +126 -0
  40. data/lib/rack/multipart/generator.rb +7 -5
  41. data/lib/rack/multipart/parser.rb +120 -64
  42. data/lib/rack/multipart/uploaded_file.rb +4 -0
  43. data/lib/rack/multipart.rb +20 -40
  44. data/lib/rack/null_logger.rb +9 -0
  45. data/lib/rack/query_parser.rb +78 -46
  46. data/lib/rack/recursive.rb +2 -0
  47. data/lib/rack/reloader.rb +0 -2
  48. data/lib/rack/request.rb +224 -106
  49. data/lib/rack/response.rb +138 -61
  50. data/lib/rack/rewindable_input.rb +24 -5
  51. data/lib/rack/runtime.rb +7 -6
  52. data/lib/rack/sendfile.rb +30 -25
  53. data/lib/rack/show_exceptions.rb +15 -2
  54. data/lib/rack/show_status.rb +17 -7
  55. data/lib/rack/static.rb +8 -8
  56. data/lib/rack/tempfile_reaper.rb +15 -4
  57. data/lib/rack/urlmap.rb +3 -1
  58. data/lib/rack/utils.rb +203 -176
  59. data/lib/rack/version.rb +9 -4
  60. data/lib/rack.rb +6 -76
  61. metadata +13 -33
  62. data/README.rdoc +0 -320
  63. data/Rakefile +0 -130
  64. data/bin/rackup +0 -5
  65. data/contrib/rack.png +0 -0
  66. data/contrib/rack.svg +0 -150
  67. data/contrib/rack_logo.svg +0 -164
  68. data/contrib/rdoc.css +0 -412
  69. data/example/lobster.ru +0 -6
  70. data/example/protectedlobster.rb +0 -16
  71. data/example/protectedlobster.ru +0 -10
  72. data/lib/rack/core_ext/regexp.rb +0 -14
  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: ebeaad43b1e4e691aa7123f2f0b0abb55bd4e8ccb062a048d3bc636c12780a1c
4
+ data.tar.gz: 4db213c69e487539b15f2648019de339b3876bd9d9ab39a7e4948c6114a18546
5
5
  SHA512:
6
- metadata.gz: c38c9c18ec842262eeb25e1c06bbfe0c6b7ef5f74ee43f9952105a53e96d9dfaead4c0786a0a9f2bb999004d45d738e05104b9e3c612f16b35a30b6441afa2e6
7
- data.tar.gz: 890b77739013bc80a83a74c2ecc112dfdd8a68a090d831f7ca3ea5106cf5cad1d61baf4df0c2d39bef3cb3b37e1bb30f44109d8e85ceded57345611090f85a75
6
+ metadata.gz: 6c3afb608d9170593f0bc58120d60dcec9d4d3163e72a9805b8a48b2ebd8952a359dd56d2c2f48dc8673d2361647409a628b22073b4e07a6c070f60283265bb9
7
+ data.tar.gz: fb304999e3568174cdcc7a2b0b43b3ba064448db1882142524b50332cd7d037a2ff44c7042f94a2b18da862ca4db6e43b6eb9ca71b6b73986e1359e4b294eb7c
data/CHANGELOG.md CHANGED
@@ -2,38 +2,158 @@
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
+ ## Unreleased
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
+ ## [3.0.9] - 2024-01-31
9
8
 
10
- ## [2.2.6.4] - 2023-03-13
9
+ - 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])
10
+
11
+ ## [3.0.8] - 2023-06-14
12
+
13
+ - Fix some unused variable verbose warnings. ([#2084](https://github.com/rack/rack/pull/2084), [@jeremyevans], [@skipkayhil](https://github.com/skipkayhil))
14
+
15
+ ## [3.0.7] - 2023-03-16
16
+
17
+ - Make query parameters without `=` have `nil` values. ([#2059](https://github.com/rack/rack/pull/2059), [@jeremyevans])
18
+
19
+ ## [3.0.6.1] - 2023-03-13
11
20
 
12
21
  - [CVE-2023-27539] Avoid ReDoS in header parsing
13
22
 
14
- ## [2.2.6.3] - 2023-03-02
23
+ ## [3.0.6] - 2023-03-13
15
24
 
16
- - [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts
25
+ - Add `QueryParser#missing_value` for handling missing values + tests. ([#2052](https://github.com/rack/rack/pull/2052), [@ioquatix])
17
26
 
18
- ## [2.2.6.2] - 2023-01-17
27
+ ## [3.0.5] - 2023-03-13
19
28
 
20
- - [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges
29
+ - Split form/query parsing into two steps. ([#2038](https://github.com/rack/rack/pull/2038), [@matthewd](https://github.com/matthewd))
21
30
 
22
- ## [2.2.6.1] - 2023-01-17
31
+ ## [3.0.4.1] - 2023-03-02
32
+
33
+ - [CVE-2023-27530] Introduce multipart_total_part_limit to limit total parts
34
+
35
+ ## [3.0.4.1] - 2023-01-17
23
36
 
24
37
  - [CVE-2022-44571] Fix ReDoS vulnerability in multipart parser
38
+ - [CVE-2022-44570] Fix ReDoS in Rack::Utils.get_byte_ranges
25
39
  - [CVE-2022-44572] Forbid control characters in attributes (also ReDoS)
26
40
 
27
- ## [2.2.6] - 2023-01-17
41
+ ## [3.0.4] - 2023-01-17
28
42
 
29
- - Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2011](https://github.com/rack/rack/pull/2011), [@byroot](https://github.com/byroot))
43
+ - `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])
44
+ - 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))
45
+ - Extend `Rack::MethodOverride` to handle `QueryParser::ParamsTooDeepError` error. ([#2006](https://github.com/rack/rack/pull/2006), [@byroot](https://github.com/byroot))
30
46
 
31
- ## [2.2.5] - 2022-12-27
47
+ ## [3.0.3] - 2022-12-27
32
48
 
33
49
  ### Fixed
34
50
 
35
51
  - `Rack::URLMap` uses non-deprecated form of `Regexp.new`. ([#1998](https://github.com/rack/rack/pull/1998), [@weizheheng](https://github.com/weizheheng))
36
52
 
53
+ ## [3.0.2] - 2022-12-05
54
+
55
+ ### Fixed
56
+
57
+ - `Utils.build_nested_query` URL-encodes nested field names including the square brackets.
58
+ - Allow `Rack::Response` to pass through streaming bodies. ([#1993](https://github.com/rack/rack/pull/1993), [@ioquatix])
59
+
60
+ ## [3.0.1] - 2022-11-18
61
+
62
+ ### Fixed
63
+
64
+ - `MethodOverride` does not look for an override if a request does not include form/parseable data.
65
+ - `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])
66
+
67
+ ## [3.0.0] - 2022-09-06
68
+
69
+ - No changes
70
+
71
+ ## [3.0.0.rc1] - 2022-09-04
72
+
73
+ ### SPEC Changes
74
+
75
+ - Stream argument must implement `<<` https://github.com/rack/rack/pull/1959
76
+ - `close` may be called on `rack.input` https://github.com/rack/rack/pull/1956
77
+ - `rack.response_finished` may be used for executing code after the response has been finished https://github.com/rack/rack/pull/1952
78
+
79
+ ## [3.0.0.beta1] - 2022-08-08
80
+
81
+ ### Security
82
+
83
+ - Do not use semicolon as GET parameter separator. ([#1733](https://github.com/rack/rack/pull/1733), [@jeremyevans])
84
+
85
+ ### SPEC Changes
86
+
87
+ - Response array must now be non-frozen.
88
+ - Response `status` must now be an integer greater than or equal to 100.
89
+ - Response `headers` must now be an unfrozen hash.
90
+ - Response header keys can no longer include uppercase characters.
91
+ - Response header values can be an `Array` to handle multiple values (and no longer supports `\n` encoded headers).
92
+ - Response body can now respond to `#call` (streaming body) instead of `#each` (enumerable body), for the equivalent of response hijacking in previous versions.
93
+ - Middleware must no longer call `#each` on the body, but they can call `#to_ary` on the body if it responds to `#to_ary`.
94
+ - `rack.input` is no longer required to be rewindable.
95
+ - `rack.multithread`/`rack.multiprocess`/`rack.run_once`/`rack.version` are no longer required environment keys.
96
+ - `SERVER_PROTOCOL` is now a required environment key, matching the HTTP protocol used in the request.
97
+ - `rack.hijack?` (partial hijack) and `rack.hijack` (full hijack) are now independently optional.
98
+ - `rack.hijack_io` has been removed completely.
99
+ - `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).
100
+ - It is okay to call `#close` on `rack.input` to indicate that you no longer need or care about the input.
101
+ - The stream argument supplied to the streaming body and hijack must support `#<<` for writing output.
102
+
103
+ ### Removed
104
+
105
+ - 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]))
106
+ - Remove deprecated Rack::Request::SCHEME_WHITELIST. ([@jeremyevans])
107
+ - 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])
108
+ - Remove `rack.version` as it comes too late to be useful. ([#1938](https://github.com/rack/rack/pull/1938), [@ioquatix])
109
+ - Extract `rackup` command, `Rack::Server`, `Rack::Handler` and related code into a separate gem. ([#1937](https://github.com/rack/rack/pull/1937), [@ioquatix])
110
+
111
+ ### Added
112
+
113
+ - `Rack::Headers` added to support lower-case header keys. ([@jeremyevans])
114
+ - `Rack::Utils#set_cookie_header` now supports `escape_key: false` to avoid key escaping. ([@jeremyevans])
115
+ - `Rack::RewindableInput` supports size. ([@ahorek](https://github.com/ahorek))
116
+ - `Rack::RewindableInput::Middleware` added for making `rack.input` rewindable. ([@jeremyevans])
117
+ - 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])
118
+ - Allow response headers to contain array of values. ([#1598](https://github.com/rack/rack/issues/1598), [@ioquatix])
119
+ - 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])
120
+ - Allow `Rack::Builder#run` to take a block instead of an argument. ([#1942](https://github.com/rack/rack/pull/1942), [@ioquatix])
121
+ - 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])
122
+ - The stream argument must implement `#<<`. ([#1959](https://github.com/rack/rack/pull/1959), [@ioquatix])
123
+
124
+ ### Changed
125
+
126
+ - BREAKING CHANGE: Require `status` to be an Integer. ([#1662](https://github.com/rack/rack/pull/1662), [@olleolleolle](https://github.com/olleolleolle))
127
+ - 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])
128
+ - Relax validations around `Rack::Request#host` and `Rack::Request#hostname`. ([#1606](https://github.com/rack/rack/issues/1606), [@pvande](https://github.com/pvande))
129
+ - Removed antiquated handlers: FCGI, LSWS, SCGI, Thin. ([#1658](https://github.com/rack/rack/pull/1658), [@ioquatix])
130
+ - Removed options from `Rack::Builder.parse_file` and `Rack::Builder.load_file`. ([#1663](https://github.com/rack/rack/pull/1663), [@ioquatix])
131
+ - `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])
132
+ - `Rack::Request#[]` and `#[]=` now warn even in non-verbose mode. ([#1277](https://github.com/rack/rack/issues/1277), [@jeremyevans])
133
+ - Decrease default allowed parameter recursion level from 100 to 32. ([#1640](https://github.com/rack/rack/issues/1640), [@jeremyevans])
134
+ - Attempting to parse a multipart response with an empty body now raises Rack::Multipart::EmptyContentError. ([#1603](https://github.com/rack/rack/issues/1603), [@jeremyevans])
135
+ - `Rack::Utils.secure_compare` uses OpenSSL's faster implementation if available. ([#1711](https://github.com/rack/rack/pull/1711), [@bdewater](https://github.com/bdewater))
136
+ - `Rack::Request#POST` now caches an empty hash if input content type is not parseable. ([#749](https://github.com/rack/rack/pull/749), [@jeremyevans])
137
+ - 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))
138
+ - Explicitly deprecate `Rack::File` which was an alias for `Rack::Files`. ([#1811](https://github.com/rack/rack/pull/1720), [@ioquatix]).
139
+ - Moved `Rack::Session` into [separate gem](https://github.com/rack/rack-session). ([#1805](https://github.com/rack/rack/pull/1805), [@ioquatix])
140
+ - `rackup -D` option to daemonizes no longer changes the working directory to the root. ([#1813](https://github.com/rack/rack/pull/1813), [@jeremyevans])
141
+ - 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])
142
+ - `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])
143
+ - 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])
144
+ - 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])
145
+ - `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])
146
+ - Allow calling close on `rack.input`. ([#1956](https://github.com/rack/rack/pull/1956), [@ioquatix])
147
+
148
+ ### Fixed
149
+
150
+ - Make Rack::MockResponse handle non-hash headers. ([#1629](https://github.com/rack/rack/issues/1629), [@jeremyevans])
151
+ - TempfileReaper now deletes temp files if application raises an exception. ([#1679](https://github.com/rack/rack/issues/1679), [@jeremyevans])
152
+ - Handle cookies with values that end in '=' ([#1645](https://github.com/rack/rack/pull/1645), [@lukaso](https://github.com/lukaso))
153
+ - Make `Rack::NullLogger` respond to `#fatal!` [@jeremyevans])
154
+ - 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))
155
+ - `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))
156
+
37
157
  ## [2.2.4] - 2022-06-30
38
158
 
39
159
  - Better support for lower case headers in `Rack::ETag` middleware. ([#1919](https://github.com/rack/rack/pull/1919), [@ioquatix](https://github.com/ioquatix))
@@ -41,23 +161,21 @@ All notable changes to this project will be documented in this file. For info on
41
161
 
42
162
  ## [2.2.3.1] - 2022-05-27
43
163
 
44
- ### Security
45
-
46
164
  - [CVE-2022-30123] Fix shell escaping issue in Common Logger
47
165
  - [CVE-2022-30122] Restrict parsing of broken MIME attachments
48
166
 
49
- ## [2.2.3] - 2020-02-11
167
+ ## [2.2.3] - 2020-06-15
50
168
 
51
169
  ### Security
52
170
 
53
- - [CVE-2020-8184] Only decode cookie values
171
+ - [[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
172
 
55
173
  ## [2.2.2] - 2020-02-11
56
174
 
57
175
  ### Fixed
58
176
 
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))
177
+ - Fix incorrect `Rack::Request#host` value. ([#1591](https://github.com/rack/rack/pull/1591), [@ioquatix])
178
+ - Revert `Rack::Handler::Thin` implementation. ([#1583](https://github.com/rack/rack/pull/1583), [@jeremyevans])
61
179
  - 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
180
  - Fix to handle same_site option for session pool. ([#1587](https://github.com/rack/rack/pull/1587), [@kamipo](https://github.com/kamipo))
63
181
 
@@ -65,105 +183,111 @@ All notable changes to this project will be documented in this file. For info on
65
183
 
66
184
  ### Fixed
67
185
 
68
- - Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix](https://github.com/ioquatix))
186
+ - Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix])
69
187
 
70
188
  ## [2.2.0] - 2020-02-08
71
189
 
72
190
  ### SPEC Changes
73
191
 
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))
192
+ - `rack.session` request environment entry must respond to `to_hash` and return unfrozen Hash. ([@jeremyevans])
193
+ - Request environment cannot be frozen. ([@jeremyevans])
194
+ - CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ([@jeremyevans])
195
+ - Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix])
78
196
 
79
197
  ### Added
80
198
 
81
- - `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans](https://github.com/jeremyevans))
199
+ - `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans])
82
200
  - `Server` supports an array of paths to require for the `:require` option. ([@khotta](https://github.com/khotta))
83
201
  - `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))
202
+ - `Multipart::UploadedFile` supports an IO-like object instead of using the filesystem, using `:filename` and `:io` options. ([@jeremyevans])
203
+ - `Multipart::UploadedFile` supports keyword arguments `:path`, `:content_type`, and `:binary` in addition to positional arguments. ([@jeremyevans])
204
+ - `Static` supports a `:cascade` option for calling the app if there is no matching file. ([@jeremyevans])
205
+ - `Session::Abstract::SessionHash#dig`. ([@jeremyevans])
206
+ - `Response.[]` and `MockResponse.[]` for creating instances using status, headers, and body. ([@ioquatix])
207
+ - Convenient cache and content type methods for `Rack::Response`. ([#1555](https://github.com/rack/rack/pull/1555), [@ioquatix])
90
208
 
91
209
  ### Changed
92
210
 
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))
211
+ - `Request#params` no longer rescues EOFError. ([@jeremyevans])
212
+ - `Directory` uses a streaming approach, significantly improving time to first byte for large directories. ([@jeremyevans])
213
+ - `Directory` no longer includes a Parent directory link in the root directory index. ([@jeremyevans])
214
+ - `QueryParser#parse_nested_query` uses original backtrace when reraising exception with new class. ([@jeremyevans])
215
+ - `ConditionalGet` follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ([@jeremyevans])
98
216
  - `.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))
217
+ - Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ([@jeremyevans])
218
+ - 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
219
  - `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))
220
+ - All handlers uses keywords arguments instead of an options hash argument. ([@ioquatix])
221
+ - `Files` handling of range requests no longer return a body that supports `to_path`, to ensure range requests are handled correctly. ([@jeremyevans])
222
+ - `Multipart::Generator` only includes `Content-Length` for files with paths, and `Content-Disposition` `filename` if the `UploadedFile` instance has one. ([@jeremyevans])
223
+ - `Request#ssl?` is true for the `wss` scheme (secure websockets). ([@jeremyevans])
224
+ - `Rack::HeaderHash` is memoized by default. ([#1549](https://github.com/rack/rack/pull/1549), [@ioquatix])
107
225
  - `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))
226
+ - Sort encodings by server preference. ([#1184](https://github.com/rack/rack/pull/1184), [@ioquatix], [@wjordan](https://github.com/wjordan))
227
+ - 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])
228
+ - `Rack::Builder` parsing options on first `#\` line is deprecated. ([#1574](https://github.com/rack/rack/pull/1574), [@ioquatix])
111
229
 
112
230
  ### Removed
113
231
 
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))
232
+ - `Directory#path` as it was not used and always returned nil. ([@jeremyevans])
233
+ - `BodyProxy#each` as it was only needed to work around a bug in Ruby <1.9.3. ([@jeremyevans])
116
234
  - `URLMap::INFINITY` and `URLMap::NEGATIVE_INFINITY`, in favor of `Float::INFINITY`. ([@ch1c0t](https://github.com/ch1c0t))
117
235
  - 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))
236
+ - Support for Ruby 2.2 as it is well past EOL. ([@ioquatix])
237
+ - Remove `Rack::Files#response_body` as the implementation was broken. ([#1153](https://github.com/rack/rack/pull/1153), [@ioquatix])
238
+ - Remove `SERVER_ADDR` which was never part of the original SPEC. ([#1573](https://github.com/rack/rack/pull/1573), [@ioquatix])
121
239
 
122
240
  ### Fixed
123
241
 
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))
242
+ - `Directory` correctly handles root paths containing glob metacharacters. ([@jeremyevans])
243
+ - `Cascade` uses a new response object for each call if initialized with no apps. ([@jeremyevans])
244
+ - `BodyProxy` correctly delegates keyword arguments to the body object on Ruby 2.7+. ([@jeremyevans])
245
+ - `BodyProxy#method` correctly handles methods delegated to the body object. ([@jeremyevans])
128
246
  - `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))
247
+ - `Lint` checks when response hijacking that `rack.hijack` is called with a valid object. ([@jeremyevans])
248
+ - `Response#write` correctly updates `Content-Length` if initialized with a body. ([@jeremyevans])
131
249
  - `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))
250
+ - `Utils.parse_nested_query` correctly handles empty queries, using an empty instance of the params class instead of a hash. ([@jeremyevans])
133
251
  - `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))
252
+ - `Request#delete_cookie` and related `Utils` methods handle `:domain` and `:path` options in same call. ([@jeremyevans])
253
+ - `Request#delete_cookie` and related `Utils` methods do an exact match on `:domain` and `:path` options. ([@jeremyevans])
136
254
  - `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))
255
+ - `ContentLength` sets `Content-Length` response header even for bodies not responding to `to_ary`. ([@jeremyevans])
256
+ - Thin handler supports options passed directly to `Thin::Controllers::Controller`. ([@jeremyevans])
257
+ - WEBrick handler no longer ignores `:BindAddress` option. ([@jeremyevans])
258
+ - `ShowExceptions` handles invalid POST data. ([@jeremyevans])
259
+ - Basic authentication requires a password, even if the password is empty. ([@jeremyevans])
260
+ - `Lint` checks response is array with 3 elements, per SPEC. ([@jeremyevans])
143
261
  - 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))
262
+ - Close response body after buffering it when buffering. ([@ioquatix])
145
263
  - 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))
264
+ - `Utils::HeaderHash#clear` clears the name mapping as well. ([@raxoft](https://github.com/raxoft))
265
+ - Support for passing `nil` `Rack::Files.new`, which notably fixes Rails' current `ActiveStorage::FileServer` implementation. ([@ioquatix])
148
266
 
149
267
  ### Documentation
150
268
 
151
269
  - CHANGELOG updates. ([@aupajo](https://github.com/aupajo))
152
270
  - Added [CONTRIBUTING](CONTRIBUTING.md). ([@dblock](https://github.com/dblock))
153
271
 
272
+ ## [2.0.9] - 2020-02-08
273
+
274
+ - Handle case where session id key is requested but missing ([@jeremyevans])
275
+ - Restore support for code relying on `SessionId#to_s`. ([@jeremyevans])
276
+ - Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul))
277
+
154
278
  ## [2.1.2] - 2020-01-27
155
279
 
156
280
  - Fix multipart parser for some files to prevent denial of service ([@aiomaster](https://github.com/aiomaster))
157
281
  - 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))
282
+ - Skip deflating in Rack::Deflater if Content-Length is 0 ([@jeremyevans])
159
283
  - Remove `SessionHash#transform_keys`, no longer needed ([@pavel](https://github.com/pavel))
160
284
  - 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))
285
+ - Handle case where session id key is requested but missing ([@jeremyevans])
162
286
 
163
287
  ## [2.1.1] - 2020-01-12
164
288
 
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))
289
+ - Remove `Rack::Chunked` from `Rack::Server` default middleware. ([#1475](https://github.com/rack/rack/pull/1475), [@ioquatix])
290
+ - Restore support for code relying on `SessionId#to_s`. ([@jeremyevans])
167
291
 
168
292
  ## [2.1.0] - 2020-01-10
169
293
 
@@ -180,13 +304,13 @@ All notable changes to this project will be documented in this file. For info on
180
304
  - Add boot-time profiling capabilities to `rackup`. ([@tenderlove](https://github.com/tenderlove))
181
305
  - Add multi mapping support for `X-Accel-Mappings` header. ([@yoshuki](https://github.com/yoshuki))
182
306
  - 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))
307
+ - Add `Builder#freeze_app` to freeze application and all middleware instances. ([@jeremyevans])
184
308
  - Add API to extract cookies from `Rack::MockResponse`. ([@petercline](https://github.com/petercline))
185
309
 
186
310
  ### Changed
187
311
 
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))
312
+ - Don't propagate nil values from middleware. ([@ioquatix])
313
+ - Lazily initialize the response body and only buffer it if required. ([@ioquatix])
190
314
  - Fix deflater zlib buffer errors on empty body part. ([@felixbuenemann](https://github.com/felixbuenemann))
191
315
  - Set `X-Accel-Redirect` to percent-encoded path. ([@diskkid](https://github.com/diskkid))
192
316
  - Remove unnecessary buffer growing when parsing multipart. ([@tainoe](https://github.com/tainoe))
@@ -199,15 +323,15 @@ All notable changes to this project will be documented in this file. For info on
199
323
  - Make `Utils.status_code` raise an error when the status symbol is invalid instead of `500`. ([@adambutler](https://github.com/adambutler))
200
324
  - Rename `Request::SCHEME_WHITELIST` to `Request::ALLOWED_SCHEMES`.
201
325
  - 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))
326
+ - Add Falcon to the default handler fallbacks. ([@ioquatix])
203
327
  - Update codebase to avoid string mutations in preparation for `frozen_string_literals`. ([@pat](https://github.com/pat))
204
328
  - 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))
329
+ - Rename `Rack::File` -> `Rack::Files` and add deprecation notice. ([@postmodern](https://github.com/postmodern))
330
+ - Prefer Base64 “strict encoding” for Base64 cookies. ([@ioquatix])
207
331
 
208
332
  ### Removed
209
333
 
210
- - Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove))
334
+ - BREAKING CHANGE: Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove))
211
335
  - Deprecate `Rack::Session::Memcache` in favor of `Rack::Session::Dalli` from dalli gem ([@fatkodima](https://github.com/fatkodima))
212
336
 
213
337
  ### Fixed
@@ -288,7 +412,7 @@ All notable changes to this project will be documented in this file. For info on
288
412
  ### Added
289
413
 
290
414
  - 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))
415
+ - Add `Builder#freeze_app` to freeze application and all middleware. ([@jeremyevans])
292
416
 
293
417
  ### Changed
294
418
 
@@ -300,9 +424,9 @@ All notable changes to this project will be documented in this file. For info on
300
424
  ### Fixed
301
425
 
302
426
  - Handle `NULL` bytes in multipart filenames. ([@casperisfine](https://github.com/casperisfine))
303
- - Remove warnings due to miscapitalized global. ([@ioquatix](https://github.com/ioquatix))
427
+ - Remove warnings due to miscapitalized global. ([@ioquatix])
304
428
  - 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))
429
+ - Add RDoc as an explicit dependency for `doc` group. ([@tonytonyjan](https://github.com/tonytonyjan))
306
430
  - Record errors originating from `Multipart::Parser` in the `MethodOverride` middleware instead of letting them bubble up. ([@carlzulauf](https://github.com/carlzulauf))
307
431
  - Remove remaining use of removed `Utils#bytesize` method from the `File` middleware. ([@brauliomartinezlm](https://github.com/brauliomartinezlm))
308
432
 
@@ -620,7 +744,7 @@ Items below this line are from the previously maintained HISTORY.md and NEWS.md
620
744
  - Moved Auth::OpenID to rack-contrib.
621
745
  - SPEC change that relaxes Lint slightly to allow subclasses of the
622
746
  required types
623
- - SPEC change to document rack.input binary mode in greator detail
747
+ - SPEC change to document rack.input binary mode in greater detail
624
748
  - SPEC define optional rack.logger specification
625
749
  - File servers support X-Cascade header
626
750
  - Imported Config middleware
@@ -738,3 +862,9 @@ Items below this line are from the previously maintained HISTORY.md and NEWS.md
738
862
  - Removed Rails adapter, was too alpha.
739
863
 
740
864
  ## [0.1] 2007-03-03
865
+
866
+ [@ioquatix]: https://github.com/ioquatix "Samuel Williams"
867
+ [@jeremyevans]: https://github.com/jeremyevans "Jeremy Evans"
868
+ [@amatsuda]: https://github.com/amatsuda "Akira Matsuda"
869
+ [@wjordan]: https://github.com/wjordan "Will Jordan"
870
+ [@BlakeWilliams]: https://github.com/BlakeWilliams "Blake Williams"