puma 5.2.2 → 6.3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puma might be problematic. Click here for more details.

Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +483 -4
  3. data/README.md +101 -20
  4. data/bin/puma-wild +1 -1
  5. data/docs/architecture.md +50 -16
  6. data/docs/compile_options.md +38 -2
  7. data/docs/deployment.md +53 -67
  8. data/docs/fork_worker.md +1 -3
  9. data/docs/jungle/rc.d/README.md +1 -1
  10. data/docs/kubernetes.md +1 -1
  11. data/docs/nginx.md +1 -1
  12. data/docs/plugins.md +15 -15
  13. data/docs/rails_dev_mode.md +2 -3
  14. data/docs/restart.md +7 -7
  15. data/docs/signals.md +11 -10
  16. data/docs/stats.md +8 -8
  17. data/docs/systemd.md +65 -69
  18. data/docs/testing_benchmarks_local_files.md +150 -0
  19. data/docs/testing_test_rackup_ci_files.md +36 -0
  20. data/ext/puma_http11/extconf.rb +44 -13
  21. data/ext/puma_http11/http11_parser.c +24 -11
  22. data/ext/puma_http11/http11_parser.h +2 -2
  23. data/ext/puma_http11/http11_parser.java.rl +2 -2
  24. data/ext/puma_http11/http11_parser.rl +2 -2
  25. data/ext/puma_http11/http11_parser_common.rl +3 -3
  26. data/ext/puma_http11/mini_ssl.c +150 -23
  27. data/ext/puma_http11/org/jruby/puma/Http11.java +3 -3
  28. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +50 -48
  29. data/ext/puma_http11/org/jruby/puma/MiniSSL.java +188 -102
  30. data/ext/puma_http11/puma_http11.c +18 -10
  31. data/lib/puma/app/status.rb +10 -7
  32. data/lib/puma/binder.rb +112 -62
  33. data/lib/puma/cli.rb +24 -20
  34. data/lib/puma/client.rb +162 -36
  35. data/lib/puma/cluster/worker.rb +31 -27
  36. data/lib/puma/cluster/worker_handle.rb +12 -1
  37. data/lib/puma/cluster.rb +102 -61
  38. data/lib/puma/commonlogger.rb +21 -14
  39. data/lib/puma/configuration.rb +78 -54
  40. data/lib/puma/const.rb +135 -97
  41. data/lib/puma/control_cli.rb +25 -20
  42. data/lib/puma/detect.rb +12 -2
  43. data/lib/puma/dsl.rb +308 -58
  44. data/lib/puma/error_logger.rb +20 -11
  45. data/lib/puma/events.rb +6 -126
  46. data/lib/puma/io_buffer.rb +39 -4
  47. data/lib/puma/jruby_restart.rb +2 -1
  48. data/lib/puma/{json.rb → json_serialization.rb} +1 -1
  49. data/lib/puma/launcher/bundle_pruner.rb +104 -0
  50. data/lib/puma/launcher.rb +114 -173
  51. data/lib/puma/log_writer.rb +147 -0
  52. data/lib/puma/minissl/context_builder.rb +30 -16
  53. data/lib/puma/minissl.rb +132 -38
  54. data/lib/puma/null_io.rb +5 -0
  55. data/lib/puma/plugin/systemd.rb +90 -0
  56. data/lib/puma/plugin/tmp_restart.rb +1 -1
  57. data/lib/puma/plugin.rb +2 -2
  58. data/lib/puma/rack/builder.rb +7 -7
  59. data/lib/puma/rack_default.rb +19 -4
  60. data/lib/puma/reactor.rb +19 -10
  61. data/lib/puma/request.rb +373 -153
  62. data/lib/puma/runner.rb +74 -28
  63. data/lib/puma/sd_notify.rb +149 -0
  64. data/lib/puma/server.rb +127 -136
  65. data/lib/puma/single.rb +13 -11
  66. data/lib/puma/state_file.rb +39 -7
  67. data/lib/puma/thread_pool.rb +33 -26
  68. data/lib/puma/util.rb +20 -15
  69. data/lib/puma.rb +28 -11
  70. data/lib/rack/handler/puma.rb +113 -86
  71. data/tools/Dockerfile +1 -1
  72. metadata +15 -10
  73. data/lib/puma/queue_close.rb +0 -26
  74. data/lib/puma/systemd.rb +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 472ee56cda171d14d1ba6dee3f83d6b5cce8458e6346d36443295c6aae8ca243
4
- data.tar.gz: 625953f46071794b66b44974a74a4382015ecef0ce85b629cf7448935d1f15c8
3
+ metadata.gz: fee07e30f79d6f40104c1265c78bba2ba7f91cd6aff53d4df7d7bcbe62f052da
4
+ data.tar.gz: 3f3d8d6107481ffc4e545c7f976ec3480c2c5876a4ba8b7c50e1f7b5a7b3d286
5
5
  SHA512:
6
- metadata.gz: b8510e5f6e17815d2d36be57806f70294d4796cf7a63c7c9e76cfc31454f314b46da8ab3a83b2f35436e4ae98a1a138dbb20c9f75fee89a41edeeb5689459ff4
7
- data.tar.gz: ef268e432c892a993831786227eee70ab3c013b5aaf306538e603a405cbc40457dffd961acfefa98a0fef6117f4b6463634f60fd4a5e111c79f361f7e5ae28e4
6
+ metadata.gz: a312fd8f5e8b8a146d40bca643fd22639bb3a67f7e2acd995e000e4c82b159c68b78547e3b48340cf747c0c2666cd3897581e19ff5a4a752dcb6c07cf8618562
7
+ data.tar.gz: a8136c073d50d1c1b8f7f4ff831bcd2f2aa0cfea1a233e9c88bf4900c120f3131e61245632dd55f5357ca5217203d64d7cef4285d19adce33bff4c5e18640f05
data/History.md CHANGED
@@ -1,3 +1,266 @@
1
+ ## 6.3.0 / 2023-05-31
2
+
3
+ * Features
4
+ * Add dsl method `supported_http_methods` ([#3106], [#3014])
5
+ * Puma error responses no longer have any fingerprints to indicate Puma ([#3161], [#3037])
6
+ * Support decryption of SSL key ([#3133], [#3132])
7
+
8
+ * Bugfixes
9
+ * Don't send 103 early hints response when only invalid headers are used ([#3163])
10
+ * Handle malformed request path ([#3155], [#3148])
11
+ * Misc lib file fixes - trapping additional errors, CI helper ([#3129])
12
+ * Fixup req form data file upload with "r\n" line endings ([#3137])
13
+ * Restore rack 1.6 compatibility Restore rack 1.6 compatibility ([#3156])
14
+
15
+ * Refactor
16
+ * const.rb - Update Puma::HTTP_STATUS_CODES ([#3162])
17
+ * Clarify Reactor#initialize ([#3151])
18
+
19
+ ## 6.2.2 / 2023-04-17
20
+
21
+ * Bugfixes
22
+ * Fix Rack-related NameError by adding :: operator ([#3118], [#3117])
23
+
24
+ ## 6.2.1 / 2023-03-31
25
+
26
+ * Bugfixes
27
+ * Fix java 8 compatibility ([#3109], [#3108])
28
+ * Always write io_buffer when in "enum bodies" branch. ([#3113], [#3112])
29
+ * Fix warn_if_in_single_mode incorrect message ([#3111])
30
+
31
+ ## 6.2.0 / 2023-03-29
32
+
33
+ * Features
34
+ * Ability to supply a custom logger ([#2770], [#2511])
35
+ * Warn when clustered-only hooks are defined in single mode ([#3089])
36
+ * Adds the on_booted event ([#2709])
37
+
38
+ * Bugfixes
39
+ * Loggers - internal_write - catch Errno::EINVAL ([#3091])
40
+ * commonlogger.rb - fix HIJACK time format, use constants, not strings ([#3074])
41
+ * Fixed some edge cases regarding request hijacking ([#3072])
42
+
43
+ ## 6.1.1 / 2023-02-28
44
+
45
+ * Bugfixes
46
+ * We no longer try to use the systemd plugin for JRuby ([#3079])
47
+ * Allow ::Rack::Handler::Puma.run to work regardless of whether Rack/Rackup are loaded ([#3080])
48
+
49
+ ## 6.1.0 / 2023-02-12
50
+
51
+ * Features
52
+ * WebSocket support via partial hijack ([#3058], [#3007])
53
+ * Add built-in systemd notify support ([#3011])
54
+ * Periodically send status to systemd ([#3006], [#2604])
55
+ * Introduce the ability to return 413: payload too large for requests ([#3040])
56
+ * Log loaded extensions when `PUMA_DEBUG` is set ([#3036], [#3020])
57
+
58
+ * Bugfixes
59
+ * Fix issue with rack 3 compatibility re: rackup ([#3061], [#3057])
60
+ * Allow setting TCP low_latency with SSL listener ([#3065])
61
+
62
+ * Performance
63
+ * Reduce memory usage for large file uploads ([#3062])
64
+
65
+ ## 6.0.2 / 2023-01-01
66
+
67
+ * Refactor
68
+ * Remove use of etc and time gems in Puma ([#3035], [#3033])
69
+ * Refactor const.rb - freeze ([#3016])
70
+
71
+ ## 6.0.1 / 2022-12-20
72
+
73
+ * Bugfixes
74
+ * Handle waking up a closed selector in Reactor#add ([#3005])
75
+ * Fixup response processing, enumerable bodies ([#3004], [#3000])
76
+ * Correctly close app body for all code paths ([#3002], [#2999])
77
+ * Refactor
78
+ * Add IOBuffer to Client, remove from ThreadPool thread instances ([#3013])
79
+
80
+ ## 6.0.0 / 2022-10-14
81
+
82
+ * Breaking Changes
83
+ * Dropping Ruby 2.2 and 2.3 support (now 2.4+) ([#2919])
84
+ * Remote_addr functionality has changed ([#2652], [#2653])
85
+ * No longer supporting Java 1.7 or below (JRuby 9.1 was the last release to support this) ([#2849])
86
+ * Remove nakayoshi GC ([#2933], [#2925])
87
+ * wait_for_less_busy_worker is now default on ([#2940])
88
+ * Prefix all environment variables with `PUMA_` ([#2924], [#2853])
89
+ * Removed some constants ([#2957], [#2958], [#2959], [#2960])
90
+ * The following classes are now part of Puma's private API: `Client`, `Cluster::Worker`, `Cluster::Worker`, `HandleRequest`. ([#2988])
91
+ * Configuration constants like `DefaultRackup` removed ([#2928])
92
+ * Extracted `LogWriter` from `Events` ([#2798])
93
+ * Only accept the standard 8 HTTP methods, others rejected with 501. ([#2932])
94
+
95
+ * Features
96
+ * Increase throughput on large (100kb+) response bodies by 3-10x ([#2896], [#2892])
97
+ * Increase throughput on file responses ([#2923])
98
+ * Add support for streaming bodies in Rack. ([#2740])
99
+ * Allow OpenSSL session reuse via a 'reuse' ssl_bind method or bind string query parameter ([#2845])
100
+ * Allow `run_hooks` to pass a hash to blocks for use later ([#2917], [#2915])
101
+ * Allow using `preload_app!` with `fork_worker` ([#2907])
102
+ * Support request_body_wait metric with higher precision ([#2953])
103
+ * Allow header values to be arrays (Rack 3) ([#2936], [#2931])
104
+ * Export Puma/Ruby versions in /stats ([#2875])
105
+ * Allow configuring request uri max length & request path max length ([#2840])
106
+ * Add a couple of public accessors ([#2774])
107
+ * Log entire backtrace when worker start fails ([#2891])
108
+ * [jruby] Enable TLSv1.3 support ([#2886])
109
+ * [jruby] support setting TLS protocols + rename ssl_cipher_list ([#2899])
110
+ * [jruby] Support a truststore option ([#2849], [#2904], [#2884])
111
+
112
+ * Bugfixes
113
+ * Load the configuration before passing it to the binder ([#2897])
114
+ * Do not raise error raised on HTTP methods we don't recognize or support, like CONNECT ([#2932], [#1441])
115
+ * Fixed a memory leak when creating a new SSL listener ([#2956])
116
+
117
+ * Refactor
118
+ * log_writer.rb - add internal_write method ([#2888])
119
+ * Extract prune_bundler code into it's own class. ([#2797])
120
+ * Refactor Launcher#run to increase readability (no logic change) ([#2795])
121
+ * Ruby 3.2 will have native IO#wait_* methods, don't require io/wait ([#2903])
122
+ * Various internal API refactorings ([#2942], [#2921], [#2922], [#2955])
123
+
124
+ ## 5.6.5 / 2022-08-23
125
+
126
+ * Feature
127
+ * Puma::ControlCLI - allow refork command to be sent as a request ([#2868], [#2866])
128
+
129
+ * Bugfixes
130
+ * NullIO#closed should return false ([#2883])
131
+ * [jruby] Fix TLS verification hang ([#2890], [#2729])
132
+ * extconf.rb - don't use pkg_config('openssl') if '--with-openssl-dir' is used ([#2885], [#2839])
133
+ * MiniSSL - detect SSL_CTX_set_dh_auto ([#2864], [#2863])
134
+ * Fix rack.after_reply exceptions breaking connections ([#2861], [#2856])
135
+ * Escape SSL cert and filenames ([#2855])
136
+ * Fail hard if SSL certs or keys are invalid ([#2848])
137
+ * Fail hard if SSL certs or keys cannot be read by user ([#2847])
138
+ * Fix build with Opaque DH in LibreSSL 3.5. ([#2838])
139
+ * Pre-existing socket file removed when TERM is issued after USR2 (if puma is running in cluster mode) ([#2817])
140
+ * Fix Puma::StateFile#load incompatibility ([#2810])
141
+
142
+ ## 5.6.4 / 2022-03-30
143
+
144
+ * Security
145
+ * Close several HTTP Request Smuggling exploits (CVE-2022-24790)
146
+
147
+ ## 5.6.2 / 2022-02-11
148
+
149
+ * Bugfix/Security
150
+ * Response body will always be `close`d. (GHSA-rmj8-8hhh-gv5h, related to [#2809])
151
+
152
+ ## 5.6.1 / 2022-01-26
153
+
154
+ * Bugfixes
155
+ * Reverted a commit which appeared to be causing occasional blank header values ([#2809])
156
+
157
+ ## 5.6.0 / 2022-01-25
158
+
159
+ * Features
160
+ * Support `localhost` integration in `ssl_bind` ([#2764], [#2708])
161
+ * Allow backlog parameter to be set with ssl_bind DSL ([#2780])
162
+ * Remove yaml (psych) requirement in StateFile ([#2784])
163
+ * Allow culling of oldest workers, previously was only youngest ([#2773], [#2794])
164
+ * Add worker_check_interval configuration option ([#2759])
165
+ * Always send lowlevel_error response to client ([#2731], [#2341])
166
+ * Support for cert_pem and key_pem with ssl_bind DSL ([#2728])
167
+
168
+ * Bugfixes
169
+ * Keep thread names under 15 characters, prevents breakage on some OSes ([#2733])
170
+ * Fix two 'old-style-definition' compile warning ([#2807], [#2806])
171
+ * Log environment correctly using option value ([#2799])
172
+ * Fix warning from Ruby master (will be 3.2.0) ([#2785])
173
+ * extconf.rb - fix openssl with old Windows builds ([#2757])
174
+ * server.rb - rescue handling (`Errno::EBADF`) for `@notify.close` ([#2745])
175
+
176
+ * Refactor
177
+ * server.rb - refactor code using @options[:remote_address] ([#2742])
178
+ * [jruby] a couple refactorings - avoid copy-ing bytes ([#2730])
179
+
180
+ ## 5.5.2 / 2021-10-12
181
+
182
+ * Bugfixes
183
+ * Allow UTF-8 in HTTP header values
184
+
185
+ ## 5.5.1 / 2021-10-12
186
+
187
+ * Feature (added as mistake - we don't normally do this on bugfix releases, sorry!)
188
+ * Allow setting APP_ENV in preference to RACK_ENV or RAILS_ENV ([#2702])
189
+
190
+ * Security
191
+ * Do not allow LF as a line ending in a header (CVE-2021-41136)
192
+
193
+ ## 5.5.0 / 2021-09-19
194
+
195
+ * Features
196
+ * Automatic SSL certificate provisioning for localhost, via localhost gem ([#2610], [#2257])
197
+ * add support for the PROXY protocol (v1 only) ([#2654], [#2651])
198
+ * Add a semantic CLI option for no config file ([#2689])
199
+
200
+ * Bugfixes
201
+ * More elaborate exception handling - lets some dead pumas die. ([#2700], [#2699])
202
+ * allow multiple after_worker_fork hooks ([#2690])
203
+ * Preserve BUNDLE_APP_CONFIG on worker fork ([#2688], [#2687])
204
+
205
+ * Performance
206
+ * Fix performance of server-side SSL connection close. ([#2675])
207
+
208
+ ## 5.4.0 / 2021-07-28
209
+
210
+ * Features
211
+ * Better/expanded names for threadpool threads ([#2657])
212
+ * Allow pkg_config for OpenSSL ([#2648], [#1412])
213
+ * Add `rack_url_scheme` to Puma::DSL, allows setting of `rack.url_scheme` header ([#2586], [#2569])
214
+
215
+ * Bugfixes
216
+ * `Binder#parse` - allow for symlinked unix path, add create_activated_fds debug ENV ([#2643], [#2638])
217
+ * Fix deprecation warning: minissl.c - Use Random.bytes if available ([#2642])
218
+ * Client certificates: set session id context while creating SSLContext ([#2633])
219
+ * Fix deadlock issue in thread pool ([#2656])
220
+
221
+ * Refactor
222
+ * Replace `IO.select` with `IO#wait_*` when checking a single IO ([#2666])
223
+
224
+ ## 5.3.2 / 2021-05-21
225
+
226
+ * Bugfixes
227
+ * Gracefully handle Rack not accepting CLI options ([#2630], [#2626])
228
+ * Fix sigterm misbehavior ([#2629])
229
+ * Improvements to keepalive-connection shedding ([#2628])
230
+
231
+ ## 5.3.1 / 2021-05-11
232
+
233
+ * Security
234
+ * Close keepalive connections after the maximum number of fast inlined requests (CVE-2021-29509) ([#2625])
235
+
236
+ ## 5.3.0 / 2021-05-07
237
+
238
+ * Features
239
+ * Add support for Linux's abstract sockets ([#2564], [#2526])
240
+ * Add debug to worker timeout and startup ([#2559], [#2528])
241
+ * Print warning when running one-worker cluster ([#2565], [#2534])
242
+ * Don't close systemd activated socket on pumactl restart ([#2563], [#2504])
243
+
244
+ * Bugfixes
245
+ * systemd - fix event firing ([#2591], [#2572])
246
+ * Immediately unlink temporary files ([#2613])
247
+ * Improve parsing of HTTP_HOST header ([#2605], [#2584])
248
+ * Handle fatal error that has no backtrace ([#2607], [#2552])
249
+ * Fix timing out requests too early ([#2606], [#2574])
250
+ * Handle segfault in Ruby 2.6.6 on thread-locals ([#2567], [#2566])
251
+ * Server#closed_socket? - parameter may be a MiniSSL::Socket ([#2596])
252
+ * Define UNPACK_TCP_STATE_FROM_TCP_INFO in the right place ([#2588], [#2556])
253
+ * request.rb - fix chunked assembly for ascii incompatible encodings, add test ([#2585], [#2583])
254
+
255
+ * Performance
256
+ * Reset peerip only if remote_addr_header is set ([#2609])
257
+ * Reduce puma_parser struct size ([#2590])
258
+
259
+ * Refactor
260
+ * Refactor drain on shutdown ([#2600])
261
+ * Micro optimisations in `wait_for_less_busy_worker` feature ([#2579])
262
+ * Lots of test fixes
263
+
1
264
  ## 5.2.2 / 2021-02-22
2
265
 
3
266
  * Bugfixes
@@ -180,6 +443,31 @@
180
443
  * Support parallel tests in verbose progress reporting ([#2223])
181
444
  * Refactor error handling in server accept loop ([#2239])
182
445
 
446
+ ## 4.3.12 / 2022-03-30
447
+
448
+ * Security
449
+ * Close several HTTP Request Smuggling exploits (CVE-2022-24790)
450
+
451
+ ## 4.3.11 / 2022-02-11
452
+
453
+ * Security
454
+ * Always close the response body (GHSA-rmj8-8hhh-gv5h)
455
+
456
+ ## 4.3.10 / 2021-10-12
457
+
458
+ * Bugfixes
459
+ * Allow UTF-8 in HTTP header values
460
+
461
+ ## 4.3.9 / 2021-10-12
462
+
463
+ * Security
464
+ * Do not allow LF as a line ending in a header (CVE-2021-41136)
465
+
466
+ ## 4.3.8 / 2021-05-11
467
+
468
+ * Security
469
+ * Close keepalive connections after the maximum number of fast inlined requests (CVE-2021-29509) ([#2625])
470
+
183
471
  ## 4.3.7 / 2020-11-30
184
472
 
185
473
  * Bugfixes
@@ -1708,8 +1996,199 @@ be added back in a future date when a java Puma::MiniSSL is added.
1708
1996
  * Bugfixes
1709
1997
  * Your bugfix goes here <Most recent on the top, like GitHub> (#Github Number)
1710
1998
 
1999
+ [#3106]:https://github.com/puma/puma/pull/3106 "PR by @MSP-Greg, merged 2023-05-29"
2000
+ [#3014]:https://github.com/puma/puma/issues/3014 "Issue by @kyledrake, closed 2023-05-29"
2001
+ [#3161]:https://github.com/puma/puma/pull/3161 "PR by @MSP-Greg, merged 2023-05-27"
2002
+ [#3037]:https://github.com/puma/puma/issues/3037 "Issue by @daisy1754, closed 2023-05-27"
2003
+ [#3133]:https://github.com/puma/puma/pull/3133 "PR by @stanhu, merged 2023-04-30"
2004
+ [#3132]:https://github.com/puma/puma/issues/3132 "Issue by @stanhu, closed 2023-04-30"
2005
+ [#3163]:https://github.com/puma/puma/pull/3163 "PR by @MSP-Greg, merged 2023-05-27"
2006
+ [#3155]:https://github.com/puma/puma/pull/3155 "PR by @dentarg, merged 2023-05-14"
2007
+ [#3148]:https://github.com/puma/puma/issues/3148 "Issue by @dentarg, closed 2023-05-14"
2008
+ [#3129]:https://github.com/puma/puma/pull/3129 "PR by @MSP-Greg, merged 2023-05-02"
2009
+ [#3137]:https://github.com/puma/puma/pull/3137 "PR by @MSP-Greg, merged 2023-04-30"
2010
+ [#3156]:https://github.com/puma/puma/pull/3156 "PR by @severin, merged 2023-05-16"
2011
+ [#3162]:https://github.com/puma/puma/pull/3162 "PR by @MSP-Greg, merged 2023-05-23"
2012
+ [#3151]:https://github.com/puma/puma/pull/3151 "PR by @nateberkopec, merged 2023-05-12"
2013
+ [#3118]:https://github.com/puma/puma/pull/3118 "PR by @ninoseki, merged 2023-04-01"
2014
+ [#3117]:https://github.com/puma/puma/issues/3117 "Issue by @ninoseki, closed 2023-04-01"
2015
+ [#3109]:https://github.com/puma/puma/pull/3109 "PR by @ahorek, merged 2023-03-31"
2016
+ [#3108]:https://github.com/puma/puma/issues/3108 "Issue by @treviateo, closed 2023-03-31"
2017
+ [#3113]:https://github.com/puma/puma/pull/3113 "PR by @collinsauve, merged 2023-03-31"
2018
+ [#3112]:https://github.com/puma/puma/issues/3112 "Issue by @dmke, closed 2023-03-31"
2019
+ [#3111]:https://github.com/puma/puma/pull/3111 "PR by @adzap, merged 2023-03-30"
2020
+ [#2770]:https://github.com/puma/puma/pull/2770 "PR by @vzajkov, merged 2023-03-29"
2021
+ [#2511]:https://github.com/puma/puma/issues/2511 "Issue by @jchristie55332, closed 2021-12-12"
2022
+ [#3089]:https://github.com/puma/puma/pull/3089 "PR by @Vuta, merged 2023-03-06"
2023
+ [#2709]:https://github.com/puma/puma/pull/2709 "PR by @rodzyn, merged 2023-02-20"
2024
+ [#3091]:https://github.com/puma/puma/pull/3091 "PR by @MSP-Greg, merged 2023-03-28"
2025
+ [#3074]:https://github.com/puma/puma/pull/3074 "PR by @MSP-Greg, merged 2023-03-14"
2026
+ [#3072]:https://github.com/puma/puma/pull/3072 "PR by @MSP-Greg, merged 2023-02-17"
2027
+ [#3079]:https://github.com/puma/puma/pull/3079 "PR by @mohamedhafez, merged 2023-02-24"
2028
+ [#3080]:https://github.com/puma/puma/pull/3080 "PR by @MSP-Greg, merged 2023-02-16"
2029
+ [#3058]:https://github.com/puma/puma/pull/3058 "PR by @dentarg, merged 2023-01-29"
2030
+ [#3007]:https://github.com/puma/puma/issues/3007 "Issue by @MSP-Greg, closed 2023-01-29"
2031
+ [#3011]:https://github.com/puma/puma/pull/3011 "PR by @joaomarcos96, merged 2023-01-03"
2032
+ [#3006]:https://github.com/puma/puma/pull/3006 "PR by @QWYNG, merged 2023-02-09"
2033
+ [#2604]:https://github.com/puma/puma/issues/2604 "Issue by @dgoetz, closed 2023-02-09"
2034
+ [#3040]:https://github.com/puma/puma/pull/3040 "PR by @shayonj, merged 2023-01-02"
2035
+ [#3036]:https://github.com/puma/puma/pull/3036 "PR by @MSP-Greg, merged 2023-01-13"
2036
+ [#3020]:https://github.com/puma/puma/issues/3020 "Issue by @dentarg, closed 2023-01-13"
2037
+ [#3061]:https://github.com/puma/puma/pull/3061 "PR by @MSP-Greg, merged 2023-02-12"
2038
+ [#3057]:https://github.com/puma/puma/issues/3057 "Issue by @mmarvb8h, closed 2023-02-12"
2039
+ [#3065]:https://github.com/puma/puma/pull/3065 "PR by @MSP-Greg, merged 2023-02-11"
2040
+ [#3062]:https://github.com/puma/puma/pull/3062 "PR by @willkoehler, merged 2023-01-29"
2041
+ [#3035]:https://github.com/puma/puma/pull/3035 "PR by @MSP-Greg, merged 2022-12-24"
2042
+ [#3033]:https://github.com/puma/puma/issues/3033 "Issue by @jules-w2, closed 2022-12-24"
2043
+ [#3016]:https://github.com/puma/puma/pull/3016 "PR by @MSP-Greg, merged 2022-12-24"
2044
+ [#3005]:https://github.com/puma/puma/pull/3005 "PR by @JuanitoFatas, merged 2022-11-04"
2045
+ [#3004]:https://github.com/puma/puma/pull/3004 "PR by @MSP-Greg, merged 2022-11-24"
2046
+ [#3000]:https://github.com/puma/puma/issues/3000 "Issue by @dentarg, closed 2022-11-24"
2047
+ [#3002]:https://github.com/puma/puma/pull/3002 "PR by @MSP-Greg, merged 2022-11-03"
2048
+ [#2999]:https://github.com/puma/puma/issues/2999 "Issue by @aymeric-ledorze, closed 2022-11-03"
2049
+ [#3013]:https://github.com/puma/puma/pull/3013 "PR by @MSP-Greg, merged 2022-11-13"
2050
+ [#2919]:https://github.com/puma/puma/pull/2919 "PR by @MSP-Greg, merged 2022-08-30"
2051
+ [#2652]:https://github.com/puma/puma/issues/2652 "Issue by @Roguelazer, closed 2022-09-04"
2052
+ [#2653]:https://github.com/puma/puma/pull/2653 "PR by @Roguelazer, closed 2022-03-07"
2053
+ [#2849]:https://github.com/puma/puma/pull/2849 "PR by @kares, merged 2022-04-09"
2054
+ [#2933]:https://github.com/puma/puma/pull/2933 "PR by @cafedomancer, merged 2022-09-09"
2055
+ [#2925]:https://github.com/puma/puma/issues/2925 "Issue by @nateberkopec, closed 2022-09-09"
2056
+ [#2940]:https://github.com/puma/puma/pull/2940 "PR by @cafedomancer, merged 2022-09-10"
2057
+ [#2924]:https://github.com/puma/puma/pull/2924 "PR by @cafedomancer, merged 2022-09-07"
2058
+ [#2853]:https://github.com/puma/puma/issues/2853 "Issue by @nateberkopec, closed 2022-09-07"
2059
+ [#2957]:https://github.com/puma/puma/pull/2957 "PR by @JuanitoFatas, merged 2022-09-16"
2060
+ [#2958]:https://github.com/puma/puma/pull/2958 "PR by @JuanitoFatas, merged 2022-09-16"
2061
+ [#2959]:https://github.com/puma/puma/pull/2959 "PR by @JuanitoFatas, merged 2022-09-16"
2062
+ [#2960]:https://github.com/puma/puma/pull/2960 "PR by @JuanitoFatas, merged 2022-09-16"
2063
+ [#2988]:https://github.com/puma/puma/pull/2988 "PR by @MSP-Greg, merged 2022-10-12"
2064
+ [#2928]:https://github.com/puma/puma/pull/2928 "PR by @nateberkopec, merged 2022-09-10"
2065
+ [#2798]:https://github.com/puma/puma/pull/2798 "PR by @johnnyshields, merged 2022-02-05"
2066
+ [#2932]:https://github.com/puma/puma/pull/2932 "PR by @mrzasa, merged 2022-09-12"
2067
+ [#2896]:https://github.com/puma/puma/pull/2896 "PR by @MSP-Greg, merged 2022-09-13"
2068
+ [#2892]:https://github.com/puma/puma/pull/2892 "PR by @guilleiguaran, closed 2022-09-13"
2069
+ [#2923]:https://github.com/puma/puma/pull/2923 "PR by @nateberkopec, merged 2022-09-09"
2070
+ [#2740]:https://github.com/puma/puma/pull/2740 "PR by @ioquatix, merged 2022-01-29"
2071
+ [#2845]:https://github.com/puma/puma/issues/2845 "Issue by @donv, closed 2022-03-22"
2072
+ [#2917]:https://github.com/puma/puma/pull/2917 "PR by @MSP-Greg, merged 2022-09-19"
2073
+ [#2915]:https://github.com/puma/puma/issues/2915 "Issue by @mperham, closed 2022-09-19"
2074
+ [#2907]:https://github.com/puma/puma/pull/2907 "PR by @casperisfine, merged 2022-09-15"
2075
+ [#2953]:https://github.com/puma/puma/pull/2953 "PR by @JuanitoFatas, merged 2022-09-14"
2076
+ [#2936]:https://github.com/puma/puma/pull/2936 "PR by @MSP-Greg, merged 2022-09-09"
2077
+ [#2931]:https://github.com/puma/puma/issues/2931 "Issue by @dentarg, closed 2022-09-09"
2078
+ [#2875]:https://github.com/puma/puma/pull/2875 "PR by @ylecuyer, merged 2022-05-19"
2079
+ [#2840]:https://github.com/puma/puma/pull/2840 "PR by @LukaszMaslej, merged 2022-04-13"
2080
+ [#2774]:https://github.com/puma/puma/pull/2774 "PR by @ob-stripe, merged 2022-01-31"
2081
+ [#2891]:https://github.com/puma/puma/pull/2891 "PR by @gingerlime, merged 2022-06-02"
2082
+ [#2886]:https://github.com/puma/puma/pull/2886 "PR by @kares, merged 2022-05-30"
2083
+ [#2899]:https://github.com/puma/puma/pull/2899 "PR by @kares, merged 2022-07-04"
2084
+ [#2904]:https://github.com/puma/puma/pull/2904 "PR by @kares, merged 2022-08-27"
2085
+ [#2884]:https://github.com/puma/puma/pull/2884 "PR by @kares, merged 2022-05-30"
2086
+ [#2897]:https://github.com/puma/puma/pull/2897 "PR by @Edouard-chin, merged 2022-08-27"
2087
+ [#1441]:https://github.com/puma/puma/issues/1441 "Issue by @nirvdrum, closed 2022-09-12"
2088
+ [#2956]:https://github.com/puma/puma/pull/2956 "PR by @MSP-Greg, merged 2022-09-15"
2089
+ [#2888]:https://github.com/puma/puma/pull/2888 "PR by @MSP-Greg, merged 2022-06-01"
2090
+ [#2797]:https://github.com/puma/puma/pull/2797 "PR by @johnnyshields, merged 2022-02-01"
2091
+ [#2795]:https://github.com/puma/puma/pull/2795 "PR by @johnnyshields, merged 2022-01-31"
2092
+ [#2903]:https://github.com/puma/puma/pull/2903 "PR by @MSP-Greg, merged 2022-08-27"
2093
+ [#2942]:https://github.com/puma/puma/pull/2942 "PR by @nateberkopec, merged 2022-09-15"
2094
+ [#2921]:https://github.com/puma/puma/issues/2921 "Issue by @MSP-Greg, closed 2022-09-15"
2095
+ [#2922]:https://github.com/puma/puma/issues/2922 "Issue by @MSP-Greg, closed 2022-09-10"
2096
+ [#2955]:https://github.com/puma/puma/pull/2955 "PR by @cafedomancer, merged 2022-09-15"
2097
+ [#2868]:https://github.com/puma/puma/pull/2868 "PR by @MSP-Greg, merged 2022-06-02"
2098
+ [#2866]:https://github.com/puma/puma/issues/2866 "Issue by @slondr, closed 2022-06-02"
2099
+ [#2883]:https://github.com/puma/puma/pull/2883 "PR by @MSP-Greg, merged 2022-06-02"
2100
+ [#2890]:https://github.com/puma/puma/pull/2890 "PR by @kares, merged 2022-06-01"
2101
+ [#2729]:https://github.com/puma/puma/issues/2729 "Issue by @kares, closed 2022-06-01"
2102
+ [#2885]:https://github.com/puma/puma/pull/2885 "PR by @MSP-Greg, merged 2022-05-30"
2103
+ [#2839]:https://github.com/puma/puma/issues/2839 "Issue by @wlipa, closed 2022-05-30"
2104
+ [#2864]:https://github.com/puma/puma/pull/2864 "PR by @MSP-Greg, merged 2022-04-26"
2105
+ [#2863]:https://github.com/puma/puma/issues/2863 "Issue by @eradman, closed 2022-04-26"
2106
+ [#2861]:https://github.com/puma/puma/pull/2861 "PR by @BlakeWilliams, merged 2022-04-17"
2107
+ [#2856]:https://github.com/puma/puma/issues/2856 "Issue by @nateberkopec, closed 2022-04-17"
2108
+ [#2855]:https://github.com/puma/puma/pull/2855 "PR by @stanhu, merged 2022-04-09"
2109
+ [#2848]:https://github.com/puma/puma/pull/2848 "PR by @stanhu, merged 2022-04-02"
2110
+ [#2847]:https://github.com/puma/puma/pull/2847 "PR by @stanhu, merged 2022-04-02"
2111
+ [#2838]:https://github.com/puma/puma/pull/2838 "PR by @epsilon-0, merged 2022-03-03"
2112
+ [#2817]:https://github.com/puma/puma/pull/2817 "PR by @khustochka, merged 2022-02-20"
2113
+ [#2810]:https://github.com/puma/puma/pull/2810 "PR by @kzkn, merged 2022-01-27"
2114
+ [#2809]:https://github.com/puma/puma/pull/2809 "PR by @dentarg, merged 2022-01-26"
2115
+ [#2764]:https://github.com/puma/puma/pull/2764 "PR by @dentarg, merged 2022-01-18"
2116
+ [#2708]:https://github.com/puma/puma/issues/2708 "Issue by @erikaxel, closed 2022-01-18"
2117
+ [#2780]:https://github.com/puma/puma/pull/2780 "PR by @dalibor, merged 2022-01-01"
2118
+ [#2784]:https://github.com/puma/puma/pull/2784 "PR by @MSP-Greg, merged 2022-01-01"
2119
+ [#2773]:https://github.com/puma/puma/pull/2773 "PR by @ob-stripe, merged 2022-01-01"
2120
+ [#2794]:https://github.com/puma/puma/pull/2794 "PR by @johnnyshields, merged 2022-01-10"
2121
+ [#2759]:https://github.com/puma/puma/pull/2759 "PR by @ob-stripe, merged 2021-12-11"
2122
+ [#2731]:https://github.com/puma/puma/pull/2731 "PR by @baelter, merged 2021-11-02"
2123
+ [#2341]:https://github.com/puma/puma/issues/2341 "Issue by @cjlarose, opened 2020-08-18"
2124
+ [#2728]:https://github.com/puma/puma/pull/2728 "PR by @dalibor, merged 2021-10-31"
2125
+ [#2733]:https://github.com/puma/puma/pull/2733 "PR by @ob-stripe, merged 2021-12-12"
2126
+ [#2807]:https://github.com/puma/puma/pull/2807 "PR by @MSP-Greg, merged 2022-01-25"
2127
+ [#2806]:https://github.com/puma/puma/issues/2806 "Issue by @olleolleolle, closed 2022-01-25"
2128
+ [#2799]:https://github.com/puma/puma/pull/2799 "PR by @ags, merged 2022-01-22"
2129
+ [#2785]:https://github.com/puma/puma/pull/2785 "PR by @MSP-Greg, merged 2022-01-02"
2130
+ [#2757]:https://github.com/puma/puma/pull/2757 "PR by @MSP-Greg, merged 2021-11-24"
2131
+ [#2745]:https://github.com/puma/puma/pull/2745 "PR by @MSP-Greg, merged 2021-11-03"
2132
+ [#2742]:https://github.com/puma/puma/pull/2742 "PR by @MSP-Greg, merged 2021-12-12"
2133
+ [#2730]:https://github.com/puma/puma/pull/2730 "PR by @kares, merged 2021-11-01"
2134
+ [#2702]:https://github.com/puma/puma/pull/2702 "PR by @jacobherrington, merged 2021-09-21"
2135
+ [#2610]:https://github.com/puma/puma/pull/2610 "PR by @ye-lin-aung, merged 2021-08-18"
2136
+ [#2257]:https://github.com/puma/puma/issues/2257 "Issue by @nateberkopec, closed 2021-08-18"
2137
+ [#2654]:https://github.com/puma/puma/pull/2654 "PR by @Roguelazer, merged 2021-09-07"
2138
+ [#2651]:https://github.com/puma/puma/issues/2651 "Issue by @Roguelazer, closed 2021-09-07"
2139
+ [#2689]:https://github.com/puma/puma/pull/2689 "PR by @jacobherrington, merged 2021-09-05"
2140
+ [#2700]:https://github.com/puma/puma/pull/2700 "PR by @ioquatix, merged 2021-09-16"
2141
+ [#2699]:https://github.com/puma/puma/issues/2699 "Issue by @ioquatix, closed 2021-09-16"
2142
+ [#2690]:https://github.com/puma/puma/pull/2690 "PR by @doits, merged 2021-09-06"
2143
+ [#2688]:https://github.com/puma/puma/pull/2688 "PR by @jdelStrother, merged 2021-09-03"
2144
+ [#2687]:https://github.com/puma/puma/issues/2687 "Issue by @jdelStrother, closed 2021-09-03"
2145
+ [#2675]:https://github.com/puma/puma/pull/2675 "PR by @devwout, merged 2021-09-08"
2146
+ [#2657]:https://github.com/puma/puma/pull/2657 "PR by @olivierbellone, merged 2021-07-13"
2147
+ [#2648]:https://github.com/puma/puma/pull/2648 "PR by @MSP-Greg, merged 2021-06-27"
2148
+ [#1412]:https://github.com/puma/puma/issues/1412 "Issue by @x-yuri, closed 2021-06-27"
2149
+ [#2586]:https://github.com/puma/puma/pull/2586 "PR by @MSP-Greg, merged 2021-05-26"
2150
+ [#2569]:https://github.com/puma/puma/issues/2569 "Issue by @tarragon, closed 2021-05-26"
2151
+ [#2643]:https://github.com/puma/puma/pull/2643 "PR by @MSP-Greg, merged 2021-06-27"
2152
+ [#2638]:https://github.com/puma/puma/issues/2638 "Issue by @gingerlime, closed 2021-06-27"
2153
+ [#2642]:https://github.com/puma/puma/pull/2642 "PR by @MSP-Greg, merged 2021-06-16"
2154
+ [#2633]:https://github.com/puma/puma/pull/2633 "PR by @onlined, merged 2021-06-04"
2155
+ [#2656]:https://github.com/puma/puma/pull/2656 "PR by @olivierbellone, merged 2021-07-07"
2156
+ [#2666]:https://github.com/puma/puma/pull/2666 "PR by @MSP-Greg, merged 2021-07-25"
2157
+ [#2630]:https://github.com/puma/puma/pull/2630 "PR by @seangoedecke, merged 2021-05-20"
2158
+ [#2626]:https://github.com/puma/puma/issues/2626 "Issue by @rorymckinley, closed 2021-05-20"
2159
+ [#2629]:https://github.com/puma/puma/pull/2629 "PR by @ye-lin-aung, merged 2021-05-20"
2160
+ [#2628]:https://github.com/puma/puma/pull/2628 "PR by @wjordan, merged 2021-05-20"
2161
+ [#2625]:https://github.com/puma/puma/issues/2625 "Issue by @jarthod, closed 2021-05-11"
2162
+ [#2564]:https://github.com/puma/puma/pull/2564 "PR by @MSP-Greg, merged 2021-04-24"
2163
+ [#2526]:https://github.com/puma/puma/issues/2526 "Issue by @nerdrew, closed 2021-04-24"
2164
+ [#2559]:https://github.com/puma/puma/pull/2559 "PR by @ylecuyer, merged 2021-03-11"
2165
+ [#2528]:https://github.com/puma/puma/issues/2528 "Issue by @cjlarose, closed 2021-03-11"
2166
+ [#2565]:https://github.com/puma/puma/pull/2565 "PR by @CGA1123, merged 2021-03-09"
2167
+ [#2534]:https://github.com/puma/puma/issues/2534 "Issue by @nateberkopec, closed 2021-03-09"
2168
+ [#2563]:https://github.com/puma/puma/pull/2563 "PR by @MSP-Greg, merged 2021-03-06"
2169
+ [#2504]:https://github.com/puma/puma/issues/2504 "Issue by @fsateler, closed 2021-03-06"
2170
+ [#2591]:https://github.com/puma/puma/pull/2591 "PR by @MSP-Greg, merged 2021-05-05"
2171
+ [#2572]:https://github.com/puma/puma/issues/2572 "Issue by @josefbilendo, closed 2021-05-05"
2172
+ [#2613]:https://github.com/puma/puma/pull/2613 "PR by @smcgivern, merged 2021-04-27"
2173
+ [#2605]:https://github.com/puma/puma/pull/2605 "PR by @pascalbetz, merged 2021-04-26"
2174
+ [#2584]:https://github.com/puma/puma/issues/2584 "Issue by @kaorihinata, closed 2021-04-26"
2175
+ [#2607]:https://github.com/puma/puma/pull/2607 "PR by @calvinxiao, merged 2021-04-23"
2176
+ [#2552]:https://github.com/puma/puma/issues/2552 "Issue by @feliperaul, closed 2021-05-24"
2177
+ [#2606]:https://github.com/puma/puma/pull/2606 "PR by @wjordan, merged 2021-04-20"
2178
+ [#2574]:https://github.com/puma/puma/issues/2574 "Issue by @darkhelmet, closed 2021-04-20"
2179
+ [#2567]:https://github.com/puma/puma/pull/2567 "PR by @kddnewton, merged 2021-04-19"
2180
+ [#2566]:https://github.com/puma/puma/issues/2566 "Issue by @kddnewton, closed 2021-04-19"
2181
+ [#2596]:https://github.com/puma/puma/pull/2596 "PR by @MSP-Greg, merged 2021-04-18"
2182
+ [#2588]:https://github.com/puma/puma/pull/2588 "PR by @dentarg, merged 2021-04-02"
2183
+ [#2556]:https://github.com/puma/puma/issues/2556 "Issue by @gamecreature, closed 2021-04-02"
2184
+ [#2585]:https://github.com/puma/puma/pull/2585 "PR by @MSP-Greg, merged 2021-03-26"
2185
+ [#2583]:https://github.com/puma/puma/issues/2583 "Issue by @jboler, closed 2021-03-26"
2186
+ [#2609]:https://github.com/puma/puma/pull/2609 "PR by @calvinxiao, merged 2021-04-26"
2187
+ [#2590]:https://github.com/puma/puma/pull/2590 "PR by @calvinxiao, merged 2021-04-05"
2188
+ [#2600]:https://github.com/puma/puma/pull/2600 "PR by @wjordan, merged 2021-04-30"
2189
+ [#2579]:https://github.com/puma/puma/pull/2579 "PR by @ghiculescu, merged 2021-03-17"
2190
+ [#2553]:https://github.com/puma/puma/pull/2553 "PR by @olivierbellone, merged 2021-02-10"
1711
2191
  [#2557]:https://github.com/puma/puma/pull/2557 "PR by @cjlarose, merged 2021-02-22"
1712
- [#2553]:https://github.com/puma/puma/pull/2553 "PR by @olivierbellone, merged 02-10-22"
1713
2192
  [#2550]:https://github.com/puma/puma/pull/2550 "PR by @MSP-Greg, merged 2021-02-05"
1714
2193
  [#2547]:https://github.com/puma/puma/pull/2547 "PR by @wildmaples, merged 2021-02-03"
1715
2194
  [#2543]:https://github.com/puma/puma/pull/2543 "PR by @MSP-Greg, merged 2021-02-01"
@@ -1717,7 +2196,7 @@ be added back in a future date when a java Puma::MiniSSL is added.
1717
2196
  [#2519]:https://github.com/puma/puma/pull/2519 "PR by @MSP-Greg, merged 2021-01-26"
1718
2197
  [#2522]:https://github.com/puma/puma/pull/2522 "PR by @jcmfernandes, merged 2021-01-12"
1719
2198
  [#2490]:https://github.com/puma/puma/pull/2490 "PR by @Bonias, merged 2020-12-07"
1720
- [#2486]:https://github.com/puma/puma/pull/2486 "PR by @ccverak, merged 2020-12-02"
2199
+ [#2486]:https://github.com/puma/puma/pull/2486 "PR by @karloscodes, merged 2020-12-02"
1721
2200
  [#2535]:https://github.com/puma/puma/pull/2535 "PR by @MSP-Greg, merged 2021-01-27"
1722
2201
  [#2529]:https://github.com/puma/puma/pull/2529 "PR by @MSP-Greg, merged 2021-01-24"
1723
2202
  [#2533]:https://github.com/puma/puma/pull/2533 "PR by @MSP-Greg, merged 2021-01-24"
@@ -1727,7 +2206,7 @@ be added back in a future date when a java Puma::MiniSSL is added.
1727
2206
  [#2521]:https://github.com/puma/puma/pull/2521 "PR by @ojab, merged 2021-01-04"
1728
2207
  [#2531]:https://github.com/puma/puma/pull/2531 "PR by @wjordan, merged 2021-01-19"
1729
2208
  [#2510]:https://github.com/puma/puma/pull/2510 "PR by @micke, merged 2020-12-10"
1730
- [#2472]:https://github.com/puma/puma/pull/2472 "PR by @ccverak, merged 2020-11-02"
2209
+ [#2472]:https://github.com/puma/puma/pull/2472 "PR by @karloscodes, merged 2020-11-02"
1731
2210
  [#2438]:https://github.com/puma/puma/pull/2438 "PR by @ekohl, merged 2020-10-26"
1732
2211
  [#2406]:https://github.com/puma/puma/pull/2406 "PR by @fdel15, merged 2020-10-19"
1733
2212
  [#2449]:https://github.com/puma/puma/pull/2449 "PR by @MSP-Greg, merged 2020-10-28"
@@ -2154,7 +2633,7 @@ be added back in a future date when a java Puma::MiniSSL is added.
2154
2633
  [#709]:https://github.com/puma/puma/pull/709 "PR by @lian, merged 2015-06-10"
2155
2634
  [#711]:https://github.com/puma/puma/pull/711 "PR by @julik, merged 2015-06-10"
2156
2635
  [#712]:https://github.com/puma/puma/pull/712 "PR by @chewi, merged 2015-07-14"
2157
- [#715]:https://github.com/puma/puma/pull/715 "PR by @0RaymondJiang0, merged 2015-07-14"
2636
+ [#715]:https://github.com/puma/puma/pull/715 "PR by @raymondmars, merged 2015-07-14"
2158
2637
  [#725]:https://github.com/puma/puma/pull/725 "PR by @rwz, merged 2015-07-14"
2159
2638
  [#726]:https://github.com/puma/puma/pull/726 "PR by @jshafton, merged 2015-07-14"
2160
2639
  [#729]:https://github.com/puma/puma/pull/729 "PR by @allaire, merged 2015-07-14"