chore: prepare release 25.0.2

- Bump version to 25.0.2
- Update copyright year to 2026 in LICENSE and NOTICE
- Add license headers to all Python source files
- Add changelog entry for 25.0.2
This commit is contained in:
Benoit Chesneau 2026-02-06 08:21:18 +01:00
parent 026167acc9
commit 95b7ffeeaa
191 changed files with 801 additions and 3 deletions

View File

@ -1,4 +1,4 @@
2009-2024 (c) Benoît Chesneau <benoitc@gunicorn.org>
2009-2026 (c) Benoît Chesneau <benoitc@gunicorn.org>
2009-2015 (c) Paul J. Davis <paul.joseph.davis@gmail.com>
Permission is hereby granted, free of charge, to any person

2
NOTICE
View File

@ -1,6 +1,6 @@
Gunicorn
2009-2024 (c) Benoît Chesneau <benoitc@gunicorn.org>
2009-2026 (c) Benoît Chesneau <benoitc@gunicorn.org>
2009-2015 (c) Paul J. Davis <paul.joseph.davis@gmail.com>
Gunicorn is released under the MIT license. See the LICENSE

4
benchmarks/run_benchmark.py Executable file → Normal file
View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python3
"""
Benchmark script for gunicorn gthread worker.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Simple WSGI app for benchmarking
def application(environ, start_response):

View File

@ -1,6 +1,33 @@
<span id="news-2026"></span>
# Changelog - 2026
## 25.0.2 - 2026-02-06
### Bug Fixes
- Fix ASGI concurrent request failures through nginx proxy by normalizing
sockaddr tuples to handle both 2-tuple (IPv4) and 4-tuple (IPv6) formats
([PR #3485](https://github.com/benoitc/gunicorn/pull/3485))
- Fix graceful disconnect handling for ASGI worker to properly handle
client disconnects without raising exceptions
([PR #3485](https://github.com/benoitc/gunicorn/pull/3485))
- Fix lazy import of dirty module for gevent compatibility - prevents
import errors when concurrent.futures is imported before gevent monkey-patching
([PR #3483](https://github.com/benoitc/gunicorn/pull/3483))
### Changes
- Refactor: Extract `_normalize_sockaddr` utility function for consistent
socket address handling across workers
- Add license headers to all Python source files
- Update copyright year to 2026 in LICENSE and NOTICE files
---
## 25.0.1 - 2026-02-02
### Bug Fixes

View File

@ -1,6 +1,33 @@
<span id="news"></span>
# Changelog
## 25.0.2 - 2026-02-06
### Bug Fixes
- Fix ASGI concurrent request failures through nginx proxy by normalizing
sockaddr tuples to handle both 2-tuple (IPv4) and 4-tuple (IPv6) formats
([PR #3485](https://github.com/benoitc/gunicorn/pull/3485))
- Fix graceful disconnect handling for ASGI worker to properly handle
client disconnects without raising exceptions
([PR #3485](https://github.com/benoitc/gunicorn/pull/3485))
- Fix lazy import of dirty module for gevent compatibility - prevents
import errors when concurrent.futures is imported before gevent monkey-patching
([PR #3483](https://github.com/benoitc/gunicorn/pull/3483))
### Changes
- Refactor: Extract `_normalize_sockaddr` utility function for consistent
socket address handling across workers
- Add license headers to all Python source files
- Update copyright year to 2026 in LICENSE and NOTICE files
---
## 25.0.1 - 2026-02-02
### Bug Fixes

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from importlib import import_module
def define_env(env):

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#
# An example of how to pass information from the command line to
# a WSGI app. Only applies to the native WSGI workers used by

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import tempfile
files = []
def app(environ, start_response):

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
raise RuntimeError("Bad app!")
def app(environ, start_response):

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Web Application - FastAPI app demonstrating Celery replacement.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Gunicorn Configuration - Celery Replacement Example

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Task Workers - Celery Replacement using Gunicorn Dirty Arbiters

View File

@ -1 +1,5 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Tests package

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Pytest configuration for Celery Replacement tests.
"""

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Integration Tests for Celery Replacement Example

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Unit Tests for Task Workers

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Example Dirty Application - Simulates ML Model Loading and Inference

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Gunicorn configuration for Dirty Workers Example

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
"""
Test script to demonstrate Dirty App functionality directly.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
"""
Test script to demonstrate the Dirty Protocol layer.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
"""
Integration test demonstrating DirtyWorker execution.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Example WSGI Application that uses Dirty Workers

View File

@ -1 +1,5 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Embedding service package

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.dirty.app import DirtyApp

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
bind = "0.0.0.0:8000"
workers = 2
worker_class = "asgi"

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from fastapi import FastAPI
from pydantic import BaseModel
from gunicorn.dirty.client import get_dirty_client

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import os
import requests
import numpy as np

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Sample Gunicorn configuration file.
#

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import cherrypy

4
examples/frameworks/django/testing/manage.py Executable file → Normal file
View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
import os, sys

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from multiprocessing import Process, Queue
import requests

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
This file demonstrates two different styles of tests (one doctest and one
unittest). These will both pass when you run "manage.py test".

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from django.conf.urls import url
from . import views

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import csv
import io
import os

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Django settings for testing project.
DEBUG = True

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from django.conf.urls import include, url
# Uncomment the next two lines to enable the admin:

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
WSGI config for testing project.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import io
from flask import Flask, send_file

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Run with:
#
# $ gunicorn flaskapp:app

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Example command to run the example:
#
# $ gunicorn flaskapp_aiohttp_wsgi:aioapp -k aiohttp.worker.GunicornWebWorker

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from pyramid.config import Configurator
from pyramid.response import Response

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Run with
#
# $ gunicorn webpyapp:app

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Gunicorn configuration for HTTP/2 features example
bind = "0.0.0.0:8443"

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
"""
Test script for HTTP/2 features example.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Example WSGI application demonstrating HTTP/2 with gevent worker.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Gunicorn configuration for HTTP/2 with gevent worker.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
"""
Tests for HTTP/2 with gevent example.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import logging
log = logging.getLogger(__name__)

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Use this config file in your script like this:

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
#
# An example of a standalone application using the internal API of Gunicorn.

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
# Streaming Chat Example
# Demonstrates dirty worker streaming with simulated LLM token generation

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import time
import random
from gunicorn.dirty.app import DirtyApp

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
bind = "0.0.0.0:8000"
workers = 2
worker_class = "asgi"

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import json
from fastapi import FastAPI
from fastapi.responses import StreamingResponse, HTMLResponse

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Integration tests for the streaming chat example."""
import json

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import collections
import errno
import re

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import signal
import commands
import threading

View File

@ -2,7 +2,7 @@
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
version_info = (25, 0, 1)
version_info = (25, 0, 2)
__version__ = ".".join([str(v) for v in version_info])
SERVER = "gunicorn"
SERVER_SOFTWARE = "%s/%s" % (SERVER, __version__)

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Generate the Markdown settings reference for MkDocs."""
from __future__ import annotations

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
#!/usr/bin/env python
# Usage: git log --format="%an <%ae>" | python update_thanks.py
# You will get a result.txt file, you can work with the file (update, remove, ...)

View File

@ -0,0 +1,4 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
bind = "unix:/tmp/bar/baz"
workers = 3
proc_name = "fooey"

View File

@ -1 +1,5 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
proc_name = "not-fooey"

View File

@ -1 +1,5 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
wsgi_app = "app1:app1"

View File

@ -1 +1,5 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Docker-based integration tests package."""

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Simple ASGI test application for HTTP protocol testing."""

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Pytest fixtures for ASGI compliance Docker integration tests."""
import subprocess

View File

@ -1 +1,5 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""HTTP/2 Docker integration tests package."""

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Test WSGI application for HTTP/2 Docker integration tests."""
import json

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Pytest fixtures for HTTP/2 Docker integration tests."""
import subprocess

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""HTTP/2 Docker integration tests.
These tests verify HTTP/2 functionality with real connections to gunicorn

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""Simple ASGI test application for uWSGI protocol testing."""

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Test WSGI application for uWSGI protocol integration tests.

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
pytest fixtures for uWSGI Docker integration tests.
"""

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
"""
Integration tests for gunicorn's uWSGI binary protocol with nginx.

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import NoMoreData
request = NoMoreData

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidRequestLine
request = InvalidRequestLine

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidRequestLine
request = InvalidRequestLine

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidRequestMethod
request = InvalidRequestMethod

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidRequestMethod
request = InvalidRequestMethod

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidHTTPVersion
request = InvalidHTTPVersion

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidHeaderName
request = InvalidHeaderName

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import LimitRequestLine
request = LimitRequestLine

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import LimitRequestHeaders
request = LimitRequestHeaders

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import LimitRequestHeaders
request = LimitRequestHeaders

View File

@ -1,2 +1,6 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import LimitRequestHeaders
request = LimitRequestHeaders

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.config import Config
from gunicorn.http.errors import LimitRequestHeaders

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.config import Config
from gunicorn.http.errors import LimitRequestHeaders

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.config import Config
from gunicorn.http.errors import LimitRequestHeaders

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.config import Config
from gunicorn.http.errors import LimitRequestHeaders

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidHeader
request = InvalidHeader

View File

@ -1,3 +1,7 @@
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
from gunicorn.http.errors import InvalidHeader
request = InvalidHeader

Some files were not shown because too many files have changed in this diff Show More