Skip to content

Commit 6385bdd

Browse files
JohnVillalovosaaugustin
authored andcommitted
fix: allow 'Content-Length' = "0"
Shelly devices send a 'Content-Length' header with a value of "0". Allow this as this also means there is not a request body. In addition give a bit more detail in the error message. Closes: #1616
1 parent bb78c20 commit 6385bdd

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/websockets/http11.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,12 @@ def parse(
159159
raise NotImplementedError("transfer codings aren't supported")
160160

161161
if "Content-Length" in headers:
162-
raise ValueError("unsupported request body")
162+
content_length = headers["Content-Length"]
163+
if content_length != "0":
164+
raise ValueError(
165+
f"unsupported request body as 'Content-Length' is "
166+
f"non-zero: {content_length}"
167+
)
163168

164169
return cls(path, headers)
165170

tests/test_http11.py

+19-1
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,27 @@ def test_parse_body(self):
8383
next(self.parse())
8484
self.assertEqual(
8585
str(raised.exception),
86-
"unsupported request body",
86+
"unsupported request body as 'Content-Length' is non-zero: 3",
8787
)
8888

89+
def test_parse_body_content_length_zero(self):
90+
# Example from the protocol overview in RFC 6455
91+
self.reader.feed_data(
92+
b"GET /chat HTTP/1.1\r\n"
93+
b"Host: server.example.com\r\n"
94+
b"Upgrade: websocket\r\n"
95+
b"Connection: Upgrade\r\n"
96+
b"Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
97+
b"Origin: http://example.com\r\n"
98+
b"Sec-WebSocket-Protocol: chat, superchat\r\n"
99+
b"Sec-WebSocket-Version: 13\r\n"
100+
b"Content-Length: 0\r\n"
101+
b"\r\n"
102+
)
103+
request = self.assertGeneratorReturns(self.parse())
104+
self.assertEqual(request.path, "/chat")
105+
self.assertEqual(request.headers["Content-Length"], "0")
106+
89107
def test_parse_body_with_transfer_encoding(self):
90108
self.reader.feed_data(b"GET / HTTP/1.1\r\nTransfer-Encoding: compress\r\n\r\n")
91109
with self.assertRaises(NotImplementedError) as raised:

0 commit comments

Comments
 (0)