11"""
22CallbackResolver service module
33"""
4+ import codecs
5+ import os
46import re
57from collections import OrderedDict
68
@@ -18,9 +20,10 @@ class Router(TemplateView):
1820 __request = None
1921 __callable = None
2022 __app = dict ()
21- __route = None
22- __uri = None
23- __method = None
23+ __route = str ()
24+ __end_point_uri = str ()
25+ __uri = str ()
26+ __method = str ()
2427 __bound_routes = dict ()
2528 __auth_service = None
2629 __allowed_headers = "Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since," \
@@ -30,7 +33,6 @@ class Router(TemplateView):
3033 def __init__ (self , route , controller ):
3134 self .__route = route
3235 self .__callable = controller
33- self .__app ['router' ] = object ()
3436
3537 @csrf_exempt
3638 def route (self , request : HttpRequest ):
@@ -44,28 +46,33 @@ def route(self, request: HttpRequest):
4446 self .__method = request .method
4547 self .__app ['router' ] = RouteMapping ()
4648 self .__bound_routes = dict ()
49+ self .__app ['log' ].set_signature (codecs .encode (os .urandom (3 ), "hex" ).decode ("utf-8" ).upper ())
4750
4851 routes = self .__callable ().connect (self .__app )
4952
5053 self .__bound_routes = routes ['router' ].get__routes ()
5154
52- end_point = self .get_end_point_uri ()
53- acutal_params = self .get_url_params (end_point )
54-
5555 request_headers = request .META
5656 indent = 2 if re .match ("[Mozilla]{7}" , request_headers ['HTTP_USER_AGENT' ]) else 0
5757
58+ if self .set_end_point_uri () is False :
59+ return self .set_response_headers (self .no_route_found (self .__request ).render (indent ))
60+
61+ acutal_params = self .get_url_params (self .get_end_point_uri ())
62+
5863 try :
5964 response = self .exec_route_callback (acutal_params )
6065 if type (response ) == Response :
6166 return self .set_response_headers (response .render (indent ))
6267 else :
6368 return self .set_response_headers (response )
6469 except AuthException as e :
70+ self .__app ['log' ].warning ("< {0}: 403" .format (str (e )), exc_info = True )
6571 response = Response (OrderedDict ({"status" : False , "message" : str (e )}), content_type = "application/json" ,
6672 status = 403 , charset = "utf-8" )
6773 return self .set_response_headers (response .render (indent ))
6874 except BaseException as e :
75+ self .__app ['log' ].error ("< {0}: 500" .format (str (e )), exc_info = True )
6976 response = Response (OrderedDict ({"status" : False , "message" : str (e )}), content_type = "application/json" ,
7077 status = 500 , charset = "utf-8" )
7178 return self .set_response_headers (response .render (indent ))
@@ -74,7 +81,7 @@ def exec_route_callback(self, actual_params):
7481 """
7582 Executes the resolved end-point callback, or its fallback
7683 :param actual_params dict
77- :rtype: Object
84+ :rtype: object
7885 """
7986 if self .__method .lower () in self .__bound_routes :
8087 for bound in self .__bound_routes [self .__method .lower ()]:
@@ -83,6 +90,7 @@ def exec_route_callback(self, actual_params):
8390 expected_params = self .get_url_params (route )
8491
8592 if self .request_matches_route (self .get_end_point_uri (), route ):
93+ self .__app ['log' ].info ("> {0} {1}" .format (self .__method , self .__uri ))
8694 authenticate = self .authenticate (route , actual_params )
8795 if authenticate :
8896 pattern_params = self .get_callback_pattern (expected_params , actual_params )
@@ -91,6 +99,7 @@ def exec_route_callback(self, actual_params):
9199 return authenticate
92100
93101 if self .__method == "OPTIONS" :
102+ self .__app ['log' ].info ("Route matched: {0} {1}" .format (self .__method , self .__uri ))
94103 return self .default_route_options (self .__request )
95104
96105 if self .__route == '' and self .__uri == '' :
@@ -131,7 +140,8 @@ def authenticate(self, bound_route, actual_params):
131140 auth_route = "{0}_{1}{2}" .format (self .__method , self .__route , bound_route )
132141 auth_data = self .__auth_service .authenticate (self .__request , auth_route , actual_params )
133142 self .__app ['auth_data' ] = auth_data
134- return True
143+
144+ return True
135145
136146 @staticmethod
137147 def get_callback_pattern (expected_params , actual_params ):
@@ -171,12 +181,29 @@ def get_url_params(end_point):
171181 return params
172182
173183 def get_end_point_uri (self ):
184+ """
185+ Returns the value of __end_point_uri
186+ :rtype: str
187+ """
188+ return self .__end_point_uri
189+
190+ def set_end_point_uri (self ):
174191 """
175192 Gets the route from the accessed URL
176193 :rtype: str
177194 """
195+ expected_parts = self .__route .split ("/" )
196+ actual_parts = self .__uri .split ("/" )
197+
198+ i = 0
199+ for part in expected_parts :
200+ if part != actual_parts [i ]:
201+ return False
202+ i = i + 1
203+
178204 uri_prefix = len (self .__route )
179- return self .__uri [uri_prefix :]
205+ self .__end_point_uri = self .__uri [uri_prefix :]
206+ return True
180207
181208 def no_route_found (self , request ):
182209 """
@@ -240,6 +267,10 @@ def set_response_headers(self, response: HttpResponse):
240267 for key in response_headers :
241268 response [key ] = response_headers [key ]
242269
270+ status = response .status_code
271+ if status != 404 :
272+ self .__app ['log' ].info ("< {0}" .format (status ))
273+
243274 return response
244275
245276 def auth_config (self , auth_service : object ):
@@ -250,3 +281,12 @@ def auth_config(self, auth_service: object):
250281 """
251282 self .__auth_service = auth_service
252283 return self
284+
285+ def register (self , name : str (), handler : object (), force = False ):
286+ if name in self .__app :
287+ if force is True :
288+ self .__app [name ] = handler
289+ else :
290+ self .__app [name ] = handler
291+
292+ return self
0 commit comments