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
4 changes: 1 addition & 3 deletions daphne/http_protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,7 @@ def process(self):
return
for value in values:
if INVALID_HEADER_VALUE_BYTES.intersection(value):
self.basic_error(
400, b"Bad Request", "Invalid header value"
)
self.basic_error(400, b"Bad Request", "Invalid header value")
return

# Get upgrade header
Expand Down
22 changes: 11 additions & 11 deletions daphne/management/commands/runserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,27 +178,27 @@ def log_action(self, protocol, action, details):
# Utilize terminal colors, if available
if 200 <= details["status"] < 300:
# Put 2XX first, since it should be the common case
logger.info(self.style.HTTP_SUCCESS(msg), details)
logger.info(self.style.HTTP_SUCCESS(msg) % details)
elif 100 <= details["status"] < 200:
logger.info(self.style.HTTP_INFO(msg), details)
logger.info(self.style.HTTP_INFO(msg) % details)
elif details["status"] == 304:
logger.info(self.style.HTTP_NOT_MODIFIED(msg), details)
logger.info(self.style.HTTP_NOT_MODIFIED(msg) % details)
elif 300 <= details["status"] < 400:
logger.info(self.style.HTTP_REDIRECT(msg), details)
logger.info(self.style.HTTP_REDIRECT(msg) % details)
elif details["status"] == 404:
logger.warning(self.style.HTTP_NOT_FOUND(msg), details)
logger.warning(self.style.HTTP_NOT_FOUND(msg) % details)
elif 400 <= details["status"] < 500:
logger.warning(self.style.HTTP_BAD_REQUEST(msg), details)
logger.warning(self.style.HTTP_BAD_REQUEST(msg) % details)
else:
# Any 5XX, or any other response
logger.error(self.style.HTTP_SERVER_ERROR(msg), details)
logger.error(self.style.HTTP_SERVER_ERROR(msg) % details)

# Websocket requests
elif protocol == "websocket" and action == "connected":
logger.info("WebSocket CONNECT %(path)s [%(client)s]", details)
logger.info("WebSocket CONNECT %(path)s [%(client)s]" % details)
elif protocol == "websocket" and action == "disconnected":
logger.info("WebSocket DISCONNECT %(path)s [%(client)s]", details)
logger.info("WebSocket DISCONNECT %(path)s [%(client)s]" % details)
elif protocol == "websocket" and action == "connecting":
logger.info("WebSocket HANDSHAKING %(path)s [%(client)s]", details)
logger.info("WebSocket HANDSHAKING %(path)s [%(client)s]" % details)
elif protocol == "websocket" and action == "rejected":
logger.info("WebSocket REJECT %(path)s [%(client)s]", details)
logger.info("WebSocket REJECT %(path)s [%(client)s]" % details)
26 changes: 26 additions & 0 deletions tests/test_runserver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from unittest import TestCase
from unittest.mock import patch

from daphne.management.commands.runserver import Command


class TestRunserverCommand(TestCase):
def test_log_action_formats_http_details_before_logging(self):
command = Command()
details = {
"method": "GET",
"path": "/example/",
"status": 200,
"time_taken": 0.01,
"client": "127.0.0.1:8000",
"size": 0,
}

with patch("daphne.management.commands.runserver.logger.info") as mock_info:
command.log_action("http", "complete", details)

mock_info.assert_called_once()
args, kwargs = mock_info.call_args
self.assertEqual(len(args), 1)
self.assertEqual(kwargs, {})
self.assertIn("HTTP GET /example/ 200 [0.01, 127.0.0.1:8000]", args[0])
8 changes: 2 additions & 6 deletions tests/test_websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,9 +330,7 @@ def test_websocket_max_message_size_allows_under_limit(self):
sock, _ = self.websocket_handshake(test_app)
_, messages = test_app.get_received()
self.assert_valid_websocket_connect_message(messages[0])
test_app.add_send_messages(
[{"type": "websocket.send", "text": "ack"}]
)
test_app.add_send_messages([{"type": "websocket.send", "text": "ack"}])
self.websocket_send_frame(sock, "x" * 16)
assert self.websocket_receive_frame(sock) == "ack"

Expand Down Expand Up @@ -418,9 +416,7 @@ def test_websocket_upgrade_rejects_smuggled_headers(self):
for byte in self.INVALID_BYTES:
with self.subTest(byte=byte):
value = b"innocent" + byte + b"X-Secret-Auth: admin-token"
response = self.run_daphne_raw(
self._websocket_upgrade_request(value)
)
response = self.run_daphne_raw(self._websocket_upgrade_request(value))
self.assertTrue(
response.startswith(b"HTTP/1.1 400"),
f"expected 400 for byte {byte!r}, got {response[:80]!r}",
Expand Down