1616import logging
1717import random
1818import time
19+ from typing import Callable , Dict , Optional , Tuple
1920
2021import attr
2122
2223from twisted .internet import defer
2324from twisted .web .client import RedirectAgent , readBody
2425from twisted .web .http import stringToDatetime
2526from twisted .web .http_headers import Headers
27+ from twisted .web .iweb import IResponse
2628
2729from synapse .logging .context import make_deferred_yieldable
2830from synapse .util import Clock , json_decoder
@@ -99,15 +101,14 @@ def __init__(
99101 self ._well_known_agent = RedirectAgent (agent )
100102 self .user_agent = user_agent
101103
102- @defer .inlineCallbacks
103- def get_well_known (self , server_name ):
104+ async def get_well_known (self , server_name : bytes ) -> WellKnownLookupResult :
104105 """Attempt to fetch and parse a .well-known file for the given server
105106
106107 Args:
107- server_name (bytes) : name of the server, from the requested url
108+ server_name: name of the server, from the requested url
108109
109110 Returns:
110- Deferred[WellKnownLookupResult]: The result of the lookup
111+ The result of the lookup
111112 """
112113 try :
113114 prev_result , expiry , ttl = self ._well_known_cache .get_with_expiry (
@@ -124,7 +125,9 @@ def get_well_known(self, server_name):
124125 # requests for the same server in parallel?
125126 try :
126127 with Measure (self ._clock , "get_well_known" ):
127- result , cache_period = yield self ._fetch_well_known (server_name )
128+ result , cache_period = await self ._fetch_well_known (
129+ server_name
130+ ) # type: Tuple[Optional[bytes], float]
128131
129132 except _FetchWellKnownFailure as e :
130133 if prev_result and e .temporary :
@@ -153,26 +156,25 @@ def get_well_known(self, server_name):
153156
154157 return WellKnownLookupResult (delegated_server = result )
155158
156- @defer .inlineCallbacks
157- def _fetch_well_known (self , server_name ):
159+ async def _fetch_well_known (self , server_name : bytes ) -> Tuple [bytes , float ]:
158160 """Actually fetch and parse a .well-known, without checking the cache
159161
160162 Args:
161- server_name (bytes) : name of the server, from the requested url
163+ server_name: name of the server, from the requested url
162164
163165 Raises:
164166 _FetchWellKnownFailure if we fail to lookup a result
165167
166168 Returns:
167- Deferred[Tuple[bytes,int]]: The lookup result and cache period.
169+ The lookup result and cache period.
168170 """
169171
170172 had_valid_well_known = self ._had_valid_well_known_cache .get (server_name , False )
171173
172174 # We do this in two steps to differentiate between possibly transient
173175 # errors (e.g. can't connect to host, 503 response) and more permenant
174176 # errors (such as getting a 404 response).
175- response , body = yield self ._make_well_known_request (
177+ response , body = await self ._make_well_known_request (
176178 server_name , retry = had_valid_well_known
177179 )
178180
@@ -215,20 +217,20 @@ def _fetch_well_known(self, server_name):
215217
216218 return result , cache_period
217219
218- @defer .inlineCallbacks
219- def _make_well_known_request (self , server_name , retry ):
220+ async def _make_well_known_request (
221+ self , server_name : bytes , retry : bool
222+ ) -> Tuple [IResponse , bytes ]:
220223 """Make the well known request.
221224
222225 This will retry the request if requested and it fails (with unable
223226 to connect or receives a 5xx error).
224227
225228 Args:
226- server_name (bytes)
227- retry (bool) : Whether to retry the request if it fails.
229+ server_name: name of the server, from the requested url
230+ retry: Whether to retry the request if it fails.
228231
229232 Returns:
230- Deferred[tuple[IResponse, bytes]] Returns the response object and
231- body. Response may be a non-200 response.
233+ Returns the response object and body. Response may be a non-200 response.
232234 """
233235 uri = b"https://%s/.well-known/matrix/server" % (server_name ,)
234236 uri_str = uri .decode ("ascii" )
@@ -243,12 +245,12 @@ def _make_well_known_request(self, server_name, retry):
243245
244246 logger .info ("Fetching %s" , uri_str )
245247 try :
246- response = yield make_deferred_yieldable (
248+ response = await make_deferred_yieldable (
247249 self ._well_known_agent .request (
248250 b"GET" , uri , headers = Headers (headers )
249251 )
250252 )
251- body = yield make_deferred_yieldable (readBody (response ))
253+ body = await make_deferred_yieldable (readBody (response ))
252254
253255 if 500 <= response .code < 600 :
254256 raise Exception ("Non-200 response %s" % (response .code ,))
@@ -265,21 +267,24 @@ def _make_well_known_request(self, server_name, retry):
265267 logger .info ("Error fetching %s: %s. Retrying" , uri_str , e )
266268
267269 # Sleep briefly in the hopes that they come back up
268- yield self ._clock .sleep (0.5 )
270+ await self ._clock .sleep (0.5 )
269271
270272
271- def _cache_period_from_headers (headers , time_now = time .time ):
273+ def _cache_period_from_headers (
274+ headers : Headers , time_now : Callable [[], float ] = time .time
275+ ) -> Optional [float ]:
272276 cache_controls = _parse_cache_control (headers )
273277
274278 if b"no-store" in cache_controls :
275279 return 0
276280
277281 if b"max-age" in cache_controls :
278- try :
279- max_age = int (cache_controls [b"max-age" ])
280- return max_age
281- except ValueError :
282- pass
282+ max_age = cache_controls [b"max-age" ]
283+ if max_age :
284+ try :
285+ return int (max_age )
286+ except ValueError :
287+ pass
283288
284289 expires = headers .getRawHeaders (b"expires" )
285290 if expires is not None :
@@ -295,7 +300,7 @@ def _cache_period_from_headers(headers, time_now=time.time):
295300 return None
296301
297302
298- def _parse_cache_control (headers ) :
303+ def _parse_cache_control (headers : Headers ) -> Dict [ bytes , Optional [ bytes ]] :
299304 cache_controls = {}
300305 for hdr in headers .getRawHeaders (b"cache-control" , []):
301306 for directive in hdr .split (b"," ):
0 commit comments