From 64d44192cc0615980f4f5307b0631c83db4176e7 Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Thu, 17 Feb 2022 12:10:18 +0200 Subject: [PATCH] Add alt-svc header touchup --- sanic/http/http1.py | 6 ++++++ sanic/touchup/schemes/__init__.py | 1 + sanic/touchup/schemes/base.py | 26 ++++++++++++++++++++++---- sanic/touchup/schemes/ode.py | 22 ++++++---------------- sanic/touchup/service.py | 6 ++---- 5 files changed, 37 insertions(+), 24 deletions(-) diff --git a/sanic/http/http1.py b/sanic/http/http1.py index 96232fb5..111357cb 100644 --- a/sanic/http/http1.py +++ b/sanic/http/http1.py @@ -333,6 +333,12 @@ class Http(metaclass=TouchUpMeta): self.response_func = self.head_response_ignored headers["connection"] = "keep-alive" if self.keep_alive else "close" + + # This header may be removed or modified by the AltSvcCheck Touchup + # service. At server start, we either remove this header from ever + # being assigned, or we change the value as required. + headers["alt-svc"] = "" + ret = format_http1_response(status, res.processed_headers) if data: ret += data diff --git a/sanic/touchup/schemes/__init__.py b/sanic/touchup/schemes/__init__.py index 87057a5f..dd4145ab 100644 --- a/sanic/touchup/schemes/__init__.py +++ b/sanic/touchup/schemes/__init__.py @@ -1,3 +1,4 @@ +from .altsvc import AltSvcCheck # noqa from .base import BaseScheme from .ode import OptionalDispatchEvent # noqa diff --git a/sanic/touchup/schemes/base.py b/sanic/touchup/schemes/base.py index d16619b2..9e32c323 100644 --- a/sanic/touchup/schemes/base.py +++ b/sanic/touchup/schemes/base.py @@ -1,5 +1,8 @@ from abc import ABC, abstractmethod -from typing import Set, Type +from ast import NodeTransformer, parse +from inspect import getsource +from textwrap import dedent +from typing import Any, Dict, List, Set, Type class BaseScheme(ABC): @@ -10,11 +13,26 @@ class BaseScheme(ABC): self.app = app @abstractmethod - def run(self, method, module_globals) -> None: + def visitors(self) -> List[NodeTransformer]: ... def __init_subclass__(cls): BaseScheme._registry.add(cls) - def __call__(self, method, module_globals): - return self.run(method, module_globals) + def __call__(self): + return self.visitors() + + @classmethod + def build(cls, method, module_globals, app): + raw_source = getsource(method) + src = dedent(raw_source) + node = parse(src) + + for scheme in cls._registry: + for visitor in scheme(app)(): + node = visitor.visit(node) + + compiled_src = compile(node, method.__name__, "exec") + exec_locals: Dict[str, Any] = {} + exec(compiled_src, module_globals, exec_locals) # nosec + return exec_locals[method.__name__] diff --git a/sanic/touchup/schemes/ode.py b/sanic/touchup/schemes/ode.py index 7c6ed3d7..c9b78c8b 100644 --- a/sanic/touchup/schemes/ode.py +++ b/sanic/touchup/schemes/ode.py @@ -1,7 +1,5 @@ -from ast import Attribute, Await, Dict, Expr, NodeTransformer, parse -from inspect import getsource -from textwrap import dedent -from typing import Any +from ast import Attribute, Await, Expr, NodeTransformer +from typing import Any, List from sanic.log import logger @@ -20,18 +18,10 @@ class OptionalDispatchEvent(BaseScheme): signal.name for signal in app.signal_router.routes ] - def run(self, method, module_globals): - raw_source = getsource(method) - src = dedent(raw_source) - tree = parse(src) - node = RemoveDispatch( - self._registered_events, self.app.state.verbosity - ).visit(tree) - compiled_src = compile(node, method.__name__, "exec") - exec_locals: Dict[str, Any] = {} - exec(compiled_src, module_globals, exec_locals) # nosec - - return exec_locals[method.__name__] + def visitors(self) -> List[NodeTransformer]: + return [ + RemoveDispatch(self._registered_events, self.app.state.verbosity) + ] def _sync_events(self): all_events = set() diff --git a/sanic/touchup/service.py b/sanic/touchup/service.py index 95792dca..b1b996fb 100644 --- a/sanic/touchup/service.py +++ b/sanic/touchup/service.py @@ -21,10 +21,8 @@ class TouchUp: module = getmodule(target) module_globals = dict(getmembers(module)) - - for scheme in BaseScheme._registry: - modified = scheme(app)(method, module_globals) - setattr(target, method_name, modified) + modified = BaseScheme.build(method, module_globals, app) + setattr(target, method_name, modified) target.__touched__ = True