Skip to content

Commit c56b070

Browse files
authored
Upgrade locked dependency on Twisted to 24.7.0rc1. (#17502)
I also update the tests and HTTP Proxy code to fix it for this new Twisted release. Pulls in fix for GHSA-c8m8-j448-xjx7 Signed-off-by: Olivier 'reivilibre <[email protected]>
1 parent 574aa53 commit c56b070

File tree

8 files changed

+65
-57
lines changed

8 files changed

+65
-57
lines changed

changelog.d/17502.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Upgrade locked dependency on Twisted to 24.7.0rc1.

poetry.lock

Lines changed: 22 additions & 41 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

synapse/http/proxy.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@
6262
"Upgrade",
6363
}
6464

65+
if hasattr(Headers, "_canonicalNameCaps"):
66+
# Twisted < 24.7.0rc1
67+
_canonicalHeaderName = Headers()._canonicalNameCaps # type: ignore[attr-defined]
68+
else:
69+
# Twisted >= 24.7.0rc1
70+
# But note that `_encodeName` still exists on prior versions,
71+
# it just encodes differently
72+
_canonicalHeaderName = Headers()._encodeName
73+
6574

6675
def parse_connection_header_value(
6776
connection_header_value: Optional[bytes],
@@ -85,11 +94,10 @@ def parse_connection_header_value(
8594
The set of header names that should not be copied over from the remote response.
8695
The keys are capitalized in canonical capitalization.
8796
"""
88-
headers = Headers()
8997
extra_headers_to_remove: Set[str] = set()
9098
if connection_header_value:
9199
extra_headers_to_remove = {
92-
headers._canonicalNameCaps(connection_option.strip()).decode("ascii")
100+
_canonicalHeaderName(connection_option.strip()).decode("ascii")
93101
for connection_option in connection_header_value.split(b",")
94102
}
95103

synapse/http/server.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
from synapse.config.homeserver import HomeServerConfig
7575
from synapse.logging.context import defer_to_thread, preserve_fn, run_in_background
7676
from synapse.logging.opentracing import active_span, start_active_span, trace_servlet
77+
from synapse.types import ISynapseReactor
7778
from synapse.util import json_encoder
7879
from synapse.util.caches import intern_dict
7980
from synapse.util.cancellation import is_function_cancellable
@@ -868,7 +869,8 @@ def encode(opentracing_span: "Optional[opentracing.Span]") -> bytes:
868869

869870
with start_active_span("encode_json_response"):
870871
span = active_span()
871-
json_str = await defer_to_thread(request.reactor, encode, span)
872+
reactor: ISynapseReactor = request.reactor # type: ignore
873+
json_str = await defer_to_thread(reactor, encode, span)
872874

873875
_write_bytes_to_request(request, json_str)
874876

synapse/http/site.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ def request_factory(channel: HTTPChannel, queued: bool) -> Request:
683683
self.access_logger = logging.getLogger(logger_name)
684684
self.server_version_string = server_version_string.encode("ascii")
685685

686-
def log(self, request: SynapseRequest) -> None:
686+
def log(self, request: SynapseRequest) -> None: # type: ignore[override]
687687
pass
688688

689689

tests/rest/client/test_login.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -969,9 +969,8 @@ def test_cas_redirect_confirm(self) -> None:
969969
# Test that the response is HTML.
970970
self.assertEqual(channel.code, 200, channel.result)
971971
content_type_header_value = ""
972-
for header in channel.result.get("headers", []):
973-
if header[0] == b"Content-Type":
974-
content_type_header_value = header[1].decode("utf8")
972+
for header in channel.headers.getRawHeaders("Content-Type", []):
973+
content_type_header_value = header
975974

976975
self.assertTrue(content_type_header_value.startswith("text/html"))
977976

tests/server.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -198,17 +198,35 @@ def code(self) -> int:
198198
def headers(self) -> Headers:
199199
if not self.result:
200200
raise Exception("No result yet.")
201-
h = Headers()
202-
for i in self.result["headers"]:
203-
h.addRawHeader(*i)
201+
202+
h = self.result["headers"]
203+
assert isinstance(h, Headers)
204204
return h
205205

206206
def writeHeaders(
207-
self, version: bytes, code: bytes, reason: bytes, headers: Headers
207+
self,
208+
version: bytes,
209+
code: bytes,
210+
reason: bytes,
211+
headers: Union[Headers, List[Tuple[bytes, bytes]]],
208212
) -> None:
209213
self.result["version"] = version
210214
self.result["code"] = code
211215
self.result["reason"] = reason
216+
217+
if isinstance(headers, list):
218+
# Support prior to Twisted 24.7.0rc1
219+
new_headers = Headers()
220+
for k, v in headers:
221+
assert isinstance(k, bytes), f"key is not of type bytes: {k!r}"
222+
assert isinstance(v, bytes), f"value is not of type bytes: {v!r}"
223+
new_headers.addRawHeader(k, v)
224+
headers = new_headers
225+
226+
assert isinstance(
227+
headers, Headers
228+
), f"headers are of the wrong type: {headers!r}"
229+
212230
self.result["headers"] = headers
213231

214232
def write(self, data: bytes) -> None:

tests/test_server.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,7 @@ async def callback(request: SynapseRequest, **kwargs: object) -> None:
392392
)
393393

394394
self.assertEqual(channel.code, 301)
395-
headers = channel.result["headers"]
396-
location_headers = [v for k, v in headers if k == b"Location"]
395+
location_headers = channel.headers.getRawHeaders(b"Location", [])
397396
self.assertEqual(location_headers, [b"/look/an/eagle"])
398397

399398
def test_redirect_exception_with_cookie(self) -> None:
@@ -415,10 +414,10 @@ async def callback(request: SynapseRequest, **kwargs: object) -> NoReturn:
415414
)
416415

417416
self.assertEqual(channel.code, 304)
418-
headers = channel.result["headers"]
419-
location_headers = [v for k, v in headers if k == b"Location"]
417+
headers = channel.headers
418+
location_headers = headers.getRawHeaders(b"Location", [])
420419
self.assertEqual(location_headers, [b"/no/over/there"])
421-
cookies_headers = [v for k, v in headers if k == b"Set-Cookie"]
420+
cookies_headers = headers.getRawHeaders(b"Set-Cookie", [])
422421
self.assertEqual(cookies_headers, [b"session=yespls"])
423422

424423
def test_head_request(self) -> None:

0 commit comments

Comments
 (0)