@@ -21,13 +21,29 @@ class _Route:
21
21
"""Route definition for different paths, see `adafruit_httpserver.server.Server.route`."""
22
22
23
23
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 )
25
25
26
+ self .parameters_names = [
27
+ name [1 :- 1 ] for name in re .compile (r"/[^<>]*/?" ).split (path ) if name != ""
28
+ ]
26
29
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 )
28
33
)
29
34
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 )
31
47
32
48
def match (self , other : "_Route" ) -> Tuple [bool , List [str ]]:
33
49
"""
@@ -110,7 +126,7 @@ def route_func(request, my_parameter):
110
126
found_route , _route = False , None
111
127
112
128
for _route in self ._routes :
113
- matches , url_parameters_values = _route .match (route )
129
+ matches , parameters_values = _route .match (route )
114
130
115
131
if matches :
116
132
found_route = True
@@ -121,8 +137,10 @@ def route_func(request, my_parameter):
121
137
122
138
handler = self ._handlers [self ._routes .index (_route )]
123
139
140
+ keyword_parameters = dict (zip (_route .parameters_names , parameters_values ))
141
+
124
142
def wrapped_handler (request ):
125
- return handler (request , * url_parameters_values )
143
+ return handler (request , ** keyword_parameters )
126
144
127
145
return wrapped_handler
128
146
0 commit comments