| 617 | self.server.add_middleware(GZipMiddleware, minimum_size=500) |
| 618 | |
| 619 | def setup_backend(self, dash_app: Dash): |
| 620 | # Add consolidated middleware for all Dash functionality |
| 621 | self.server.add_middleware( |
| 622 | DashMiddleware, |
| 623 | dash_app=dash_app, |
| 624 | dash_server=self, |
| 625 | before_request_funcs=self._before_request_funcs, |
| 626 | after_request_func=self._after_request_func, |
| 627 | enable_timing=self._enable_timing, |
| 628 | ) |
| 629 | |
| 630 | # Add timing middleware separately if enabled (needs to modify response headers) |
| 631 | if self._enable_timing: |
| 632 | |
| 633 | @self.server.middleware("http") |
| 634 | async def timing_headers_middleware(request: Request, call_next): |
| 635 | response = await call_next(request) |
| 636 | timing_information = getattr(request.state, "timing_information", None) |
| 637 | if timing_information is not None: |
| 638 | headers = MutableHeaders(response.headers) |
| 639 | for name, info in timing_information.items(): |
| 640 | value = name |
| 641 | if info.get("desc") is not None: |
| 642 | value += f';desc="{info["desc"]}"' |
| 643 | if info.get("dur") is not None: |
| 644 | value += f";dur={info['dur']}" |
| 645 | headers.append("Server-Timing", value) |
| 646 | return response |
| 647 | |
| 648 | async def _run_ws_hooks( |
| 649 | self, hooks, websocket: "WebSocket", *args, default_reason: str = "Rejected" |