Build ASGI HTTP scope from HTTP/2 request.
(self, request, sockname, peername)
| 1730 | self.log.exception("Exception in post_request hook") |
| 1731 | |
| 1732 | def _build_http2_scope(self, request, sockname, peername): |
| 1733 | """Build ASGI HTTP scope from HTTP/2 request.""" |
| 1734 | headers = [] |
| 1735 | for name, value in request.headers: |
| 1736 | headers.append(( |
| 1737 | name.lower().encode("latin-1"), |
| 1738 | value.encode("latin-1") |
| 1739 | )) |
| 1740 | |
| 1741 | server = _normalize_sockaddr(sockname) |
| 1742 | client = _normalize_sockaddr(peername) |
| 1743 | |
| 1744 | scope = { |
| 1745 | "type": "http", |
| 1746 | "asgi": {"version": "3.0", "spec_version": "2.4"}, |
| 1747 | "http_version": "2", |
| 1748 | "method": request.method, |
| 1749 | "scheme": request.scheme, |
| 1750 | "path": request.path, |
| 1751 | "raw_path": getattr(request, 'raw_path', None) or (request.path.encode("latin-1") if request.path else b""), |
| 1752 | "query_string": request.query.encode("latin-1") if request.query else b"", |
| 1753 | "root_path": self.cfg.root_path or "", |
| 1754 | "headers": headers, |
| 1755 | "server": server, |
| 1756 | "client": client, |
| 1757 | } |
| 1758 | |
| 1759 | if hasattr(self.worker, 'state'): |
| 1760 | scope["state"] = self.worker.state |
| 1761 | |
| 1762 | # Add HTTP/2 extensions |
| 1763 | extensions = {} |
| 1764 | if hasattr(request, 'priority_weight'): |
| 1765 | extensions["http.response.priority"] = { |
| 1766 | "weight": request.priority_weight, |
| 1767 | "depends_on": request.priority_depends_on, |
| 1768 | } |
| 1769 | # Add trailer support extension for HTTP/2 |
| 1770 | extensions["http.response.trailers"] = {} |
| 1771 | scope["extensions"] = extensions |
| 1772 | |
| 1773 | return scope |
| 1774 | |
| 1775 | def _build_http2_environ(self, request, sockname, peername): |
| 1776 | """Build minimal environ dict for access logging.""" |