Repository navigation
chore(deps): update dependency gunicorn to v27 - #119
Merged
Merged
Conversation
renovate
Bot
force-pushed
the
renovate/gunicorn-27.x
branch
from
November 13, 2026 15:36
e7ca473 to
4daacd9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
26.2.0→27.0.0Release Notes
benoitc/gunicorn (gunicorn)
v27.0.0: gunicorn 27.0.0Compare Source
Breaking Changes
Transfer-Encodingdoes not end withchunked, such asgziporidentityalone, with or withoutContent-Length(RFC 9112 §6.3). The WSGI workers used to read such a bodyuntil the connection closed and the ASGI worker treated it as empty. Clients
that send
Transfer-Encoding: identitymust stop sending it.Bug Fixes
Transfer-Encodingvalues (RFC 9110 §5.6.3)(#3364).
Content-Lengththat is not plain digits (RFC 9110 §8.6).(#3371).
414 URI Too Longfor a request line overlimit_request_line(RFC 9112 §3)
(#2487).
Content-Length, and closethe connection when the body is shorter (RFC 9112 §6.3).
response (RFC 9112 §6.3).
(RFC 9110 §5.1, §5.5).
valid reason phrase (RFC 9112 §4).
HEADrequest declares instead of serving it as thenext request (RFC 9112 §6.3).
that never ends; the usual request limits now apply before the line
terminator arrives, and trailers count against
limit_request_fields.forwarded_allow_ipsto HTTP/1 requests as WSGI and HTTP/2already do:
secure_scheme_headersset the scheme only from trustedproxies, and header names with underscores follow
header_map.already does (RFC 9112 §2.2).
instead of serving requests or rebooting the worker forever (ASGI
lifespan spec) (#3778).
keepaliveseconds, asthe other workers do (#3734).
one request stores in
scope["state"]is not seen by the next one (ASGIlifespan spec).
websocket.disconnectas soon as the client closes theconnection, instead of after the close timeout (RFC 6455 §5.5.1).
websocket_max_message_sizesetting (default 16 MiB), and with 1002 for acontrol frame over 125 bytes or fragmented (RFC 6455 §5.5, §7.4.1).
until the app catches up.
body was drained, instead of leaving it until the keepalive timeout
(#3770).
shutdown, and the worker keeps reporting to the arbiter while it waits, so
it is not killed during
max_requestsrestarts.it open with the bytes that followed the body lost.
listen()again on a socket that already listens, such as onepassed by systemd socket activation; SELinux can deny that call.
reuse_porton a platform withoutSO_REUSEPORT, workers now use themaster's sockets instead of failing to bind.
statsd_hostis a numeric IPv6address; they used to be dropped silently.
time. Large uploads are much faster, most of all while other threads keep
the worker busy (#2596).
announces (#2596).
(#3243).
worker_classsetting.timeoutwatches each worker's heartbeat, which idleworkers keep updating.
answers; what follows is never served as another request (RFC 9931 §8).
response header, and leave the header value out of the error.
environ; many copies of one header used to take time growing with the
square of their number.
percent-encoded (RFC 9112 §3.2, RFC 3986 §2.1).
0600, and only use it to stop an orphaned arbiter when this user created
it and the process is ours. A file left there by someone else is ignored.
or pipelined data waits for the application, and resume as it reads; uWSGI
request bodies are read as the application asks for them.
than 1000 PING, SETTINGS or empty DATA frames in 10 seconds, as already done
for RST_STREAM floods.
than 10000 frames pile up while a response waits for window credit.
inside a fragmented one, reserved opcodes, lengths not minimally encoded,
malformed close frames (1002), and text or close reasons that are not UTF-8
(1007) (RFC 6455 §5.2, §5.4, §5.5.1, §7.4, §8.1). An empty client close is
answered with 1000 instead of the reserved 1005.
Sec-WebSocket-Version: 13with 426(and the supported version), and one whose key is not 16 bytes of base64
with 400 (RFC 6455 §4.2.1, §4.2.2).
an HTTP 403 (500 if it raised), as ASGI requires, instead of writing a
WebSocket close frame on a connection that never switched protocols.
as HTTP responses already do, so a slow client cannot grow the worker's
write buffer.
send()after the connection closed raises anOSErrorsubclass, as ASGI 2.4 asks; it is still a
RuntimeError, so existinghandlers keep working, and gunicorn no longer logs it as an error. HTTP
sends after a disconnect stay silently ignored.
timeout, and drop the connection when one fires, so a late chunk is never
read by the next call. A sync stream's idle timeout is no longer replaced
by a fixed 5 seconds.
Expect: 100-continuewith100 Continuewhen the app firstreads the body, so clients such as curl no longer wait about a second before
sending an upload (RFC 9110 §10.1.1).
connection; it used to be dropped without a response, with a traceback
logged for each one (RFC 9112 §3, §5.1).
400 Bad Request, and the error text in the body; the text, which can quote therequest, used to be written into the status line (RFC 9112 §4).
foo, chunked, as the WSGI workers do (RFC 9112 §6.1).1 ;a, as the WSGI workers do (RFC 9112 §7.1.1).bytearrayormemoryviewresponse body when sending it; anapp that reused the buffer after
sendreturned could have the changedbytes sent.
a head or trailer section ended that way kept the connection waiting until a
limit or the timeout (RFC 9112 §2.2).
quoted-string value, such as one with a control character or an unclosed
quote (RFC 9112 §7.1.1).
limit_request_linethat follows an empty line, as the Python parser does(RFC 9112 §2.2, §3).
Changes
fastextra. It parses requests faster,reads a chunked body in time proportional to its size, and accepts and
rejects the same requests as gunicorn's Python parsers, whatever way their
bytes are split across reads.
once per connection, a request is built in one pass over its headers, their
text copy is only made when something reads it, and response bodies of 64
KiB or more are sent without being copied. With one worker, small requests
are about a third faster and streamed responses over 50% faster, and large
responses use much less memory under load.
Full changelog: https://github.com/benoitc/gunicorn/blob/master/docs/content/news.md
Configuration
📅 Schedule: (in timezone Europe/London)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.