17.0 vanilla

This commit is contained in:
Ernad Husremovic 2025-10-03 18:05:14 +02:00
parent 2e65bf056a
commit df627a6bba
328 changed files with 578149 additions and 759311 deletions

View file

@ -17,6 +17,7 @@ import threading
import time
import unittest
import contextlib
from email.utils import parsedate_to_datetime
from io import BytesIO
from itertools import chain
@ -120,6 +121,11 @@ class BaseWSGIServerNoBind(LoggingBaseWSGIServerMixIn, werkzeug.serving.BaseWSGI
class RequestHandler(werkzeug.serving.WSGIRequestHandler):
def __init__(self, *args, **kwargs):
self._sent_date_header = None
self._sent_server_header = None
super().__init__(*args, **kwargs)
def setup(self):
# timeout to avoid chrome headless preconnect during tests
if config['test_enable'] or config['test_file']:
@ -148,6 +154,33 @@ class RequestHandler(werkzeug.serving.WSGIRequestHandler):
# Do not keep processing requests.
self.close_connection = True
return
if keyword.casefold() == 'date':
if self._sent_date_header is None:
self._sent_date_header = value
elif self._sent_date_header == value:
return # don't send the same header twice
else:
sent_datetime = parsedate_to_datetime(self._sent_date_header)
new_datetime = parsedate_to_datetime(value)
if sent_datetime == new_datetime:
return # don't send the same date twice (differ in format)
if abs((sent_datetime - new_datetime).total_seconds()) <= 1:
return # don't send the same date twice (jitter of 1 second)
_logger.warning(
"sending two different Date response headers: %r vs %r",
self._sent_date_header, value)
if keyword.casefold() == 'server':
if self._sent_server_header is None:
self._sent_server_header = value
elif self._sent_server_header == value:
return # don't send the same header twice
else:
_logger.warning(
"sending two different Server response headers: %r vs %r",
self._sent_server_header, value)
super().send_header(keyword, value)
def end_headers(self, *a, **kw):
@ -944,7 +977,10 @@ class PreforkServer(CommonServer):
if config['http_enable']:
# listen to socket
_logger.info('HTTP service (werkzeug) running on %s:%s', self.interface, self.port)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
family = socket.AF_INET
if ':' in self.interface:
family = socket.AF_INET6
self.socket = socket.socket(family, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.setblocking(0)
self.socket.bind((self.interface, self.port))