13
13
from .processpool import spawn_process
14
14
from .log_colors import Colors
15
15
from .ws import WS
16
+ from .router import Router , MiddlewareRouter , WebSocketRouter
16
17
17
18
# 3rd party imports and exports
18
19
from multiprocess import Process
@@ -32,15 +33,14 @@ def __init__(self, file_object):
32
33
self .dev = self .parser .is_dev ()
33
34
self .processes = self .parser .num_processes ()
34
35
self .workers = self .parser .workers ()
35
- self .routes = []
36
+ self .router = Router ()
37
+ self .middleware_router = MiddlewareRouter ()
38
+ self .web_socket_router = WebSocketRouter ()
36
39
self .headers = []
37
- self .routes = []
38
- self .middlewares = []
39
- self .web_sockets = {}
40
40
self .directories = []
41
41
self .event_handlers = {}
42
42
43
- def add_route (self , route_type , endpoint , handler ):
43
+ def _add_route (self , route_type , endpoint , handler ):
44
44
"""
45
45
[This is base handler for all the decorators]
46
46
@@ -51,133 +51,23 @@ def add_route(self, route_type, endpoint, handler):
51
51
52
52
""" We will add the status code here only
53
53
"""
54
- async def async_inner_handler (* args ):
55
- res = await handler (args )
56
- if type (res ) == "dict" :
57
- if "status_code" not in res :
58
- res ["status_code" ] = "200"
59
- else :
60
- response = {
61
- "status_code" : "200" ,
62
- "body" : res ,
63
- "type" : "text"
64
- }
65
- res = response
66
- return res
67
-
68
- def inner_handler (* args ):
69
- res = handler (args )
70
- if type (res ) == "dict" :
71
- if "status_code" not in res :
72
- res ["status_code" ] = 200
73
- else :
74
- response = {
75
- "status_code" : 200 ,
76
- "body" : res ,
77
- "type" : "text"
78
- }
79
- res = response
80
- return res
81
-
82
- number_of_params = len (signature (handler ).parameters )
83
- if asyncio .iscoroutinefunction (handler ):
84
- self .routes .append (
85
- (
86
- route_type ,
87
- endpoint ,
88
- async_inner_handler ,
89
- True ,
90
- number_of_params ,
91
- )
92
- )
93
- else :
94
- self .routes .append (
95
- (
96
- route_type ,
97
- endpoint ,
98
- inner_handler ,
99
- False ,
100
- number_of_params ,
101
- )
102
- )
103
-
104
- def add_middleware_route (self , route_type , endpoint , handler ):
105
- """
106
- [This is base handler for the middleware decorator]
107
-
108
- :param route_type [str]: [??]
109
- :param endpoint [str]: [endpoint for the route added]
110
- :param handler [function]: [represents the sync or async function passed as a handler for the route]
111
- """
112
-
113
- """ We will add the status code here only
114
- """
115
- number_of_params = len (signature (handler ).parameters )
116
- self .middlewares .append (
117
- (
118
- route_type ,
119
- endpoint ,
120
- handler ,
121
- asyncio .iscoroutinefunction (handler ),
122
- number_of_params ,
123
- )
124
- )
54
+ self .router .add_route (route_type , endpoint , handler )
125
55
126
56
def before_request (self , endpoint ):
127
57
"""
128
58
[The @app.before_request decorator to add a get route]
129
59
130
60
:param endpoint [str]: [endpoint to server the route]
131
61
"""
132
-
133
- # This inner function is basically a wrapper arround the closure(decorator)
134
- # being returned.
135
- # It takes in a handler and converts it in into a closure
136
- # and returns the arguments.
137
- # Arguments are returned as they could be modified by the middlewares.
138
- def inner (handler ):
139
- async def async_inner_handler (* args ):
140
- await handler (args )
141
- return args
142
-
143
- def inner_handler (* args ):
144
- handler (* args )
145
- return args
146
-
147
- if asyncio .iscoroutinefunction (handler ):
148
- self .add_middleware_route ("BEFORE_REQUEST" , endpoint , async_inner_handler )
149
- else :
150
- self .add_middleware_route ("BEFORE_REQUEST" , endpoint , inner_handler )
151
-
152
- return inner
62
+ return self .middleware_router .add_before_request (endpoint )
153
63
154
64
def after_request (self , endpoint ):
155
65
"""
156
66
[The @app.after_request decorator to add a get route]
157
67
158
68
:param endpoint [str]: [endpoint to server the route]
159
69
"""
160
-
161
- # This inner function is basically a wrapper arround the closure(decorator)
162
- # being returned.
163
- # It takes in a handler and converts it in into a closure
164
- # and returns the arguments.
165
- # Arguments are returned as they could be modified by the middlewares.
166
- def inner (handler ):
167
- async def async_inner_handler (* args ):
168
- await handler (args )
169
- return args
170
-
171
- def inner_handler (* args ):
172
- handler (* args )
173
- return args
174
-
175
- if asyncio .iscoroutinefunction (handler ):
176
- self .add_middleware_route ("AFTER_REQUEST" , endpoint , async_inner_handler )
177
- else :
178
- self .add_middleware_route ("AFTER_REQUEST" , endpoint , inner_handler )
179
-
180
- return inner
70
+ return self .middleware_router .add_after_request (endpoint )
181
71
182
72
def add_directory (
183
73
self , route , directory_path , index_file = None , show_files_listing = False
@@ -188,7 +78,7 @@ def add_header(self, key, value):
188
78
self .headers .append ((key , value ))
189
79
190
80
def add_web_socket (self , endpoint , ws ):
191
- self .web_sockets [ endpoint ] = ws
81
+ self .web_socket_router . add_route ( endpoint , ws )
192
82
193
83
def _add_event_handler (self , event_type : str , handler ):
194
84
print (f"Add event { event_type } handler" )
@@ -213,17 +103,16 @@ def start(self, url="127.0.0.1", port=5000):
213
103
if not self .dev :
214
104
workers = self .workers
215
105
socket = SocketHeld (url , port )
216
- print (self .middlewares )
217
106
for _ in range (self .processes ):
218
107
copied_socket = socket .try_clone ()
219
108
p = Process (
220
109
target = spawn_process ,
221
110
args = (
222
111
self .directories ,
223
112
self .headers ,
224
- self .routes ,
225
- self .middlewares ,
226
- self .web_sockets ,
113
+ self .router . get_routes () ,
114
+ self .middleware_router . get_routes () ,
115
+ self .web_socket_router . get_routes () ,
227
116
self .event_handlers ,
228
117
copied_socket ,
229
118
workers ,
@@ -256,7 +145,7 @@ def get(self, endpoint):
256
145
"""
257
146
258
147
def inner (handler ):
259
- self .add_route ("GET" , endpoint , handler )
148
+ self ._add_route ("GET" , endpoint , handler )
260
149
261
150
return inner
262
151
@@ -268,7 +157,7 @@ def post(self, endpoint):
268
157
"""
269
158
270
159
def inner (handler ):
271
- self .add_route ("POST" , endpoint , handler )
160
+ self ._add_route ("POST" , endpoint , handler )
272
161
273
162
return inner
274
163
@@ -280,7 +169,7 @@ def put(self, endpoint):
280
169
"""
281
170
282
171
def inner (handler ):
283
- self .add_route ("PUT" , endpoint , handler )
172
+ self ._add_route ("PUT" , endpoint , handler )
284
173
285
174
return inner
286
175
@@ -292,7 +181,7 @@ def delete(self, endpoint):
292
181
"""
293
182
294
183
def inner (handler ):
295
- self .add_route ("DELETE" , endpoint , handler )
184
+ self ._add_route ("DELETE" , endpoint , handler )
296
185
297
186
return inner
298
187
@@ -304,7 +193,7 @@ def patch(self, endpoint):
304
193
"""
305
194
306
195
def inner (handler ):
307
- self .add_route ("PATCH" , endpoint , handler )
196
+ self ._add_route ("PATCH" , endpoint , handler )
308
197
309
198
return inner
310
199
@@ -316,7 +205,7 @@ def head(self, endpoint):
316
205
"""
317
206
318
207
def inner (handler ):
319
- self .add_route ("HEAD" , endpoint , handler )
208
+ self ._add_route ("HEAD" , endpoint , handler )
320
209
321
210
return inner
322
211
@@ -328,7 +217,7 @@ def options(self, endpoint):
328
217
"""
329
218
330
219
def inner (handler ):
331
- self .add_route ("OPTIONS" , endpoint , handler )
220
+ self ._add_route ("OPTIONS" , endpoint , handler )
332
221
333
222
return inner
334
223
@@ -340,7 +229,7 @@ def connect(self, endpoint):
340
229
"""
341
230
342
231
def inner (handler ):
343
- self .add_route ("CONNECT" , endpoint , handler )
232
+ self ._add_route ("CONNECT" , endpoint , handler )
344
233
345
234
return inner
346
235
@@ -352,6 +241,6 @@ def trace(self, endpoint):
352
241
"""
353
242
354
243
def inner (handler ):
355
- self .add_route ("TRACE" , endpoint , handler )
244
+ self ._add_route ("TRACE" , endpoint , handler )
356
245
357
246
return inner
0 commit comments