import random from spiderweb import ConfigError from spiderweb.exceptions import UnusedMiddleware from spiderweb.middleware import SpiderwebMiddleware from spiderweb.request import Request from spiderweb.response import HttpResponse, RedirectResponse class TestMiddleware(SpiderwebMiddleware): def process_request(self, request: Request) -> None: # example of a middleware that sets a flag on the request request.spiderweb = True def process_response(self, request: Request, response: HttpResponse) -> None: # example of a middleware that sets a header on the resp if hasattr(request, "spiderweb"): response.headers["X-Spiderweb"] = "true" class RedirectMiddleware(SpiderwebMiddleware): def process_request(self, request: Request) -> HttpResponse: if request.path == "/middleware": return RedirectResponse("/") class ExplodingMiddleware(SpiderwebMiddleware): def process_request(self, request: Request) -> HttpResponse | None: raise UnusedMiddleware("Unfinished!") class CaseTransformMiddleware(SpiderwebMiddleware): # this breaks everything, but it's hilarious so it's worth it. # Blame Sam. def post_process( self, request: Request, response: HttpResponse, rendered_response: str ) -> str: valid_options = ["spongebob", "random"] # grab the value from the extra data passed into the server object # during instantiation method = self.server.extra_data.get( "case_transform_middleware_type", "spongebob" ) if method not in valid_options: raise ConfigError( f"Invalid method '{method}' for CaseTransformMiddleware." f" Valid options are {', '.join(valid_options)}" ) if method == "spongebob": response.headers["X-Case-Transform"] = "spongebob" return "".join( char.upper() if i % 2 == 0 else char.lower() for i, char in enumerate(rendered_response) ) else: response.headers["X-Case-Transform"] = "random" return "".join( char.upper() if random.random() > 0.5 else char for char in rendered_response )