| 2277 | |
| 2278 | |
| 2279 | class _HandlerDelegate(httputil.HTTPMessageDelegate): |
| 2280 | def __init__( |
| 2281 | self, |
| 2282 | application: Application, |
| 2283 | request: httputil.HTTPServerRequest, |
| 2284 | handler_class: Type[RequestHandler], |
| 2285 | handler_kwargs: Optional[Dict[str, Any]], |
| 2286 | path_args: Optional[List[bytes]], |
| 2287 | path_kwargs: Optional[Dict[str, bytes]], |
| 2288 | ) -> None: |
| 2289 | self.application = application |
| 2290 | self.connection = request.connection |
| 2291 | self.request = request |
| 2292 | self.handler_class = handler_class |
| 2293 | self.handler_kwargs = handler_kwargs or {} |
| 2294 | self.path_args = path_args or [] |
| 2295 | self.path_kwargs = path_kwargs or {} |
| 2296 | self.chunks = [] # type: List[bytes] |
| 2297 | self.stream_request_body = _has_stream_request_body(self.handler_class) |
| 2298 | |
| 2299 | def headers_received( |
| 2300 | self, |
| 2301 | start_line: Union[httputil.RequestStartLine, httputil.ResponseStartLine], |
| 2302 | headers: httputil.HTTPHeaders, |
| 2303 | ) -> Optional[Awaitable[None]]: |
| 2304 | if self.stream_request_body: |
| 2305 | self.request._body_future = Future() |
| 2306 | return self.execute() |
| 2307 | return None |
| 2308 | |
| 2309 | def data_received(self, data: bytes) -> Optional[Awaitable[None]]: |
| 2310 | if self.stream_request_body: |
| 2311 | return self.handler.data_received(data) |
| 2312 | else: |
| 2313 | self.chunks.append(data) |
| 2314 | return None |
| 2315 | |
| 2316 | def finish(self) -> None: |
| 2317 | if self.stream_request_body: |
| 2318 | future_set_result_unless_cancelled(self.request._body_future, None) |
| 2319 | else: |
| 2320 | self.request.body = b"".join(self.chunks) |
| 2321 | self.request._parse_body() |
| 2322 | self.execute() |
| 2323 | |
| 2324 | def on_connection_close(self) -> None: |
| 2325 | if self.stream_request_body: |
| 2326 | self.handler.on_connection_close() |
| 2327 | else: |
| 2328 | self.chunks = None # type: ignore |
| 2329 | |
| 2330 | def execute(self) -> Optional[Awaitable[None]]: |
| 2331 | # If template cache is disabled (usually in the debug mode), |
| 2332 | # re-compile templates and reload static files on every |
| 2333 | # request so you don't need to restart to see changes |
| 2334 | if not self.application.settings.get("compiled_template_cache", True): |
| 2335 | with RequestHandler._template_loader_lock: |
| 2336 | for loader in RequestHandler._template_loaders.values(): |
no outgoing calls
no test coverage detected