GNServer 0.0.0.0.9__py3-none-any.whl → 0.0.0.0.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
GNServer/__init__.py CHANGED
@@ -30,7 +30,7 @@ DEALINGS IN THE SOFTWARE.
30
30
  """
31
31
 
32
32
  from ._app import App
33
- from KeyisBClient.gn import GNRequest, GNResponse, CORSObject
33
+ from KeyisBClient.gn import GNRequest, GNResponse, CORSObject, FileObject, TemplateObject
34
34
 
35
35
 
36
36
 
GNServer/_app.py CHANGED
@@ -158,8 +158,31 @@ def extract_template_vars(filedata: bytes, mime: str) -> List[str]:
158
158
  return list(set(m.group(1) for m in TPL_VAR_RE.finditer(text)))
159
159
 
160
160
 
161
+ import re
162
+ from urllib.parse import urlparse
161
163
 
162
-
164
+ def resolve_cors(origin_url: str, rules: list[str]) -> bool:
165
+ origin = origin_url.rstrip("/")
166
+ parsed = urlparse(origin)
167
+
168
+ for rule in rules:
169
+ rule = rule.rstrip("/")
170
+ if rule.startswith("!"):
171
+ pattern = rule[1:]
172
+ if re.match(pattern, origin):
173
+ return True
174
+ elif "*" in rule:
175
+ r = urlparse(rule.replace("*.", ""))
176
+ if r.scheme and r.scheme != parsed.scheme:
177
+ continue
178
+ regex = "^" + re.escape(rule).replace("\\*", "[^.]+") + "$"
179
+ if re.match(regex, origin):
180
+ return True
181
+ else:
182
+ if origin == rule:
183
+ return True
184
+
185
+ return False
163
186
 
164
187
 
165
188
 
@@ -307,6 +330,14 @@ class App:
307
330
  if r.method != method:
308
331
  continue
309
332
 
333
+ if r.cors is not None:
334
+ if request._origin is None:
335
+ return gn.GNResponse("gn:backend:801", {'error': 'Cors error. Route has cors but request has no origin url.'})
336
+ if not resolve_cors(request._origin, r.cors._allow_origins):
337
+ return gn.GNResponse("gn:backend:802", {'error': 'Cors error: origin'})
338
+ if request.method not in r.cors._allow_methods:
339
+ return gn.GNResponse("gn:backend:803", {'error': 'Cors error: method'})
340
+
310
341
  sig = inspect.signature(r.handler)
311
342
  def _ann(name: str):
312
343
  param = sig.parameters.get(name)
@@ -331,10 +362,18 @@ class App:
331
362
 
332
363
  result = await r.handler(**kw)
333
364
  if isinstance(result, gn.GNResponse):
365
+ if result._cors is not None and result._cors != r.cors:
366
+ if request._origin is None:
367
+ return gn.GNResponse("gn:backend:801", {'error': 'Cors error. Route has cors but request has no origin url.'})
368
+ if not resolve_cors(request._origin, r.cors._allow_origins):
369
+ return gn.GNResponse("gn:backend:802", {'error': 'Cors error: origin'})
370
+ if request.method not in r.cors._allow_methods:
371
+ return gn.GNResponse("gn:backend:803", {'error': 'Cors error: method'})
334
372
  return result
335
- raise TypeError(
336
- f"{r.handler.__name__} returned {type(result)}; GNResponse expected"
337
- )
373
+ else:
374
+ raise TypeError(
375
+ f"{r.handler.__name__} returned {type(result)}; GNResponse expected"
376
+ )
338
377
 
339
378
  if allowed:
340
379
  return gn.GNResponse("gn:backend:405", {'error': 'Method Not Allowed'})
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GNServer
3
- Version: 0.0.0.0.9
3
+ Version: 0.0.0.0.11
4
4
  Summary: GNServer
5
5
  Home-page: https://github.com/KeyisB/libs/tree/main/GNServer
6
6
  Author: KeyisB
@@ -0,0 +1,7 @@
1
+ GNServer/__init__.py,sha256=GLKkKL03phIhxRLpl2X1ibwTw7BvnMMOwKgRD578RaU,1404
2
+ GNServer/_app.py,sha256=RFG32H9HhUe-nxiTu8bxfHi8Zhpw-h2GDbFpbiHnWyM,20189
3
+ gnserver-0.0.0.0.11.dist-info/licenses/LICENSE,sha256=WH_t7dKZyWJ5Ld07eYIkUG4Tv6zZWXtAdsUqYAUesn0,1084
4
+ gnserver-0.0.0.0.11.dist-info/METADATA,sha256=-PSJGgQjF9ru0aEfaN6Q800NrArHzhcXfWpxGw3Z2mM,805
5
+ gnserver-0.0.0.0.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
6
+ gnserver-0.0.0.0.11.dist-info/top_level.txt,sha256=-UOUBuD4u7Qkb1o5PdcwyA3kx8xCH2lwy0tJHi26Wb4,9
7
+ gnserver-0.0.0.0.11.dist-info/RECORD,,
@@ -1,7 +0,0 @@
1
- GNServer/__init__.py,sha256=l9B6gZZ2gTkWvNdla--J15_Bj0BtP8RyPsrMI6amgDo,1376
2
- GNServer/_app.py,sha256=dKgGAFVwDMGOt7i4HGF2TrVz0XSGjE0TV2hRJHfUnxA,18273
3
- gnserver-0.0.0.0.9.dist-info/licenses/LICENSE,sha256=WH_t7dKZyWJ5Ld07eYIkUG4Tv6zZWXtAdsUqYAUesn0,1084
4
- gnserver-0.0.0.0.9.dist-info/METADATA,sha256=Y7bXZtN9rVDJFkIuyoEIWVUWPRVYpVjvvMaVZxnRwds,804
5
- gnserver-0.0.0.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
6
- gnserver-0.0.0.0.9.dist-info/top_level.txt,sha256=-UOUBuD4u7Qkb1o5PdcwyA3kx8xCH2lwy0tJHi26Wb4,9
7
- gnserver-0.0.0.0.9.dist-info/RECORD,,