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,11 +33,10 @@ 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
@@ -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 ,
0 commit comments