2121import types
2222import urllib
2323from http import HTTPStatus
24+ from inspect import isawaitable
2425from io import BytesIO
2526from typing import (
2627 Any ,
3031 Iterable ,
3132 Iterator ,
3233 List ,
34+ Optional ,
3335 Pattern ,
3436 Tuple ,
3537 Union ,
@@ -79,10 +81,12 @@ def return_json_error(f: failure.Failure, request: SynapseRequest) -> None:
7981 """Sends a JSON error response to clients."""
8082
8183 if f .check (SynapseError ):
82- error_code = f .value .code
83- error_dict = f .value .error_dict ()
84+ # mypy doesn't understand that f.check asserts the type.
85+ exc = f .value # type: SynapseError # type: ignore
86+ error_code = exc .code
87+ error_dict = exc .error_dict ()
8488
85- logger .info ("%s SynapseError: %s - %s" , request , error_code , f . value .msg )
89+ logger .info ("%s SynapseError: %s - %s" , request , error_code , exc .msg )
8690 else :
8791 error_code = 500
8892 error_dict = {"error" : "Internal server error" , "errcode" : Codes .UNKNOWN }
@@ -91,7 +95,7 @@ def return_json_error(f: failure.Failure, request: SynapseRequest) -> None:
9195 "Failed handle request via %r: %r" ,
9296 request .request_metrics .name ,
9397 request ,
94- exc_info = (f .type , f .value , f .getTracebackObject ()),
98+ exc_info = (f .type , f .value , f .getTracebackObject ()), # type: ignore
9599 )
96100
97101 # Only respond with an error response if we haven't already started writing,
@@ -128,7 +132,8 @@ def return_html_error(
128132 `{msg}` placeholders), or a jinja2 template
129133 """
130134 if f .check (CodeMessageException ):
131- cme = f .value
135+ # mypy doesn't understand that f.check asserts the type.
136+ cme = f .value # type: CodeMessageException # type: ignore
132137 code = cme .code
133138 msg = cme .msg
134139
@@ -142,7 +147,7 @@ def return_html_error(
142147 logger .error (
143148 "Failed handle request %r" ,
144149 request ,
145- exc_info = (f .type , f .value , f .getTracebackObject ()),
150+ exc_info = (f .type , f .value , f .getTracebackObject ()), # type: ignore
146151 )
147152 else :
148153 code = HTTPStatus .INTERNAL_SERVER_ERROR
@@ -151,7 +156,7 @@ def return_html_error(
151156 logger .error (
152157 "Failed handle request %r" ,
153158 request ,
154- exc_info = (f .type , f .value , f .getTracebackObject ()),
159+ exc_info = (f .type , f .value , f .getTracebackObject ()), # type: ignore
155160 )
156161
157162 if isinstance (error_template , str ):
@@ -278,7 +283,7 @@ async def _async_render(self, request: Request):
278283 raw_callback_return = method_handler (request )
279284
280285 # Is it synchronous? We'll allow this for now.
281- if isinstance (raw_callback_return , ( defer . Deferred , types . CoroutineType ) ):
286+ if isawaitable (raw_callback_return ):
282287 callback_return = await raw_callback_return
283288 else :
284289 callback_return = raw_callback_return # type: ignore
@@ -399,8 +404,10 @@ def _get_handler_for_request(
399404 A tuple of the callback to use, the name of the servlet, and the
400405 key word arguments to pass to the callback
401406 """
407+ # At this point the path must be bytes.
408+ request_path_bytes = request .path # type: bytes # type: ignore
409+ request_path = request_path_bytes .decode ("ascii" )
402410 # Treat HEAD requests as GET requests.
403- request_path = request .path .decode ("ascii" )
404411 request_method = request .method
405412 if request_method == b"HEAD" :
406413 request_method = b"GET"
@@ -551,7 +558,7 @@ def __init__(
551558 request : Request ,
552559 iterator : Iterator [bytes ],
553560 ):
554- self ._request = request
561+ self ._request = request # type: Optional[Request]
555562 self ._iterator = iterator
556563 self ._paused = False
557564
@@ -563,7 +570,7 @@ def _send_data(self, data: List[bytes]) -> None:
563570 """
564571 Send a list of bytes as a chunk of a response.
565572 """
566- if not data :
573+ if not data or not self . _request :
567574 return
568575 self ._request .write (b"" .join (data ))
569576
0 commit comments