@@ -21,13 +21,29 @@ class _Route:
2121 """Route definition for different paths, see `adafruit_httpserver.server.Server.route`."""
2222
2323 def __init__ (self , path : str = "" , method : str = GET ) -> None :
24- contains_parameters = re . search ( r"<\w*>" , path ) is not None
24+ self . _validate_path ( path )
2525
26+ self .parameters_names = [
27+ name [1 :- 1 ] for name in re .compile (r"/[^<>]*/?" ).split (path ) if name != ""
28+ ]
2629 self .path = (
27- path if not contains_parameters else re .sub (r"<\w*>" , r"([^/]*)" , path )
30+ path
31+ if not self ._contains_parameters
32+ else re .sub (r"<\w*>" , r"([^/]*)" , path )
2833 )
2934 self .method = method
30- self ._contains_parameters = contains_parameters
35+
36+ @staticmethod
37+ def _validate_path (path : str ) -> None :
38+ if not path .startswith ("/" ):
39+ raise ValueError ("Path must start with a slash." )
40+
41+ if "<>" in path :
42+ raise ValueError ("All URL parameters must be named." )
43+
44+ @property
45+ def _contains_parameters (self ) -> bool :
46+ return 0 < len (self .parameters_names )
3147
3248 def match (self , other : "_Route" ) -> Tuple [bool , List [str ]]:
3349 """
@@ -110,7 +126,7 @@ def route_func(request, my_parameter):
110126 found_route , _route = False , None
111127
112128 for _route in self ._routes :
113- matches , url_parameters_values = _route .match (route )
129+ matches , parameters_values = _route .match (route )
114130
115131 if matches :
116132 found_route = True
@@ -121,8 +137,10 @@ def route_func(request, my_parameter):
121137
122138 handler = self ._handlers [self ._routes .index (_route )]
123139
140+ keyword_parameters = dict (zip (_route .parameters_names , parameters_values ))
141+
124142 def wrapped_handler (request ):
125- return handler (request , * url_parameters_values )
143+ return handler (request , ** keyword_parameters )
126144
127145 return wrapped_handler
128146
0 commit comments