Add alt-svc header touchup

This commit is contained in:
Adam Hopkins 2022-02-17 12:10:18 +02:00
parent 6e3e5f1662
commit 64d44192cc
No known key found for this signature in database
GPG Key ID: 9F85EE6C807303FB
5 changed files with 37 additions and 24 deletions

View File

@ -333,6 +333,12 @@ class Http(metaclass=TouchUpMeta):
self.response_func = self.head_response_ignored self.response_func = self.head_response_ignored
headers["connection"] = "keep-alive" if self.keep_alive else "close" 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) ret = format_http1_response(status, res.processed_headers)
if data: if data:
ret += data ret += data

View File

@ -1,3 +1,4 @@
from .altsvc import AltSvcCheck # noqa
from .base import BaseScheme from .base import BaseScheme
from .ode import OptionalDispatchEvent # noqa from .ode import OptionalDispatchEvent # noqa

View File

@ -1,5 +1,8 @@
from abc import ABC, abstractmethod 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): class BaseScheme(ABC):
@ -10,11 +13,26 @@ class BaseScheme(ABC):
self.app = app self.app = app
@abstractmethod @abstractmethod
def run(self, method, module_globals) -> None: def visitors(self) -> List[NodeTransformer]:
... ...
def __init_subclass__(cls): def __init_subclass__(cls):
BaseScheme._registry.add(cls) BaseScheme._registry.add(cls)
def __call__(self, method, module_globals): def __call__(self):
return self.run(method, module_globals) 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__]

View File

@ -1,7 +1,5 @@
from ast import Attribute, Await, Dict, Expr, NodeTransformer, parse from ast import Attribute, Await, Expr, NodeTransformer
from inspect import getsource from typing import Any, List
from textwrap import dedent
from typing import Any
from sanic.log import logger from sanic.log import logger
@ -20,18 +18,10 @@ class OptionalDispatchEvent(BaseScheme):
signal.name for signal in app.signal_router.routes signal.name for signal in app.signal_router.routes
] ]
def run(self, method, module_globals): def visitors(self) -> List[NodeTransformer]:
raw_source = getsource(method) return [
src = dedent(raw_source) RemoveDispatch(self._registered_events, self.app.state.verbosity)
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 _sync_events(self): def _sync_events(self):
all_events = set() all_events = set()

View File

@ -21,9 +21,7 @@ class TouchUp:
module = getmodule(target) module = getmodule(target)
module_globals = dict(getmembers(module)) module_globals = dict(getmembers(module))
modified = BaseScheme.build(method, module_globals, app)
for scheme in BaseScheme._registry:
modified = scheme(app)(method, module_globals)
setattr(target, method_name, modified) setattr(target, method_name, modified)
target.__touched__ = True target.__touched__ = True