Skip to content

Commit c5e53b6

Browse files
palkeoKriechi
authored andcommitted
Make the value of the upgrade header the same as the RFC.
As per https://datatracker.ietf.org/doc/html/rfc6455#section-4.2.1 the "Upgrade" header should have the value "websocket", and the server should treat it as case-insensitive. However, sadly some servers don't respect that case-insentitivity, so better to use exactly the string as specified in the RFC. That's what the other websocket implementations do. See for example: https://github.com/python-websockets/websockets/blob/94dd203f63bb52b1a30faa228e63ada2f0f2e874/src/websockets/client.py#L119
1 parent c0a1079 commit c5e53b6

File tree

4 files changed

+30
-30
lines changed

4 files changed

+30
-30
lines changed

src/wsproto/handshake.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def _process_connection_request( # noqa: MC0001
235235
)
236236
if upgrade.lower() != b"websocket":
237237
raise RemoteProtocolError(
238-
"Missing header, 'Upgrade: WebSocket'", event_hint=RejectConnection()
238+
"Missing header, 'Upgrade: websocket'", event_hint=RejectConnection()
239239
)
240240
if host is None:
241241
raise RemoteProtocolError(
@@ -260,7 +260,7 @@ def _accept(self, event: AcceptConnection) -> bytes:
260260
accept_token = generate_accept_token(nonce)
261261

262262
headers = [
263-
(b"Upgrade", b"WebSocket"),
263+
(b"Upgrade", b"websocket"),
264264
(b"Connection", b"Upgrade"),
265265
(b"Sec-WebSocket-Accept", accept_token),
266266
]
@@ -327,7 +327,7 @@ def _initiate_connection(self, request: Request) -> bytes:
327327

328328
headers = [
329329
(b"Host", request.host.encode("idna")),
330-
(b"Upgrade", b"WebSocket"),
330+
(b"Upgrade", b"websocket"),
331331
(b"Connection", b"Upgrade"),
332332
(b"Sec-WebSocket-Key", self._nonce),
333333
(b"Sec-WebSocket-Version", WEBSOCKET_VERSION),
@@ -404,7 +404,7 @@ def _establish_client_connection(
404404
)
405405
if upgrade.lower() != b"websocket":
406406
raise RemoteProtocolError(
407-
"Missing header, 'Upgrade: WebSocket'", event_hint=RejectConnection()
407+
"Missing header, 'Upgrade: websocket'", event_hint=RejectConnection()
408408
)
409409
accept_token = generate_accept_token(self._nonce)
410410
if accept != accept_token:

test/test_client.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def test_connection_request() -> None:
4040
assert headers[b"connection"] == b"Upgrade"
4141
assert headers[b"host"] == b"localhost"
4242
assert headers[b"sec-websocket-version"] == b"13"
43-
assert headers[b"upgrade"] == b"WebSocket"
43+
assert headers[b"upgrade"] == b"websocket"
4444
assert b"sec-websocket-key" in headers
4545

4646

@@ -119,7 +119,7 @@ def test_connection_send_state() -> None:
119119
status_code=101,
120120
headers=[
121121
(b"connection", b"Upgrade"),
122-
(b"upgrade", b"WebSocket"),
122+
(b"upgrade", b"websocket"),
123123
(
124124
b"Sec-WebSocket-Accept",
125125
generate_accept_token(headers[b"sec-websocket-key"]),
@@ -178,14 +178,14 @@ def _make_handshake(
178178

179179
def test_handshake() -> None:
180180
events = _make_handshake(
181-
101, [(b"connection", b"Upgrade"), (b"upgrade", b"WebSocket")]
181+
101, [(b"connection", b"Upgrade"), (b"upgrade", b"websocket")]
182182
)
183183
assert events == [AcceptConnection()]
184184

185185

186186
def test_broken_handshake() -> None:
187187
events = _make_handshake(
188-
102, [(b"connection", b"Upgrade"), (b"upgrade", b"WebSocket")]
188+
102, [(b"connection", b"Upgrade"), (b"upgrade", b"websocket")]
189189
)
190190
assert isinstance(events[0], RejectConnection)
191191
assert events[0].status_code == 102
@@ -194,30 +194,30 @@ def test_broken_handshake() -> None:
194194
def test_handshake_extra_accept_headers() -> None:
195195
events = _make_handshake(
196196
101,
197-
[(b"connection", b"Upgrade"), (b"upgrade", b"WebSocket"), (b"X-Foo", b"bar")],
197+
[(b"connection", b"Upgrade"), (b"upgrade", b"websocket"), (b"X-Foo", b"bar")],
198198
)
199199
assert events == [AcceptConnection(extra_headers=[(b"x-foo", b"bar")])]
200200

201201

202202
@pytest.mark.parametrize("extra_headers", [[], [(b"connection", b"Keep-Alive")]])
203203
def test_handshake_response_broken_connection_header(extra_headers: Headers) -> None:
204204
with pytest.raises(RemoteProtocolError) as excinfo:
205-
_make_handshake(101, [(b"upgrade", b"WebSocket")] + extra_headers)
205+
_make_handshake(101, [(b"upgrade", b"websocket")] + extra_headers)
206206
assert str(excinfo.value) == "Missing header, 'Connection: Upgrade'"
207207

208208

209209
@pytest.mark.parametrize("extra_headers", [[], [(b"upgrade", b"h2")]])
210210
def test_handshake_response_broken_upgrade_header(extra_headers: Headers) -> None:
211211
with pytest.raises(RemoteProtocolError) as excinfo:
212212
_make_handshake(101, [(b"connection", b"Upgrade")] + extra_headers)
213-
assert str(excinfo.value) == "Missing header, 'Upgrade: WebSocket'"
213+
assert str(excinfo.value) == "Missing header, 'Upgrade: websocket'"
214214

215215

216216
def test_handshake_response_missing_websocket_key_header() -> None:
217217
with pytest.raises(RemoteProtocolError) as excinfo:
218218
_make_handshake(
219219
101,
220-
[(b"connection", b"Upgrade"), (b"upgrade", b"WebSocket")],
220+
[(b"connection", b"Upgrade"), (b"upgrade", b"websocket")],
221221
auto_accept_key=False,
222222
)
223223
assert str(excinfo.value) == "Bad accept token"
@@ -228,7 +228,7 @@ def test_handshake_with_subprotocol() -> None:
228228
101,
229229
[
230230
(b"connection", b"Upgrade"),
231-
(b"upgrade", b"WebSocket"),
231+
(b"upgrade", b"websocket"),
232232
(b"sec-websocket-protocol", b"one"),
233233
],
234234
subprotocols=["one", "two"],
@@ -242,7 +242,7 @@ def test_handshake_bad_subprotocol() -> None:
242242
101,
243243
[
244244
(b"connection", b"Upgrade"),
245-
(b"upgrade", b"WebSocket"),
245+
(b"upgrade", b"websocket"),
246246
(b"sec-websocket-protocol", b"new"),
247247
],
248248
)
@@ -255,7 +255,7 @@ def test_handshake_with_extension() -> None:
255255
101,
256256
[
257257
(b"connection", b"Upgrade"),
258-
(b"upgrade", b"WebSocket"),
258+
(b"upgrade", b"websocket"),
259259
(b"sec-websocket-extensions", b"fake"),
260260
],
261261
extensions=[extension],
@@ -269,7 +269,7 @@ def test_handshake_bad_extension() -> None:
269269
101,
270270
[
271271
(b"connection", b"Upgrade"),
272-
(b"upgrade", b"WebSocket"),
272+
(b"upgrade", b"websocket"),
273273
(b"sec-websocket-extensions", b"bad, foo"),
274274
],
275275
)

test/test_handshake.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def test_rejected_handshake(http: bytes) -> None:
4040
with pytest.raises(RemoteProtocolError):
4141
server.receive_data(
4242
b"GET / " + http + b"\r\n"
43-
b"Upgrade: WebSocket\r\n"
43+
b"Upgrade: websocket\r\n"
4444
b"Connection: Upgrade\r\n"
4545
b"Sec-WebSocket-Key: VQr8cvwwZ1fEk62PDq8J3A==\r\n"
4646
b"Sec-WebSocket-Version: 13\r\n"

test/test_server.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def test_connection_request() -> None:
3333
[
3434
(b"Host", b"localhost"),
3535
(b"Connection", b"Keep-Alive, Upgrade"),
36-
(b"Upgrade", b"WebSocket"),
36+
(b"Upgrade", b"websocket"),
3737
(b"Sec-WebSocket-Version", b"13"),
3838
(b"Sec-WebSocket-Key", generate_nonce()),
3939
(b"X-Foo", b"bar"),
@@ -50,7 +50,7 @@ def test_connection_request() -> None:
5050
assert b"sec-websocket-protocol" not in headers
5151
assert headers[b"connection"] == b"Keep-Alive, Upgrade"
5252
assert headers[b"sec-websocket-version"] == b"13"
53-
assert headers[b"upgrade"] == b"WebSocket"
53+
assert headers[b"upgrade"] == b"websocket"
5454
assert headers[b"x-foo"] == b"bar"
5555

5656

@@ -60,7 +60,7 @@ def test_connection_request_bad_method() -> None:
6060
[
6161
(b"Host", b"localhost"),
6262
(b"Connection", b"Keep-Alive, Upgrade"),
63-
(b"Upgrade", b"WebSocket"),
63+
(b"Upgrade", b"websocket"),
6464
(b"Sec-WebSocket-Version", b"13"),
6565
(b"Sec-WebSocket-Key", generate_nonce()),
6666
],
@@ -75,7 +75,7 @@ def test_connection_request_bad_connection_header() -> None:
7575
[
7676
(b"Host", b"localhost"),
7777
(b"Connection", b"Keep-Alive, No-Upgrade"),
78-
(b"Upgrade", b"WebSocket"),
78+
(b"Upgrade", b"websocket"),
7979
(b"Sec-WebSocket-Version", b"13"),
8080
(b"Sec-WebSocket-Key", generate_nonce()),
8181
]
@@ -94,7 +94,7 @@ def test_connection_request_bad_upgrade_header() -> None:
9494
(b"Sec-WebSocket-Key", generate_nonce()),
9595
]
9696
)
97-
assert str(excinfo.value) == "Missing header, 'Upgrade: WebSocket'"
97+
assert str(excinfo.value) == "Missing header, 'Upgrade: websocket'"
9898

9999

100100
@pytest.mark.parametrize("version", [b"12", b"not-a-digit"])
@@ -104,7 +104,7 @@ def test_connection_request_bad_version_header(version: bytes) -> None:
104104
[
105105
(b"Host", b"localhost"),
106106
(b"Connection", b"Keep-Alive, Upgrade"),
107-
(b"Upgrade", b"WebSocket"),
107+
(b"Upgrade", b"websocket"),
108108
(b"Sec-WebSocket-Version", version),
109109
(b"Sec-WebSocket-Key", generate_nonce()),
110110
]
@@ -121,7 +121,7 @@ def test_connection_request_key_header() -> None:
121121
[
122122
(b"Host", b"localhost"),
123123
(b"Connection", b"Keep-Alive, Upgrade"),
124-
(b"Upgrade", b"WebSocket"),
124+
(b"Upgrade", b"websocket"),
125125
(b"Sec-WebSocket-Version", b"13"),
126126
]
127127
)
@@ -134,7 +134,7 @@ def test_upgrade_request() -> None:
134134
[
135135
(b"Host", b"localhost"),
136136
(b"Connection", b"Keep-Alive, Upgrade"),
137-
(b"Upgrade", b"WebSocket"),
137+
(b"Upgrade", b"websocket"),
138138
(b"Sec-WebSocket-Version", b"13"),
139139
(b"Sec-WebSocket-Key", generate_nonce()),
140140
(b"X-Foo", b"bar"),
@@ -154,7 +154,7 @@ def test_upgrade_request() -> None:
154154
assert b"sec-websocket-protocol" not in headers
155155
assert headers[b"connection"] == b"Keep-Alive, Upgrade"
156156
assert headers[b"sec-websocket-version"] == b"13"
157-
assert headers[b"upgrade"] == b"WebSocket"
157+
assert headers[b"upgrade"] == b"websocket"
158158
assert headers[b"x-foo"] == b"bar"
159159

160160

@@ -175,7 +175,7 @@ def _make_handshake(
175175
headers=[
176176
(b"Host", b"localhost"),
177177
(b"Connection", b"Keep-Alive, Upgrade"),
178-
(b"Upgrade", b"WebSocket"),
178+
(b"Upgrade", b"websocket"),
179179
(b"Sec-WebSocket-Version", b"13"),
180180
(b"Sec-WebSocket-Key", nonce),
181181
]
@@ -203,7 +203,7 @@ def test_handshake() -> None:
203203
assert sorted(response.headers) == [
204204
(b"connection", b"Upgrade"),
205205
(b"sec-websocket-accept", generate_accept_token(nonce)),
206-
(b"upgrade", b"WebSocket"),
206+
(b"upgrade", b"websocket"),
207207
]
208208

209209

@@ -214,7 +214,7 @@ def test_handshake_extra_headers() -> None:
214214
assert sorted(response.headers) == [
215215
(b"connection", b"Upgrade"),
216216
(b"sec-websocket-accept", generate_accept_token(nonce)),
217-
(b"upgrade", b"WebSocket"),
217+
(b"upgrade", b"websocket"),
218218
(b"x-foo", b"bar"),
219219
]
220220

@@ -298,7 +298,7 @@ def _make_handshake_rejection(
298298
headers=[
299299
(b"Host", b"localhost"),
300300
(b"Connection", b"Keep-Alive, Upgrade"),
301-
(b"Upgrade", b"WebSocket"),
301+
(b"Upgrade", b"websocket"),
302302
(b"Sec-WebSocket-Version", b"13"),
303303
(b"Sec-WebSocket-Key", nonce),
304304
],

0 commit comments

Comments
 (0)