puma 6.4.3 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +448 -8
  3. data/README.md +110 -51
  4. data/docs/5.0-Upgrade.md +98 -0
  5. data/docs/6.0-Upgrade.md +56 -0
  6. data/docs/7.0-Upgrade.md +52 -0
  7. data/docs/8.0-Upgrade.md +100 -0
  8. data/docs/deployment.md +58 -23
  9. data/docs/fork_worker.md +11 -1
  10. data/docs/grpc.md +62 -0
  11. data/docs/images/favicon.svg +1 -0
  12. data/docs/images/running-puma.svg +1 -0
  13. data/docs/images/standard-logo.svg +1 -0
  14. data/docs/java_options.md +54 -0
  15. data/docs/jungle/README.md +1 -1
  16. data/docs/kubernetes.md +11 -16
  17. data/docs/plugins.md +6 -2
  18. data/docs/restart.md +2 -2
  19. data/docs/signals.md +21 -21
  20. data/docs/stats.md +11 -5
  21. data/docs/systemd.md +14 -5
  22. data/ext/puma_http11/extconf.rb +20 -32
  23. data/ext/puma_http11/http11_parser.java.rl +51 -65
  24. data/ext/puma_http11/mini_ssl.c +29 -9
  25. data/ext/puma_http11/org/jruby/puma/EnvKey.java +241 -0
  26. data/ext/puma_http11/org/jruby/puma/Http11.java +194 -101
  27. data/ext/puma_http11/org/jruby/puma/Http11Parser.java +71 -85
  28. data/ext/puma_http11/puma_http11.c +125 -118
  29. data/lib/puma/app/status.rb +11 -3
  30. data/lib/puma/binder.rb +22 -12
  31. data/lib/puma/cli.rb +11 -9
  32. data/lib/puma/client.rb +233 -136
  33. data/lib/puma/client_env.rb +171 -0
  34. data/lib/puma/cluster/worker.rb +24 -21
  35. data/lib/puma/cluster/worker_handle.rb +38 -8
  36. data/lib/puma/cluster.rb +74 -48
  37. data/lib/puma/cluster_accept_loop_delay.rb +91 -0
  38. data/lib/puma/commonlogger.rb +3 -3
  39. data/lib/puma/configuration.rb +197 -64
  40. data/lib/puma/const.rb +23 -12
  41. data/lib/puma/control_cli.rb +11 -7
  42. data/lib/puma/detect.rb +13 -0
  43. data/lib/puma/dsl.rb +483 -127
  44. data/lib/puma/error_logger.rb +7 -5
  45. data/lib/puma/events.rb +25 -10
  46. data/lib/puma/io_buffer.rb +8 -4
  47. data/lib/puma/jruby_restart.rb +0 -16
  48. data/lib/puma/launcher/bundle_pruner.rb +3 -5
  49. data/lib/puma/launcher.rb +76 -59
  50. data/lib/puma/log_writer.rb +17 -11
  51. data/lib/puma/minissl/context_builder.rb +1 -0
  52. data/lib/puma/minissl.rb +1 -1
  53. data/lib/puma/null_io.rb +26 -0
  54. data/lib/puma/plugin/systemd.rb +3 -3
  55. data/lib/puma/rack/urlmap.rb +1 -1
  56. data/lib/puma/reactor.rb +19 -13
  57. data/lib/puma/{request.rb → response.rb} +57 -209
  58. data/lib/puma/runner.rb +15 -17
  59. data/lib/puma/sd_notify.rb +1 -4
  60. data/lib/puma/server.rb +200 -104
  61. data/lib/puma/server_plugin_control.rb +32 -0
  62. data/lib/puma/single.rb +7 -4
  63. data/lib/puma/state_file.rb +3 -2
  64. data/lib/puma/thread_pool.rb +179 -96
  65. data/lib/puma/util.rb +0 -7
  66. data/lib/puma.rb +10 -0
  67. data/lib/rack/handler/puma.rb +11 -8
  68. data/tools/Dockerfile +15 -5
  69. metadata +26 -16
  70. data/ext/puma_http11/ext_help.h +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3cedcd91a2366db019124505992d71ff47717760e4c3f37d9e7ae681c45bbdb
4
- data.tar.gz: 6ad4999caa3542103c8bb2d3a1bd49202e1c8cf71d409ee96e13d23c169f0d32
3
+ metadata.gz: 6c96b9615e3021ca787fdb02a91af1bcfc2c2201465efd375e94c0100d089ece
4
+ data.tar.gz: 620a8240509ff2acbac19e20b4d8f55aa7cef0b6fb8bef0836f31c848b9def67
5
5
  SHA512:
6
- metadata.gz: a69d8cec268d2e35444609f2e69e737e47eb1dc30dd2b3a387e5f3e84bc4905d8241ae3b158f39259a9930ca093fff17db927039aaef54583e6c1a30d8b12a61
7
- data.tar.gz: f03e924b53e70ac876c786031b23775e4b91aa5d009d5f40fb9a0c241093a238c4b78a99fc062c8495e634b2cfc8561626e9aaf0888c203d40cf84f9d14c539b
6
+ metadata.gz: 88e2c0146d21143793a559dbb515ce22866266a5750acd0e55c9d84bbc41c536341e3602b34d4e192dad265102bc6bd93b0e300d1ee60806482aa9ba67e59e29
7
+ data.tar.gz: 6f5d132d87d2b78a3b240eec1029f7eab30ce22f5de1dfcbc1ba0bc2d253655b58594bd1104def34cb169a56aef4642666267dcadb347f2381e63179dddf1946
data/History.md CHANGED
@@ -1,3 +1,268 @@
1
+ ## 8.0.2 / 2026-05-27
2
+
3
+ * Bugfixes
4
+ * Anchor PROXY protocol v1 regex to string start and enforce max line length to prevent injection via crafted request bodies ([#3944])
5
+ * Parse PROXY protocol header only on the first request per connection to prevent spoofing on keep-alive connections ([#3944])
6
+
7
+ ## 8.0.1 / 2026-04-27
8
+
9
+ * Bugfixes
10
+ * Fix `prune_bundler` stripping user-configured `BUNDLE_*` env vars (e.g. `BUNDLE_WITHOUT`) on re-exec, which caused workers to crash on boot ([#3929])
11
+
12
+ * Performance
13
+ * Use blocks for debug logging to avoid creating log messages when debug is disabled ([#3920])
14
+
15
+ * Docs
16
+ * Fix incorrect hook names in gRPC docs ([#3923])
17
+ * Reword v8 upgrade guide IPv6 bullet for clarity ([#3928])
18
+
19
+ ## 8.0.0 / 2026-03-27
20
+
21
+ * Features
22
+ * Add `env["puma.mark_as_io_bound"]` API and `max_io_threads` config to allow IO-bound requests to exceed the thread pool max, enabling better handling of mixed workloads ([#3816], [#3894])
23
+ * Add `single` and `cluster` DSL hooks for mode-specific configuration ([#3621])
24
+ * Add `on_force` option to `shutdown_debug` to only dump thread backtraces on forced (non-graceful) shutdown ([#3671])
25
+ * Add API to dynamically update min and max thread counts at runtime via `update_thread_pool_min_max` and `ServerPluginControl` ([#3658])
26
+ * Use SIGPWR for thread backtrace dumps on Linux/JRuby where SIGINFO is unavailable ([#3829])
27
+
28
+ * Bugfixes
29
+ * Fix phased restart for `fork_worker` to avoid forking from stale worker 0 when it has been replaced ([#3853])
30
+
31
+ * Performance
32
+ * JRuby HTTP parser improvements: pre-allocated header keys, perfect hash lookup, reduced memory copies ([#3838])
33
+ * Cache downcased header key in `str_headers` to avoid redundant `String#downcase` calls, reducing allocations by ~50% per response ([#3874])
34
+
35
+ * Refactor
36
+ * Collect `env` processing into dedicated `client_env.rb` module ([#3582])
37
+ * Move event to default configuration ([#3872])
38
+
39
+ * Docs
40
+ * Add gRPC guide for configuring gRPC lifecycle hooks in clustered mode ([#3885])
41
+ * Add 7.0 upgrade guide, move 5.0/6.0 upgrade guides to docs directory ([#3900])
42
+ * Correct default values for `persistent_timeout` and `worker_boot_timeout` in DSL docs ([#3912])
43
+ * Add file descriptor limit warning in test helper for contributors ([#3893])
44
+
45
+ * Breaking changes
46
+ * Default production bind address changed from `0.0.0.0` to `::` (IPv6) when a non-loopback IPv6 interface is available; falls back to `0.0.0.0` if IPv6 is unavailable ([#3847])
47
+
48
+ ## 7.2.0 / 2026-01-20
49
+
50
+ * Features
51
+ * Add workers `:auto` ([#3827])
52
+ * Make it possible to restrict control server commands to stats ([#3787])
53
+
54
+ * Bugfixes
55
+ * Don't break if `WEB_CONCURRENCY` is set to a blank string ([#3837])
56
+ * Don't share server between worker 0 and descendants on refork ([#3602])
57
+ * Fix phase check race condition in `Puma::Cluster#check_workers` ([#3690])
58
+ * Fix advertising of CLI config before config files are loaded ([#3823])
59
+
60
+ * Performance
61
+ * 17% faster HTTP parsing through pre-interning env keys ([#3825])
62
+ * Implement `dsize` and `dcompact` functions for `Puma::HttpParser`, which makes Puma's C-extension GC-compactible ([#3828])
63
+
64
+ * Refactor
65
+ * Remove `NoMethodError` rescue in `Reactor#select_loop` ([#3831])
66
+ * Various cleanups in the C extension ([#3814])
67
+ * Monomorphize `handle_request` return ([#3802])
68
+
69
+ * Docs
70
+ * Change link to `docs/deployment.md` in `README.md` ([#3848])
71
+ * Fix formatting for each signal description in signals.md ([#3813])
72
+ * Update deployment and Kubernetes docs with Puma configuration tips ([#3807])
73
+ * Rename master to main ([#3809], [#3808], [#3800])
74
+ * Fix some minor typos in the docs ([#3804])
75
+ * Add `GOVERNANCE.md`, `MAINTAINERS` ([#3826])
76
+ * Remove Code Climate badge ([#3820])
77
+ * Add @joshuay03 to the maintainer list
78
+
79
+ * CI
80
+ * Use Minitest 6 where applicable ([#3859])
81
+ * Many test suite improvements and flake fixes ([#3861], [#3863], [#3860], [#3852], [#3857], [#3856], [#3845], [#3843], [#3842], [#3841], [#3822], [#3817], [#3764])
82
+
83
+ ## 7.1.0 / 2025-10-16
84
+
85
+ * Features
86
+ * Introduce `after_worker_shutdown` hook ([#3707])
87
+ * Reintroduce keepalive "fast inline" behavior. Provides faster (8x on JRuby & 1.4x on Ruby) pipeline processing ([#3794])
88
+
89
+ * Bugfixes
90
+ * Skip reading zero bytes when request body is buffered ([#3795])
91
+ * Fix `PUMA_LOG_CONFIG=1` logging twice with prune_bundler enabled ([#3778])
92
+ * Fix prune_bundler not showing in `PUMA_LOG_CONFIG=1` output ([#3779])
93
+ * Guard ThreadPool method call, which may be nil during shutdown ([#3791], [#3790])
94
+ * Set `Thread.current.puma_server` in Thread init code, not every request ([#3774])
95
+ * Fix race condition while deleting pidfile ([#3657])
96
+
97
+ ## 7.0.4 / 2025-09-23
98
+
99
+ * Bugfixes
100
+ * Fix SSL_shutdown error handling ([#3703])
101
+ * Strip whitespace from the beginnings of request header values. ([#3742])
102
+
103
+ * Performance
104
+ * puma_http11.c: Use interned UTF-8 strings for hash keys ([#3754])
105
+ * Move sleep cluster logic to its own class ([#3746], [#3740])
106
+
107
+ ## 7.0.3 / 2025-09-13
108
+
109
+ * Performance
110
+ * server.rb - process_client - add ka to todo if readable & complete ([#3748])
111
+
112
+ * Bugfixes
113
+ * Convert PUMA_PERSISTENT_TIMEOUT to an Integer ([#3749])
114
+
115
+ ## 7.0.2 / 2025-09-08
116
+
117
+ * Bugfixes
118
+ * bug: control_cli.rb - Fixup `pumactl` code to load puma.rb for `deprecate_method_change` ([#3736], [#3734])
119
+ * Replace sleep spin lock with condition variable ([#3729])
120
+ * Fix Puma not booting if queue_requests disabled ([#3731])
121
+
122
+ ## 7.0.1 / 2025-09-06
123
+
124
+ * Bugfixes
125
+ * Add backward compatibility aliases for Events class methods ([#3725])
126
+
127
+ ## 7.0.0 / 2025-09-03
128
+
129
+ * Breaking changes
130
+ * Set default `max_keep_alive` to 999 ([#3719])
131
+ * Increase `persistent_timeout` default to 65 seconds ([#3378])
132
+ * Raise an ArgumentError if no block given to hooks ([#3377])
133
+ * Don't set env['HTTP_VERSION'] for Rack > 3.1 ([#3711], [#3576])
134
+ * Runner.rb - remove `ruby_engine` method, deprecated Nov-2024 ([#3701])
135
+ * Config `preload_app!` is now the default for clustered mode ([#3297])
136
+ * Config instance must be `clamp`-d before reading any values ([#3297])
137
+ * Response headers set to lowercase ([#3704])
138
+ * Update minimum Ruby version to 3.0 ([#3698])
139
+ * Rename callback hooks ([#3438])
140
+
141
+ | Old hook name| New hook name|
142
+ |----------|----------|
143
+ | on_worker_boot | before_worker_boot |
144
+ | on_worker_shutdown | before_worker_shutdown |
145
+ | on_restart | before_restart |
146
+ | on_booted | after_booted |
147
+ | on_stopped | after_stopped |
148
+ | on_refork | before_refork |
149
+ | on_thread_start | before_thread_start |
150
+ | on_thread_exit | before_thread_exit |
151
+ | on_worker_fork | before_worker_fork |
152
+
153
+ * Features
154
+ * Fix long tail response problem with keepalive connections ([#3678]) (Previously released in 7.0.0.pre1, this was a high effort change)
155
+ * Introduce support for fiber-per-request. ([#3101])
156
+ * Add support for `rack.response_finished` ([#3681])
157
+ * Feature/support custom logger with request logs ([#3140])
158
+
159
+ * Bugfixes
160
+ * Fix error_logger inproperly logging `env[QUERY_STRING]` ([#3713], [#3625])
161
+ * Fix handling of invalid Transfer-Encoding header errors ([#3702])
162
+ * Fix socket leak on monitor wakeup `NoMethodError` in `Reactor#select_loop` ([#3696], [#3695])
163
+ * CI: puma_socket.rb fixup socket/request writes ([#3684])
164
+ * Warn when RUBY_MN_THREADS env var is set ([#3721])
165
+ * Improve the DSL `preload_app!` doc ([#3712])
166
+ * Fix the ability to focus individual tests ([#3705])
167
+ * Set env['rack.hijack'] to client.method(:full_hijack) ([#3073])
168
+
169
+ * Performance
170
+ * server.rb - initialize ivars `@reactor` and `@env_set_http_version` ([#3714])
171
+
172
+ * Refactor
173
+ * Simplify `Puma::DSL#process_hook` logic ([#3710])
174
+ * Dry up deprecation warnings and fix deprecation warnings when running CI. ([#3709], [#3708])
175
+ * Ensure and enforce that configs are loaded before options are accessed ([#3616])
176
+
177
+ ## 7.0.0.pre1 / 2025-07-31
178
+
179
+ * Changed
180
+ * Fix long tail response problem with keepalive connections ([#3678])
181
+
182
+ ## 6.6.1 / 2025-07-30
183
+
184
+ * Bugfixes
185
+ * Accept `to_path` to be `nil` on request bodies ([#3635])
186
+ * Fix single runner stats before the server start ([#3572])
187
+ * Fix incomplete worker boot state on refork ([#3601])
188
+ * Improve HttpParserError messages for better debugging ([#3586])
189
+ * Fix refork logs to distinguish from phased restarts ([#3598])
190
+ * Fix `rack.after_reply` so it doesn't interrupt chain on error ([#3680])
191
+
192
+ ## 6.6.0 / 2025-01-29
193
+
194
+ * Features
195
+ * Option to turn off SIGUSR2 trapping ([#3570], [#3567])
196
+ * Shorten `ThreadPool` trimmer and reaper thread names ([#3383])
197
+ * Add after_refork hook ([#3386])
198
+ * Add busy threads stat ([#3517])
199
+ * Add a debug log before running each type of hook ([#3375])
200
+ * Allow alternative schemes in Binder ([#3348], [#3302])
201
+ * Avoid spawning `Threadpool#trim` thread if pool size is fixed ([#3384])
202
+
203
+ * Bugfixes
204
+ * Change `HttpParserError` to be subclass of `StandardError` ([#3590], [#3552])
205
+ * added test cases
206
+ * fix update phased restart symlink folder
207
+
208
+ * Performance
209
+ * Only ping worker 0 during phased restart if using fork worker ([#3568])
210
+
211
+ * Refactor
212
+ * Fix multi-delimiter split to get status app token ([#3505])
213
+ * Change ping to use const ([#3595])
214
+ * Fixup use of Puma::Const::PipeRequest constants ([#3565])
215
+ * Update DSL hook processing logic to be consistent ([#3376])
216
+
217
+ ## 6.5.0 / 2024-11-23
218
+
219
+ * Features
220
+ * Print RUBY_DESCRIPTION when Puma starts ([#3407])
221
+ * Set the worker process count automatically when using WEB_CONCURRENCY=auto ([#3439], [#3437])
222
+ * Mark as ractor-safe ([#3486], [#3422])
223
+ * Add option `enable_keep_alive`. `true` mimics existing behavior, but now can use `false` to disable keepalive to reduce queue tail latency ([#3496])
224
+ * Add parameters to Puma methods to allow CI to change ENV in isolation ([#3485])
225
+ * Add `ssl_ciphersuites` option for TLSv1.3 ciphers ([#3359], [#3343])
226
+ * You can now use `--threads 5` or `threads 5` to config max/min threads with a single number (used to need to say `5:5`) ([#3309])
227
+ * Option to turn off systemd plugin ([#3425], [#3424])
228
+ * Add `on_stopped` hook ([#3411], [#3380])
229
+
230
+ * Bugfixes
231
+ * Handle blank environment variables when loading config ([#3539])
232
+ * lib/rack/handler/puma.rb - fix for rackup v1.0.1, adjust Gemfile ([#3532], [#3531])
233
+ * null_io.rb - add `external_encoding`, `set_encoding`, `binmode`, `binmode?` ([#3214])
234
+ * Implement NullIO#seek and #pos to mimic IO ([#3468])
235
+ * add support in rack handler & fix regression in binder for linux abstract namespace sockets ([#3508])
236
+ * Use actual thread local for `Puma::Server.current`. ([#3360])
237
+ * client.rb - fix request chunked body handling ([#3338], [#3337])
238
+ * Properly handle two requests seen in the initial buffer ([#3332])
239
+ * Fix response repeated status line when request is invalid or errors are raised ([#3308], [#3307])
240
+ * Fix child processes not being reaped when `Process.detach` used ([#3314], [#3313])
241
+
242
+ * JRuby
243
+ * Make HTTP length constants configurable ([#3518])
244
+ * Fixup jruby_restart.rb & launcher.rb to work with ARM64 macOS JRuby ([#3467])
245
+
246
+ * Performance
247
+ * Avoid checking if all workers reached timeout unless idle timeout is configured ([#3341])
248
+ * Request body - increase read size to 64 kB ([#3548])
249
+ * single mode skip wait_for_less_busy_worker ([#3325])
250
+
251
+ * Refactor
252
+ * A ton of CI/test improvements by @MSP-Greg, as usual.
253
+ * Add ThreadPool#stats and adjust Server#stats to use it ([#3527])
254
+ * normalize whitespace in worker stats string ([#3513])
255
+ * rack/handler/puma.rb - ssl - use `start_with?`, add test ([#3510])
256
+ * extconf.rb - add logging for OpenSSL versions ([#3370])
257
+ * Lazily require `Puma::Rack::Builder` ([#3340])
258
+ * Refactor: Constantize worker pipe request types ([#3318])
259
+
260
+ * Docs
261
+ * stats.md improvements ([#3514])
262
+ * control_cli.rb: Harmonize help message with bin/puma ([#3434])
263
+ * dsl.rb: Clarify a callback's argument ([#3435])
264
+ * lib/rack/handler/puma.rb - relocate and fixup module comment ([#3495])
265
+
1
266
  ## 6.4.3 / 2024-09-19
2
267
 
3
268
  * Security
@@ -89,7 +354,7 @@
89
354
 
90
355
  * Features
91
356
  * Ability to supply a custom logger ([#2770], [#2511])
92
- * Warn when clustered-only hooks are defined in single mode ([#3089])
357
+ * Warn when cluster mode-only hooks are defined in single mode ([#3089])
93
358
  * Adds the on_booted event ([#2709])
94
359
 
95
360
  * Bugfixes
@@ -182,6 +447,9 @@
182
447
 
183
448
  * Security
184
449
  * Discards any headers using underscores if the non-underscore version also exists. Without this, an attacker could overwrite values set by intermediate proxies (e.g. X-Forwarded-For). ([CVE-2024-45614](https://github.com/puma/puma/security/advisories/GHSA-9hf4-67fc-4vf4)/GHSA-9hf4-67fc-4vf4)
450
+ * JRuby
451
+ * Must use at least Java >= 9 to compile. You can no longer build from source on Java 8.
452
+
185
453
 
186
454
  ## 5.6.8 / 2024-01-08
187
455
 
@@ -681,7 +949,7 @@ Each patchlevel release contains a separate security fix. We recommend simply up
681
949
  * Fix Java 8 support ([#1773])
682
950
  * Fix error `uninitialized constant Puma::Cluster` ([#1731])
683
951
  * Fix `not_token` being able to be set to true ([#1803])
684
- * Fix "Hang on SIGTERM with ruby 2.6 in clustered mode" (PR [#1741], [#1674], [#1720], [#1730], [#1755])
952
+ * Fix "Hang on SIGTERM with ruby 2.6 in cluster mode" (PR [#1741], [#1674], [#1720], [#1730], [#1755])
685
953
 
686
954
  ## 3.12.1 / 2019-03-19
687
955
 
@@ -1092,7 +1360,7 @@ Each patchlevel release contains a separate security fix. We recommend simply up
1092
1360
  * 4 minor features:
1093
1361
 
1094
1362
  * Listen to unix socket with provided backlog if any
1095
- * Improves the clustered stats to report worker stats
1363
+ * Improves the cluster mode stats to report worker stats
1096
1364
  * Pass the env to the lowlevel_error handler. Fixes [#854]
1097
1365
  * Treat path-like hosts as unix sockets. Fixes [#824]
1098
1366
 
@@ -1819,7 +2087,7 @@ The "clearly I don't have enough tests for the config" release.
1819
2087
 
1820
2088
  * 3 doc changes:
1821
2089
  * Add note about on_worker_boot hook
1822
- * Add some documentation for Clustered mode
2090
+ * Add some documentation for Cluster mode
1823
2091
  * Added quotes to /etc/puma.conf
1824
2092
 
1825
2093
  ## 2.0.1 / 2013-04-30
@@ -2073,6 +2341,178 @@ be added back in a future date when a java Puma::MiniSSL is added.
2073
2341
  * Bugfixes
2074
2342
  * Your bugfix goes here <Most recent on the top, like GitHub> (#Github Number)
2075
2343
 
2344
+ [#3944]:https://github.com/puma/puma/pull/3944 "PR by Nate Berkopec, merged 2026-05-26"
2345
+ [#3929]:https://github.com/puma/puma/pull/3929 "PR by Joshua Young, merged 2026-04-26"
2346
+ [#3928]:https://github.com/puma/puma/pull/3928 "PR by Nate Berkopec, merged 2026-04-16"
2347
+ [#3923]:https://github.com/puma/puma/pull/3923 "PR by Joshua Young, merged 2026-04-10"
2348
+ [#3920]:https://github.com/puma/puma/pull/3920 "PR by Petrik de Heus, merged 2026-04-10"
2349
+ [#3912]:https://github.com/puma/puma/pull/3912 "PR by Bengt-Ove Hollaender, merged 2026-03-26"
2350
+ [#3900]:https://github.com/puma/puma/pull/3900 "PR by Nate Berkopec, merged 2026-03-26"
2351
+ [#3894]:https://github.com/puma/puma/pull/3894 "PR by Joshua Young, merged 2026-03-07"
2352
+ [#3893]:https://github.com/puma/puma/pull/3893 "PR by Sasha Stadnyk, merged 2026-03-22"
2353
+ [#3885]:https://github.com/puma/puma/pull/3885 "PR by Joshua Young, merged 2026-02-18"
2354
+ [#3874]:https://github.com/puma/puma/pull/3874 "PR by Hadrien Blanc, merged 2026-01-28"
2355
+ [#3872]:https://github.com/puma/puma/pull/3872 "PR by Nate Berkopec, merged 2026-01-27"
2356
+ [#3853]:https://github.com/puma/puma/pull/3853 "PR by Krzysztof Jablonski, merged 2026-03-09"
2357
+ [#3847]:https://github.com/puma/puma/pull/3847 "PR by Richard Schneeman, merged 2026-03-26"
2358
+ [#3838]:https://github.com/puma/puma/pull/3838 "PR by Charles Oliver Nutter, merged 2026-01-31"
2359
+ [#3829]:https://github.com/puma/puma/pull/3829 "PR by Nate Berkopec, merged 2026-01-27"
2360
+ [#3816]:https://github.com/puma/puma/pull/3816 "PR by Jean Boussier, merged 2026-03-07"
2361
+ [#3671]:https://github.com/puma/puma/pull/3671 "PR by Joshua Young, merged 2026-03-08"
2362
+ [#3658]:https://github.com/puma/puma/pull/3658 "PR by Yuki Nishijima, merged 2026-02-18"
2363
+ [#3621]:https://github.com/puma/puma/pull/3621 "PR by Joshua Young, merged 2026-02-22"
2364
+ [#3582]:https://github.com/puma/puma/pull/3582 "PR by MSP-Greg, merged 2026-02-22"
2365
+ [#3863]:https://github.com/puma/puma/pull/3863 "PR by Nate Berkopec, merged 2026-01-20"
2366
+ [#3861]:https://github.com/puma/puma/pull/3861 "PR by MSP-Greg, merged 2026-01-20"
2367
+ [#3860]:https://github.com/puma/puma/pull/3860 "PR by MSP-Greg, merged 2026-01-16"
2368
+ [#3859]:https://github.com/puma/puma/pull/3859 "PR by MSP-Greg, merged 2026-01-16"
2369
+ [#3857]:https://github.com/puma/puma/pull/3857 "PR by Aaron Patterson, merged 2026-01-12"
2370
+ [#3856]:https://github.com/puma/puma/pull/3856 "PR by MSP-Greg, merged 2026-01-12"
2371
+ [#3852]:https://github.com/puma/puma/pull/3852 "PR by Miłosz Bieniek, merged 2026-01-14"
2372
+ [#3848]:https://github.com/puma/puma/pull/3848 "PR by Miłosz Bieniek, merged 2025-12-27"
2373
+ [#3845]:https://github.com/puma/puma/pull/3845 "PR by MSP-Greg, merged 2025-12-19"
2374
+ [#3843]:https://github.com/puma/puma/pull/3843 "PR by MSP-Greg, merged 2025-12-18"
2375
+ [#3842]:https://github.com/puma/puma/pull/3842 "PR by MSP-Greg, merged 2025-12-18"
2376
+ [#3841]:https://github.com/puma/puma/pull/3841 "PR by MSP-Greg, merged 2025-12-18"
2377
+ [#3837]:https://github.com/puma/puma/pull/3837 "PR by John Bachir, merged 2026-01-09"
2378
+ [#3833]:https://github.com/puma/puma/pull/3833 "PR by Patrik Ragnarsson, merged 2025-11-25"
2379
+ [#3831]:https://github.com/puma/puma/pull/3831 "PR by Joshua Young, merged 2025-11-25"
2380
+ [#3828]:https://github.com/puma/puma/pull/3828 "PR by Jean Boussier, merged 2025-11-21"
2381
+ [#3827]:https://github.com/puma/puma/pull/3827 "PR by Nate Berkopec, merged 2026-01-20"
2382
+ [#3826]:https://github.com/puma/puma/pull/3826 "PR by Nate Berkopec, merged 2026-01-20"
2383
+ [#3825]:https://github.com/puma/puma/pull/3825 "PR by Jean Boussier, merged 2025-11-19"
2384
+ [#3823]:https://github.com/puma/puma/pull/3823 "PR by Joshua Young, merged 2025-11-18"
2385
+ [#3822]:https://github.com/puma/puma/pull/3822 "PR by Nate Berkopec, merged 2025-11-17"
2386
+ [#3820]:https://github.com/puma/puma/pull/3820 "PR by Nate Berkopec, merged 2025-11-19"
2387
+ [#3817]:https://github.com/puma/puma/pull/3817 "PR by Nate Berkopec, merged 2025-11-17"
2388
+ [#3814]:https://github.com/puma/puma/pull/3814 "PR by Jean Boussier, merged 2025-11-17"
2389
+ [#3813]:https://github.com/puma/puma/pull/3813 "PR by Masafumi Koba, merged 2025-11-17"
2390
+ [#3809]:https://github.com/puma/puma/pull/3809 "PR by Patrik Ragnarsson, merged 2025-10-26"
2391
+ [#3808]:https://github.com/puma/puma/pull/3808 "PR by Nymuxyzo, merged 2025-10-26"
2392
+ [#3807]:https://github.com/puma/puma/pull/3807 "PR by Nate Berkopec, merged 2025-10-28"
2393
+ [#3804]:https://github.com/puma/puma/pull/3804 "PR by Joe Rafaniello, merged 2025-10-21"
2394
+ [#3802]:https://github.com/puma/puma/pull/3802 "PR by Richard Schneeman, merged 2025-10-20"
2395
+ [#3800]:https://github.com/puma/puma/pull/3800 "PR by MSP-Greg, merged 2025-10-19"
2396
+ [#3787]:https://github.com/puma/puma/pull/3787 "PR by Stan Hu, merged 2025-10-17"
2397
+ [#3764]:https://github.com/puma/puma/pull/3764 "PR by MSP-Greg, merged 2025-10-17"
2398
+ [#3690]:https://github.com/puma/puma/pull/3690 "PR by Joshua Young, merged 2025-11-18"
2399
+ [#3602]:https://github.com/puma/puma/pull/3602 "PR by Joshua Young, merged 2025-11-28"
2400
+
2401
+ [#3707]:https://github.com/puma/puma/pull/3707 "PR by @nerdrew, merged 2025-10-02"
2402
+ [#3794]:https://github.com/puma/puma/pull/3794 "PR by @schneems, merged 2025-10-16"
2403
+ [#3795]:https://github.com/puma/puma/pull/3795 "PR by @MSP-Greg, merged 2025-10-16"
2404
+ [#3778]:https://github.com/puma/puma/pull/3778 "PR by @joshuay03, merged 2025-10-16"
2405
+ [#3779]:https://github.com/puma/puma/pull/3779 "PR by @joshuay03, merged 2025-10-16"
2406
+ [#3791]:https://github.com/puma/puma/pull/3791 "PR by @MSP-Greg, merged 2025-10-09"
2407
+ [#3790]:https://github.com/puma/puma/issues/3790 "Issue by @eric-wtfoxtrot, closed 2025-10-09"
2408
+ [#3774]:https://github.com/puma/puma/pull/3774 "PR by @MSP-Greg, merged 2025-10-16"
2409
+ [#3657]:https://github.com/puma/puma/pull/3657 "PR by @marksmith, merged 2025-10-16"
2410
+ [#3703]:https://github.com/puma/puma/pull/3703 "PR by @marshall-lee, merged 2025-09-20"
2411
+ [#3742]:https://github.com/puma/puma/pull/3742 "PR by @kenballus, merged 2025-09-18"
2412
+ [#3754]:https://github.com/puma/puma/pull/3754 "PR by @byroot, merged 2025-09-18"
2413
+ [#3746]:https://github.com/puma/puma/pull/3746 "PR by @schneems, merged 2025-09-18"
2414
+ [#3740]:https://github.com/puma/puma/issues/3740 "Issue by @joshuay03, closed 2025-09-18"
2415
+ [#3748]:https://github.com/puma/puma/pull/3748 "PR by @MSP-Greg, merged 2025-09-14"
2416
+ [#3749]:https://github.com/puma/puma/pull/3749 "PR by @schneems, merged 2025-09-14"
2417
+ [#3736]:https://github.com/puma/puma/pull/3736 "PR by @MSP-Greg, merged 2025-09-08"
2418
+ [#3734]:https://github.com/puma/puma/issues/3734 "Issue by @espen, closed 2025-09-08"
2419
+ [#3729]:https://github.com/puma/puma/pull/3729 "PR by @bensheldon, merged 2025-09-08"
2420
+ [#3731]:https://github.com/puma/puma/pull/3731 "PR by @stanhu, merged 2025-09-06"
2421
+ [#3725]:https://github.com/puma/puma/pull/3725 "PR by @tannakartikey, merged 2025-09-05"
2422
+ [#3719]:https://github.com/puma/puma/pull/3719 "PR by @schneems, merged 2025-09-03"
2423
+ [#3378]:https://github.com/puma/puma/pull/3378 "PR by @shayonj, merged 2025-08-19"
2424
+ [#3377]:https://github.com/puma/puma/pull/3377 "PR by @joshuay03, merged 2025-08-12"
2425
+ [#3711]:https://github.com/puma/puma/pull/3711 "PR by @MSP-Greg, merged 2025-08-28"
2426
+ [#3576]:https://github.com/puma/puma/issues/3576 "Issue by @pdalberti, closed 2025-08-28"
2427
+ [#3701]:https://github.com/puma/puma/pull/3701 "PR by @MSP-Greg, merged 2025-08-26"
2428
+ [#3297]:https://github.com/puma/puma/pull/3297 "PR by @joshuay03, merged 2025-08-26"
2429
+ [#3704]:https://github.com/puma/puma/pull/3704 "PR by @schneems, merged 2025-08-25"
2430
+ [#3698]:https://github.com/puma/puma/pull/3698 "PR by @schneems, merged 2025-08-21"
2431
+ [#3438]:https://github.com/puma/puma/pull/3438 "PR by @tannakartikey, merged 2025-08-25"
2432
+ [#3678]:https://github.com/puma/puma/pull/3678 "PR by @MSP-Greg, merged 2025-07-31"
2433
+ [#3101]:https://github.com/puma/puma/pull/3101 "PR by @ioquatix, merged 2025-08-25"
2434
+ [#3681]:https://github.com/puma/puma/pull/3681 "PR by @byroot, merged 2025-08-15"
2435
+ [#3140]:https://github.com/puma/puma/pull/3140 "PR by @phyzical, merged 2025-08-12"
2436
+ [#3713]:https://github.com/puma/puma/pull/3713 "PR by @MSP-Greg, merged 2025-08-29"
2437
+ [#3625]:https://github.com/puma/puma/pull/3625 "PR by @bhooshiek-narendiran, closed 2025-08-29"
2438
+ [#3702]:https://github.com/puma/puma/pull/3702 "PR by @marshall-lee, merged 2025-08-25"
2439
+ [#3696]:https://github.com/puma/puma/pull/3696 "PR by @joshuay03, merged 2025-08-22"
2440
+ [#3695]:https://github.com/puma/puma/issues/3695 "Issue by @joshuay03, closed 2025-08-22"
2441
+ [#3684]:https://github.com/puma/puma/pull/3684 "PR by @MSP-Greg, merged 2025-08-02"
2442
+ [#3721]:https://github.com/puma/puma/pull/3721 "PR by @schneems, merged 2025-09-03"
2443
+ [#3712]:https://github.com/puma/puma/pull/3712 "PR by @joshuay03, merged 2025-08-28"
2444
+ [#3705]:https://github.com/puma/puma/pull/3705 "PR by @schneems, merged 2025-08-25"
2445
+ [#3073]:https://github.com/puma/puma/pull/3073 "PR by @MSP-Greg, merged 2025-08-12"
2446
+ [#3714]:https://github.com/puma/puma/pull/3714 "PR by @MSP-Greg, merged 2025-08-29"
2447
+ [#3710]:https://github.com/puma/puma/pull/3710 "PR by @joshuay03, merged 2025-08-28"
2448
+ [#3709]:https://github.com/puma/puma/pull/3709 "PR by @MSP-Greg, merged 2025-08-28"
2449
+ [#3708]:https://github.com/puma/puma/issues/3708 "Issue by @schneems, closed 2025-08-28"
2450
+ [#3616]:https://github.com/puma/puma/pull/3616 "PR by @joshuay03, merged 2025-08-25"
2451
+ [#3635]:https://github.com/puma/puma/pull/3635 "PR by @LevitatingBusinessMan, merged 2025-05-08"
2452
+ [#3572]:https://github.com/puma/puma/pull/3572 "PR by @barthez, merged 2025-02-06"
2453
+ [#3601]:https://github.com/puma/puma/pull/3601 "PR by @joshuay03, merged 2025-01-31"
2454
+ [#3586]:https://github.com/puma/puma/pull/3586 "PR by @MSP-Greg, merged 2025-02-03"
2455
+ [#3598]:https://github.com/puma/puma/pull/3598 "PR by @joshuay03, merged 2025-01-31"
2456
+ [#3680]:https://github.com/puma/puma/pull/3680 "PR by @byroot, merged 2025-07-31"
2457
+ [#3570]:https://github.com/puma/puma/pull/3570 "PR by @mohamedhafez, merged 2024-12-30"
2458
+ [#3567]:https://github.com/puma/puma/issues/3567 "Issue by @mohamedhafez, closed 2024-12-30"
2459
+ [#3383]:https://github.com/puma/puma/pull/3383 "PR by @joshuay03, merged 2024-11-29"
2460
+ [#3386]:https://github.com/puma/puma/pull/3386 "PR by @Drakula2k, merged 2024-11-27"
2461
+ [#3517]:https://github.com/puma/puma/pull/3517 "PR by @jjb, merged 2024-11-26"
2462
+ [#3375]:https://github.com/puma/puma/pull/3375 "PR by @joshuay03, merged 2024-11-23"
2463
+ [#3348]:https://github.com/puma/puma/pull/3348 "PR by @tomurb, merged 2024-11-23"
2464
+ [#3302]:https://github.com/puma/puma/issues/3302 "Issue by @benburkert, closed 2024-11-23"
2465
+ [#3384]:https://github.com/puma/puma/pull/3384 "PR by @joshuay03, merged 2024-11-23"
2466
+ [#3590]:https://github.com/puma/puma/pull/3590 "PR by @MSP-Greg, merged 2025-01-01"
2467
+ [#3552]:https://github.com/puma/puma/issues/3552 "Issue by @utay, closed 2025-01-01"
2468
+ [#3568]:https://github.com/puma/puma/pull/3568 "PR by @joshuay03, merged 2024-12-11"
2469
+ [#3505]:https://github.com/puma/puma/pull/3505 "PR by @AnthonyClark, merged 2025-01-27"
2470
+ [#3595]:https://github.com/puma/puma/pull/3595 "PR by @nateberkopec, merged 2025-01-07"
2471
+ [#3565]:https://github.com/puma/puma/pull/3565 "PR by @MSP-Greg, merged 2024-11-28"
2472
+ [#3376]:https://github.com/puma/puma/pull/3376 "PR by @joshuay03, merged 2024-11-23"
2473
+ [#3407]:https://github.com/puma/puma/pull/3407 "PR by @JacobEvelyn, merged 2024-11-05"
2474
+ [#3439]:https://github.com/puma/puma/pull/3439 "PR by @codergeek121, merged 2024-11-04"
2475
+ [#3437]:https://github.com/puma/puma/issues/3437 "Issue by @rafaelfranca, closed 2024-11-04"
2476
+ [#3486]:https://github.com/puma/puma/pull/3486 "PR by @mohamedhafez, merged 2024-09-26"
2477
+ [#3422]:https://github.com/puma/puma/issues/3422 "Issue by @mohamedhafez, closed 2024-09-26"
2478
+ [#3496]:https://github.com/puma/puma/pull/3496 "PR by @slizco, merged 2024-09-26"
2479
+ [#3485]:https://github.com/puma/puma/pull/3485 "PR by @MSP-Greg, merged 2024-09-21"
2480
+ [#3359]:https://github.com/puma/puma/pull/3359 "PR by @willayton, merged 2024-04-11"
2481
+ [#3343]:https://github.com/puma/puma/issues/3343 "Issue by @willayton, closed 2024-04-11"
2482
+ [#3309]:https://github.com/puma/puma/pull/3309 "PR by @byroot, merged 2024-01-09"
2483
+ [#3425]:https://github.com/puma/puma/pull/3425 "PR by @mohamedhafez, merged 2024-07-14"
2484
+ [#3424]:https://github.com/puma/puma/issues/3424 "Issue by @mohamedhafez, closed 2024-07-14"
2485
+ [#3411]:https://github.com/puma/puma/pull/3411 "PR by @OuYangJinTing, merged 2024-06-15"
2486
+ [#3380]:https://github.com/puma/puma/pull/3380 "PR by @emilyst, closed 2024-06-15"
2487
+ [#3539]:https://github.com/puma/puma/pull/3539 "PR by @caius, merged 2024-11-20"
2488
+ [#3532]:https://github.com/puma/puma/pull/3532 "PR by @MSP-Greg, merged 2024-10-24"
2489
+ [#3531]:https://github.com/puma/puma/issues/3531 "Issue by @tagliala, closed 2024-10-24"
2490
+ [#3214]:https://github.com/puma/puma/pull/3214 "PR by @MSP-Greg, merged 2024-10-15"
2491
+ [#3468]:https://github.com/puma/puma/pull/3468 "PR by @foca, merged 2024-10-04"
2492
+ [#3508]:https://github.com/puma/puma/pull/3508 "PR by @MayCXC, merged 2024-10-02"
2493
+ [#3360]:https://github.com/puma/puma/pull/3360 "PR by @ioquatix, merged 2024-04-24"
2494
+ [#3338]:https://github.com/puma/puma/pull/3338 "PR by @MSP-Greg, merged 2024-04-11"
2495
+ [#3337]:https://github.com/puma/puma/issues/3337 "Issue by @skliew, closed 2024-04-11"
2496
+ [#3332]:https://github.com/puma/puma/pull/3332 "PR by @evanphx, merged 2024-02-18"
2497
+ [#3308]:https://github.com/puma/puma/pull/3308 "PR by @MSP-Greg, merged 2024-01-31"
2498
+ [#3307]:https://github.com/puma/puma/issues/3307 "Issue by @nateberkopec, closed 2024-01-31"
2499
+ [#3314]:https://github.com/puma/puma/pull/3314 "PR by @stanhu, merged 2024-01-26"
2500
+ [#3313]:https://github.com/puma/puma/issues/3313 "Issue by @stanhu, closed 2024-01-26"
2501
+ [#3518]:https://github.com/puma/puma/pull/3518 "PR by @roque86, merged 2024-11-15"
2502
+ [#3467]:https://github.com/puma/puma/pull/3467 "PR by @MSP-Greg, merged 2024-09-21"
2503
+ [#3341]:https://github.com/puma/puma/pull/3341 "PR by @joshuay03, merged 2024-03-11"
2504
+ [#3548]:https://github.com/puma/puma/pull/3548 "PR by @MSP-Greg, merged 2024-11-21"
2505
+ [#3325]:https://github.com/puma/puma/pull/3325 "PR by @OuYangJinTing, merged 2024-10-22"
2506
+ [#3527]:https://github.com/puma/puma/pull/3527 "PR by @MSP-Greg, merged 2024-10-26"
2507
+ [#3513]:https://github.com/puma/puma/pull/3513 "PR by @jjb, merged 2024-10-11"
2508
+ [#3510]:https://github.com/puma/puma/pull/3510 "PR by @MSP-Greg, merged 2024-10-03"
2509
+ [#3370]:https://github.com/puma/puma/pull/3370 "PR by @MSP-Greg, merged 2024-04-15"
2510
+ [#3340]:https://github.com/puma/puma/pull/3340 "PR by @joshuay03, merged 2024-03-10"
2511
+ [#3318]:https://github.com/puma/puma/pull/3318 "PR by @joshuay03, merged 2024-01-15"
2512
+ [#3514]:https://github.com/puma/puma/pull/3514 "PR by @jjb, merged 2024-10-11"
2513
+ [#3434]:https://github.com/puma/puma/pull/3434 "PR by @olleolleolle, merged 2024-09-19"
2514
+ [#3435]:https://github.com/puma/puma/pull/3435 "PR by @olleolleolle, merged 2024-09-19"
2515
+ [#3495]:https://github.com/puma/puma/pull/3495 "PR by @MSP-Greg, merged 2024-09-19"
2076
2516
  [#3256]:https://github.com/puma/puma/pull/3256 "PR by @MSP-Greg, merged 2023-10-16"
2077
2517
  [#3235]:https://github.com/puma/puma/pull/3235 "PR by @joshuay03, merged 2023-10-03"
2078
2518
  [#3228]:https://github.com/puma/puma/issues/3228 "Issue by @davidalejandroaguilar, closed 2023-10-03"
@@ -2612,16 +3052,16 @@ be added back in a future date when a java Puma::MiniSSL is added.
2612
3052
  [#1022]:https://github.com/puma/puma/issues/1022 "Issue by @AKovtunov, closed 2017-08-16"
2613
3053
  [#958]:https://github.com/puma/puma/issues/958 "Issue by @lalitlogical, closed 2016-04-23"
2614
3054
  [#782]:https://github.com/puma/puma/issues/782 "Issue by @Tonkpils, closed 2016-07-19"
2615
- [#1010]:https://github.com/puma/puma/issues/1010 "Issue by @mneumark, closed 2016-07-19"
3055
+ [#1010]:https://github.com/puma/puma/issues/1010 "Issue by @mirineumark, closed 2016-07-19"
2616
3056
  [#959]:https://github.com/puma/puma/issues/959 "Issue by @mwpastore, closed 2016-04-22"
2617
- [#840]:https://github.com/puma/puma/issues/840 "Issue by @maxkwallace, closed 2016-04-07"
3057
+ [#840]:https://github.com/puma/puma/issues/840 "Issue by @marisawallace, closed 2016-04-07"
2618
3058
  [#1007]:https://github.com/puma/puma/pull/1007 "PR by @willnet, merged 2016-06-24"
2619
3059
  [#1014]:https://github.com/puma/puma/pull/1014 "PR by @szymon-jez, merged 2016-07-11"
2620
3060
  [#1015]:https://github.com/puma/puma/pull/1015 "PR by @bf4, merged 2016-07-19"
2621
3061
  [#1017]:https://github.com/puma/puma/pull/1017 "PR by @jorihardman, merged 2016-07-19"
2622
3062
  [#954]:https://github.com/puma/puma/pull/954 "PR by @jf, merged 2016-04-12"
2623
3063
  [#955]:https://github.com/puma/puma/pull/955 "PR by @jf, merged 2016-04-22"
2624
- [#956]:https://github.com/puma/puma/pull/956 "PR by @maxkwallace, merged 2016-04-12"
3064
+ [#956]:https://github.com/puma/puma/pull/956 "PR by @marisawallace, merged 2016-04-12"
2625
3065
  [#960]:https://github.com/puma/puma/pull/960 "PR by @kmayer, merged 2016-04-15"
2626
3066
  [#969]:https://github.com/puma/puma/pull/969 "PR by @frankwong15, merged 2016-05-10"
2627
3067
  [#970]:https://github.com/puma/puma/pull/970 "PR by @willnet, merged 2016-04-26"
@@ -2682,7 +3122,7 @@ be added back in a future date when a java Puma::MiniSSL is added.
2682
3122
  [#845]:https://github.com/puma/puma/pull/845 "PR by @deepj, merged 2016-01-28"
2683
3123
  [#846]:https://github.com/puma/puma/pull/846 "PR by @sriedel, merged 2016-01-15"
2684
3124
  [#850]:https://github.com/puma/puma/pull/850 "PR by @deepj, merged 2016-01-15"
2685
- [#853]:https://github.com/puma/puma/pull/853 "PR by @Jeffrey6052, merged 2016-01-28"
3125
+ [#853]:https://github.com/puma/puma/pull/853 "PR by @xuqiyong666, merged 2016-01-28"
2686
3126
  [#857]:https://github.com/puma/puma/pull/857 "PR by @osheroff, merged 2016-01-15"
2687
3127
  [#858]:https://github.com/puma/puma/pull/858 "PR by @mlarraz, merged 2016-01-28"
2688
3128
  [#860]:https://github.com/puma/puma/pull/860 "PR by @osheroff, merged 2016-01-15"