Skip to content

Commit eb86f67

Browse files
committed
Remove User-Agent/Server from the Sans-I/O layer.
It doesn't make sense to set it at the library level. It should be set by the embedding program. Partially reverts 2a07325.
1 parent cdd30e4 commit eb86f67

File tree

4 files changed

+0
-77
lines changed

4 files changed

+0
-77
lines changed

src/websockets/client.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
parse_subprotocol,
2424
parse_upgrade,
2525
)
26-
from .http import USER_AGENT
2726
from .http11 import Request, Response
2827
from .typing import (
2928
ConnectionOption,
@@ -64,9 +63,6 @@ class ClientConnection(Connection):
6463
logger: logger for this connection;
6564
defaults to ``logging.getLogger("websockets.client")``;
6665
see the :doc:`logging guide <../topics/logging>` for details.
67-
user_agent_header: value of the ``User-Agent`` request header;
68-
defaults to ``"Python/x.y.z websockets/X.Y"``;
69-
:obj:`None` removes the header.
7066
7167
"""
7268

@@ -76,7 +72,6 @@ def __init__(
7672
origin: Optional[Origin] = None,
7773
extensions: Optional[Sequence[ClientExtensionFactory]] = None,
7874
subprotocols: Optional[Sequence[Subprotocol]] = None,
79-
user_agent_header: Optional[str] = USER_AGENT,
8075
state: State = CONNECTING,
8176
max_size: Optional[int] = 2**20,
8277
logger: Optional[LoggerLike] = None,
@@ -91,7 +86,6 @@ def __init__(
9186
self.origin = origin
9287
self.available_extensions = extensions
9388
self.available_subprotocols = subprotocols
94-
self.user_agent_header = user_agent_header
9589
self.key = generate_key()
9690

9791
def connect(self) -> Request: # noqa: F811
@@ -136,9 +130,6 @@ def connect(self) -> Request: # noqa: F811
136130
protocol_header = build_subprotocol(self.available_subprotocols)
137131
headers["Sec-WebSocket-Protocol"] = protocol_header
138132

139-
if self.user_agent_header is not None:
140-
headers["User-Agent"] = self.user_agent_header
141-
142133
return Request(self.wsuri.resource_name, headers)
143134

144135
def process_response(self, response: Response) -> None:

src/websockets/server.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
parse_subprotocol,
2626
parse_upgrade,
2727
)
28-
from .http import USER_AGENT
2928
from .http11 import Request, Response
3029
from .typing import (
3130
ConnectionOption,
@@ -64,9 +63,6 @@ class ServerConnection(Connection):
6463
logger: logger for this connection;
6564
defaults to ``logging.getLogger("websockets.client")``;
6665
see the :doc:`logging guide <../topics/logging>` for details.
67-
server_header: value of the ``Server`` response header;
68-
defaults to ``"Python/x.y.z websockets/X.Y"``;
69-
:obj:`None` removes the header.
7066
7167
"""
7268

@@ -75,7 +71,6 @@ def __init__(
7571
origins: Optional[Sequence[Optional[Origin]]] = None,
7672
extensions: Optional[Sequence[ServerExtensionFactory]] = None,
7773
subprotocols: Optional[Sequence[Subprotocol]] = None,
78-
server_header: Optional[str] = USER_AGENT,
7974
state: State = CONNECTING,
8075
max_size: Optional[int] = 2**20,
8176
logger: Optional[LoggerLike] = None,
@@ -89,7 +84,6 @@ def __init__(
8984
self.origins = origins
9085
self.available_extensions = extensions
9186
self.available_subprotocols = subprotocols
92-
self.server_header = server_header
9387

9488
def accept(self, request: Request) -> Response:
9589
"""
@@ -175,9 +169,6 @@ def accept(self, request: Request) -> Response:
175169
if protocol_header is not None:
176170
headers["Sec-WebSocket-Protocol"] = protocol_header
177171

178-
if self.server_header is not None:
179-
headers["Server"] = self.server_header
180-
181172
self.logger.info("connection open")
182173
return Response(101, "Switching Protocols", headers)
183174

@@ -477,9 +468,6 @@ def reject(
477468
("Content-Type", "text/plain; charset=utf-8"),
478469
]
479470
)
480-
if self.server_header is not None:
481-
headers["Server"] = self.server_header
482-
483471
response = Response(status.value, status.phrase, headers, body)
484472
# When reject() is called from accept(), handshake_exc is already set.
485473
# If a user calls reject(), set handshake_exc to guarantee invariant:

tests/test_client.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from websockets.datastructures import Headers
88
from websockets.exceptions import InvalidHandshake, InvalidHeader
99
from websockets.frames import OP_TEXT, Frame
10-
from websockets.http import USER_AGENT
1110
from websockets.http11 import Request, Response
1211
from websockets.uri import parse_uri
1312
from websockets.utils import accept_key
@@ -38,7 +37,6 @@ def test_send_connect(self):
3837
f"Connection: Upgrade\r\n"
3938
f"Sec-WebSocket-Key: {KEY}\r\n"
4039
f"Sec-WebSocket-Version: 13\r\n"
41-
f"User-Agent: {USER_AGENT}\r\n"
4240
f"\r\n".encode()
4341
],
4442
)
@@ -58,7 +56,6 @@ def test_connect_request(self):
5856
"Connection": "Upgrade",
5957
"Sec-WebSocket-Key": KEY,
6058
"Sec-WebSocket-Version": "13",
61-
"User-Agent": USER_AGENT,
6259
}
6360
),
6461
)
@@ -130,7 +127,6 @@ def test_receive_accept(self):
130127
f"Connection: Upgrade\r\n"
131128
f"Sec-WebSocket-Accept: {ACCEPT}\r\n"
132129
f"Date: {DATE}\r\n"
133-
f"Server: {USER_AGENT}\r\n"
134130
f"\r\n"
135131
).encode(),
136132
)
@@ -148,7 +144,6 @@ def test_receive_reject(self):
148144
(
149145
f"HTTP/1.1 404 Not Found\r\n"
150146
f"Date: {DATE}\r\n"
151-
f"Server: {USER_AGENT}\r\n"
152147
f"Content-Length: 13\r\n"
153148
f"Content-Type: text/plain; charset=utf-8\r\n"
154149
f"Connection: close\r\n"
@@ -173,7 +168,6 @@ def test_accept_response(self):
173168
f"Connection: Upgrade\r\n"
174169
f"Sec-WebSocket-Accept: {ACCEPT}\r\n"
175170
f"Date: {DATE}\r\n"
176-
f"Server: {USER_AGENT}\r\n"
177171
f"\r\n"
178172
).encode(),
179173
)
@@ -188,7 +182,6 @@ def test_accept_response(self):
188182
"Connection": "Upgrade",
189183
"Sec-WebSocket-Accept": ACCEPT,
190184
"Date": DATE,
191-
"Server": USER_AGENT,
192185
}
193186
),
194187
)
@@ -202,7 +195,6 @@ def test_reject_response(self):
202195
(
203196
f"HTTP/1.1 404 Not Found\r\n"
204197
f"Date: {DATE}\r\n"
205-
f"Server: {USER_AGENT}\r\n"
206198
f"Content-Length: 13\r\n"
207199
f"Content-Type: text/plain; charset=utf-8\r\n"
208200
f"Connection: close\r\n"
@@ -218,7 +210,6 @@ def test_reject_response(self):
218210
Headers(
219211
{
220212
"Date": DATE,
221-
"Server": USER_AGENT,
222213
"Content-Length": "13",
223214
"Content-Type": "text/plain; charset=utf-8",
224215
"Connection": "close",
@@ -574,22 +565,6 @@ def test_unsupported_subprotocol(self):
574565
raise client.handshake_exc
575566
self.assertEqual(str(raised.exception), "unsupported subprotocol: otherchat")
576567

577-
def test_no_user_agent_header(self):
578-
client = ClientConnection(
579-
parse_uri("wss://example.com/"),
580-
user_agent_header=None,
581-
)
582-
request = client.connect()
583-
self.assertNotIn("User-Agent", request.headers)
584-
585-
def test_custom_user_agent_header(self):
586-
client = ClientConnection(
587-
parse_uri("wss://example.com/"),
588-
user_agent_header="websockets",
589-
)
590-
request = client.connect()
591-
self.assertEqual(request.headers["User-Agent"], "websockets")
592-
593568

594569
class MiscTests(unittest.TestCase):
595570
def test_bypass_handshake(self):

tests/test_server.py

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
from websockets.datastructures import Headers
88
from websockets.exceptions import InvalidHeader, InvalidOrigin, InvalidUpgrade
99
from websockets.frames import OP_TEXT, Frame
10-
from websockets.http import USER_AGENT
1110
from websockets.http11 import Request, Response
1211
from websockets.server import *
1312

@@ -32,7 +31,6 @@ def test_receive_connect(self):
3231
f"Connection: Upgrade\r\n"
3332
f"Sec-WebSocket-Key: {KEY}\r\n"
3433
f"Sec-WebSocket-Version: 13\r\n"
35-
f"User-Agent: {USER_AGENT}\r\n"
3634
f"\r\n"
3735
).encode(),
3836
)
@@ -51,7 +49,6 @@ def test_connect_request(self):
5149
f"Connection: Upgrade\r\n"
5250
f"Sec-WebSocket-Key: {KEY}\r\n"
5351
f"Sec-WebSocket-Version: 13\r\n"
54-
f"User-Agent: {USER_AGENT}\r\n"
5552
f"\r\n"
5653
).encode(),
5754
)
@@ -66,7 +63,6 @@ def test_connect_request(self):
6663
"Connection": "Upgrade",
6764
"Sec-WebSocket-Key": KEY,
6865
"Sec-WebSocket-Version": "13",
69-
"User-Agent": USER_AGENT,
7066
}
7167
),
7268
)
@@ -83,7 +79,6 @@ def make_request(self):
8379
"Connection": "Upgrade",
8480
"Sec-WebSocket-Key": KEY,
8581
"Sec-WebSocket-Version": "13",
86-
"User-Agent": USER_AGENT,
8782
}
8883
),
8984
)
@@ -102,7 +97,6 @@ def test_send_accept(self):
10297
f"Upgrade: websocket\r\n"
10398
f"Connection: Upgrade\r\n"
10499
f"Sec-WebSocket-Accept: {ACCEPT}\r\n"
105-
f"Server: {USER_AGENT}\r\n"
106100
f"\r\n".encode()
107101
],
108102
)
@@ -123,7 +117,6 @@ def test_send_reject(self):
123117
f"Connection: close\r\n"
124118
f"Content-Length: 13\r\n"
125119
f"Content-Type: text/plain; charset=utf-8\r\n"
126-
f"Server: {USER_AGENT}\r\n"
127120
f"\r\n"
128121
f"Sorry folks.\n".encode(),
129122
b"",
@@ -147,7 +140,6 @@ def test_accept_response(self):
147140
"Upgrade": "websocket",
148141
"Connection": "Upgrade",
149142
"Sec-WebSocket-Accept": ACCEPT,
150-
"Server": USER_AGENT,
151143
}
152144
),
153145
)
@@ -168,7 +160,6 @@ def test_reject_response(self):
168160
"Connection": "close",
169161
"Content-Length": "13",
170162
"Content-Type": "text/plain; charset=utf-8",
171-
"Server": USER_AGENT,
172163
}
173164
),
174165
)
@@ -608,28 +599,6 @@ def test_unsupported_subprotocol(self):
608599
self.assertNotIn("Sec-WebSocket-Protocol", response.headers)
609600
self.assertIsNone(server.subprotocol)
610601

611-
def test_no_server_header(self):
612-
server = ServerConnection(server_header=None)
613-
request = self.make_request()
614-
response = server.accept(request)
615-
self.assertNotIn("Server", response.headers)
616-
617-
def test_custom_server_header(self):
618-
server = ServerConnection(server_header="websockets")
619-
request = self.make_request()
620-
response = server.accept(request)
621-
self.assertEqual(response.headers["Server"], "websockets")
622-
623-
def test_reject_response_no_server_header(self):
624-
server = ServerConnection(server_header=None)
625-
response = server.reject(http.HTTPStatus.OK, "Hello world!\n")
626-
self.assertNotIn("Server", response.headers)
627-
628-
def test_reject_response_custom_server_header(self):
629-
server = ServerConnection(server_header="websockets")
630-
response = server.reject(http.HTTPStatus.OK, "Hello world!\n")
631-
self.assertEqual(response.headers["Server"], "websockets")
632-
633602

634603
class MiscTests(unittest.TestCase):
635604
def test_bypass_handshake(self):

0 commit comments

Comments
 (0)