Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion cheroot/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -1306,7 +1306,12 @@ def communicate(self): # noqa: C901 # FIXME
"""
request_seen = False
try:
req = self.RequestHandlerClass(self.server, self)
req = self.RequestHandlerClass(
self.server,
self,
proxy_mode=self.server.proxy_mode,
strict_mode=self.server.strict_mode,
)
req.parse_request()
if self.server.stats['Enabled']:
self.requests_seen += 1
Expand Down
54 changes: 53 additions & 1 deletion cheroot/test/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from pypytools.gc.custom import DefaultGc

from .._compat import IS_LINUX, IS_MACOS, IS_WINDOWS, SYS_PLATFORM, bton, ntob
from ..server import IS_UID_GID_RESOLVABLE, Gateway, HTTPServer
from ..server import IS_UID_GID_RESOLVABLE, Gateway, HTTPConnection, HTTPServer
from ..testing import (
ANY_INTERFACE_IPV4,
ANY_INTERFACE_IPV6,
Expand Down Expand Up @@ -127,6 +127,58 @@ def test_stop_interrupts_serve():
assert not serve_thread.is_alive()


def test_communicate_uses_server_proxy_and_strict_mode():
"""Check that parsed requests inherit proxy/strict mode from the server."""
httpserver = HTTPServer(
bind_addr=(ANY_INTERFACE_IPV4, EPHEMERAL_PORT),
gateway=Gateway,
)
request_init_args = []

class CapturingHTTPRequest:
"""Capture request constructor args used during communication."""

def __init__(
self,
server,
conn,
proxy_mode=False,
strict_mode=True,
):
request_init_args.append(
{
'server': server,
'conn': conn,
'proxy_mode': proxy_mode,
'strict_mode': strict_mode,
},
)
self.ready = False

def parse_request(self):
return None

conn = HTTPConnection(
httpserver,
types.SimpleNamespace(),
makefile=lambda _sock, _mode, _bufsize: types.SimpleNamespace(),
)
conn.RequestHandlerClass = CapturingHTTPRequest
httpserver.proxy_mode = True
httpserver.strict_mode = False

assert conn.communicate() is False

assert request_init_args == [
{
'server': httpserver,
'conn': conn,
'proxy_mode': True,
'strict_mode': False,
},
]


@pytest.mark.parametrize(
'exc_cls',
(
Expand Down
1 change: 1 addition & 0 deletions docs/changelog-fragments.d/831.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Preserved server proxy and strict mode settings when parsing requests on accepted connections.
Loading