GNServer 0.0.0.0.37__py3-none-any.whl → 0.0.0.0.38__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/_client.py +77 -11
- {gnserver-0.0.0.0.37.dist-info → gnserver-0.0.0.0.38.dist-info}/METADATA +1 -1
- {gnserver-0.0.0.0.37.dist-info → gnserver-0.0.0.0.38.dist-info}/RECORD +6 -6
- {gnserver-0.0.0.0.37.dist-info → gnserver-0.0.0.0.38.dist-info}/WHEEL +0 -0
- {gnserver-0.0.0.0.37.dist-info → gnserver-0.0.0.0.38.dist-info}/licenses/LICENSE +0 -0
- {gnserver-0.0.0.0.37.dist-info → gnserver-0.0.0.0.38.dist-info}/top_level.txt +0 -0
GNServer/_client.py
CHANGED
@@ -80,12 +80,53 @@ from KeyisBTools.cryptography.sign import s2
|
|
80
80
|
from KeyisBTools.cryptography import m1
|
81
81
|
from KeyisBTools.cryptography.bytes import hash, userFriendly
|
82
82
|
from KeyisBTools.models.serialization import serialize
|
83
|
+
from KeyisBTools.ranges.positionRange import in_range
|
83
84
|
from gnobjects.net.objects import GNRequest, GNResponse, Url
|
84
85
|
|
85
86
|
from ._crt import crt_client
|
86
87
|
|
87
88
|
|
88
89
|
|
90
|
+
_log_levels: dict[str, int] = {
|
91
|
+
"NOTSET": 0,
|
92
|
+
"DEBUG": 10,
|
93
|
+
"INFO": 20,
|
94
|
+
"WARNING": 30,
|
95
|
+
"ERROR": 40,
|
96
|
+
"CRITICAL": 50,
|
97
|
+
"notset": 0,
|
98
|
+
"debug": 10,
|
99
|
+
"info": 20,
|
100
|
+
"warning": 30,
|
101
|
+
"error": 40,
|
102
|
+
"critical": 50,
|
103
|
+
}
|
104
|
+
|
105
|
+
def devLog(request: GNRequest, point: str, level: int, log: str):
|
106
|
+
"""
|
107
|
+
- NOTSET 0
|
108
|
+
- DEBUG 10
|
109
|
+
- INFO 20
|
110
|
+
- WARNING 30
|
111
|
+
- ERROR 40
|
112
|
+
- CRITICAL 50
|
113
|
+
"""
|
114
|
+
if request.transportObject.routeProtocol.dev:
|
115
|
+
if hasattr(request, '_devDataLog'):
|
116
|
+
if request._devDataLogLevel <= level:
|
117
|
+
if in_range(point, request._devDataRange):
|
118
|
+
|
119
|
+
log = f'[{level}]({datetime.datetime.now()}): {log}'
|
120
|
+
|
121
|
+
request._devDataLog.append(log)
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
89
130
|
|
90
131
|
async def chain_async(first_item, rest: AsyncIterable) -> AsyncGenerator:
|
91
132
|
yield first_item
|
@@ -219,16 +260,17 @@ class AsyncClient:
|
|
219
260
|
self.__response_callbacks[name] = callback
|
220
261
|
|
221
262
|
|
222
|
-
async def connect(self,
|
223
|
-
|
263
|
+
async def connect(self, request: GNRequest, restart_connection: bool = False, reconnect_wait: float = 10, keep_alive: bool = True) -> 'QuicClient':
|
264
|
+
domain = request.url.hostname
|
265
|
+
devLog(request, '1.2.1', 10, f'Connect to {domain}: restart_connection={restart_connection}, reconnect_wait={reconnect_wait}, keep_alive={keep_alive}')
|
224
266
|
if not restart_connection and domain in self._active_connections:
|
225
267
|
c = self._active_connections[domain]
|
226
|
-
|
268
|
+
devLog(request, '1.2.2', 10, f'Connection to {domain} found: status={c.status}')
|
227
269
|
if c.status == 'connecting':
|
228
|
-
|
270
|
+
devLog(request, '1.2.3', 10, f'Waiting for connection to {domain}...')
|
229
271
|
try:
|
230
272
|
await asyncio.wait_for(c.connect_future, reconnect_wait)
|
231
|
-
|
273
|
+
devLog(request, '1.2.4', 10, f'Connected to {domain}: status={c.status}')
|
232
274
|
if c.status == 'active':
|
233
275
|
return c
|
234
276
|
elif c.status == 'connecting': # если очень долго подключаемся, то кидаем ошибку
|
@@ -237,7 +279,7 @@ class AsyncClient:
|
|
237
279
|
elif c.status == 'disconnect':
|
238
280
|
raise GNExceptions.ConnectionError.client.connection
|
239
281
|
except:
|
240
|
-
|
282
|
+
devLog(request, '1.2.5', 10, f'Connection to {domain} failed or timed out.')
|
241
283
|
await self.disconnect(domain)
|
242
284
|
|
243
285
|
else:
|
@@ -247,7 +289,9 @@ class AsyncClient:
|
|
247
289
|
c.status = 'connecting'
|
248
290
|
self._active_connections[domain] = c
|
249
291
|
|
292
|
+
devLog(request, '1.2.6', 10, f'Connecting to {domain}...')
|
250
293
|
data = await self.getDNS(domain)
|
294
|
+
devLog(request, '1.2.7', 10, f'Got DNS for {domain}: {data}')
|
251
295
|
|
252
296
|
data = data.split(':')
|
253
297
|
|
@@ -258,7 +302,7 @@ class AsyncClient:
|
|
258
302
|
|
259
303
|
c._disconnect_signal = f # type: ignore
|
260
304
|
c._domain = domain # type: ignore
|
261
|
-
|
305
|
+
devLog(request, '1.2.8', 10, f'Creating QuicClient for {domain}...')
|
262
306
|
await c.connect(data[0], int(data[1]), keep_alive=keep_alive)
|
263
307
|
await c.connect_future
|
264
308
|
|
@@ -274,13 +318,31 @@ class AsyncClient:
|
|
274
318
|
def _return_token(self, bigToken: str, s: bool = True) -> str:
|
275
319
|
return bigToken[:128] if s else bigToken[128:]
|
276
320
|
|
321
|
+
async def _resolve_requests_transport(self, request: GNRequest) -> GNRequest:
|
322
|
+
|
323
|
+
if request.transportObject.routeProtocol.dev:
|
324
|
+
if request.cookies is not None:
|
325
|
+
data: Optional[dict] = request.cookies.get('gn', {}).get('request', {}).get('transport', {}).get('::dev')
|
326
|
+
if data is not None:
|
327
|
+
data['params']['logs']['data'] = []
|
328
|
+
data['params']['data']['data'] = {}
|
329
|
+
request._devDataLog = data['params']['logs']['data']
|
330
|
+
request._devDataLogLevel = _log_levels[data['params']['logs']['data']]
|
331
|
+
request._devData = data['params']['data']['data']
|
332
|
+
request._devDataRange = data['params']['range']
|
333
|
+
|
334
|
+
return request
|
277
335
|
|
278
336
|
async def request(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]], keep_alive: bool = True, restart_connection: bool = False, reconnect_wait: float = 10) -> GNResponse:
|
337
|
+
devLog(request, '1.1.1', 10, f'Request starting... {request}: keep_alive={keep_alive}, restart_connection={restart_connection}, reconnect_wait={reconnect_wait}')
|
338
|
+
|
279
339
|
if isinstance(request, GNRequest):
|
340
|
+
devLog(request, '1.1.2', 10, 'Request is GNRequest')
|
280
341
|
|
342
|
+
request = await self._resolve_requests_transport(request)
|
281
343
|
|
282
|
-
c = await self.connect(request
|
283
|
-
|
344
|
+
c = await self.connect(request, restart_connection, reconnect_wait, keep_alive=keep_alive)
|
345
|
+
devLog(request, '1.1.3', 10, f'Connected: {c.status}')
|
284
346
|
|
285
347
|
|
286
348
|
for f in self.__request_callbacks.values():
|
@@ -294,6 +356,7 @@ class AsyncClient:
|
|
294
356
|
return r
|
295
357
|
|
296
358
|
else:
|
359
|
+
|
297
360
|
c: Optional[QuicClient] = None
|
298
361
|
|
299
362
|
async def wrapped(request) -> AsyncGenerator[GNRequest, None]:
|
@@ -307,7 +370,7 @@ class AsyncClient:
|
|
307
370
|
|
308
371
|
nonlocal c
|
309
372
|
if c is None: # инициализируем при первом req
|
310
|
-
c = await self.connect(request
|
373
|
+
c = await self.connect(request, restart_connection, reconnect_wait, keep_alive=keep_alive)
|
311
374
|
|
312
375
|
yield req
|
313
376
|
|
@@ -559,6 +622,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
559
622
|
if isinstance(request, GNRequest):
|
560
623
|
blob = request.serialize(2)
|
561
624
|
sid = self._quic.get_next_available_stream_id()
|
625
|
+
devLog(request, '1.3.1', 10, f'Sending request on stream {sid}')
|
562
626
|
self._enqueue(sid, blob, True, False)
|
563
627
|
self._schedule_flush()
|
564
628
|
|
@@ -719,7 +783,9 @@ class QuicClient:
|
|
719
783
|
raise RuntimeError("Not connected")
|
720
784
|
|
721
785
|
resp = await self._quik_core.request(request)
|
722
|
-
|
786
|
+
r = GNResponse.deserialize(resp, 2)
|
787
|
+
devLog(request, '1.4.1', 10, f'Response received: {r}')
|
788
|
+
return r
|
723
789
|
|
724
790
|
async def asyncRequestStream(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]]) -> AsyncGenerator[GNResponse, None]:
|
725
791
|
|
@@ -1,13 +1,13 @@
|
|
1
1
|
GNServer/__init__.py,sha256=RCYh6f0lwh-Xh-5fv0jZvbUE6x7l8xYJhbn-o8_ITlE,1551
|
2
2
|
GNServer/_app.py,sha256=nvK_9w1YtZfE-Xh0K-ebkvVINAx4Fir3NSw7Lbwyaz4,18874
|
3
|
-
GNServer/_client.py,sha256=
|
3
|
+
GNServer/_client.py,sha256=H209KSvCnoJ3qXQFTYuzQSecEV-3qQv5JcHeIfT0ypc,32911
|
4
4
|
GNServer/_cors_resolver.py,sha256=U9IFGN7vpVsEM2smhuf5QGj8vYgs7HeFQwDdzWVVy9c,4832
|
5
5
|
GNServer/_crt.py,sha256=SOmyX7zBiCY9EhVSekksQtBHgTIZVvdqNZ8Ni-E5Zow,1390
|
6
6
|
GNServer/_func_params_validation.py,sha256=2Pkv4g8Ln5Csj_2LOjKmJO-Y7EdiyfXmM6iv7_Vlt9A,11359
|
7
7
|
GNServer/_routes.py,sha256=bJnmQ8uEhPVQgy2tTqE5TEIM8aFXV-lVI7c2nG0rQwk,3384
|
8
8
|
GNServer/_template_resolver.py,sha256=vdJYb_7PjIeTWq-Clr7jyj7QIvPBxplU7EqeOuMJ64c,1409
|
9
|
-
gnserver-0.0.0.0.
|
10
|
-
gnserver-0.0.0.0.
|
11
|
-
gnserver-0.0.0.0.
|
12
|
-
gnserver-0.0.0.0.
|
13
|
-
gnserver-0.0.0.0.
|
9
|
+
gnserver-0.0.0.0.38.dist-info/licenses/LICENSE,sha256=WH_t7dKZyWJ5Ld07eYIkUG4Tv6zZWXtAdsUqYAUesn0,1084
|
10
|
+
gnserver-0.0.0.0.38.dist-info/METADATA,sha256=QHAzCX3qzluF85Y7Dy-0VCBgOFINcz0itGtalG0ipnU,830
|
11
|
+
gnserver-0.0.0.0.38.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
12
|
+
gnserver-0.0.0.0.38.dist-info/top_level.txt,sha256=-UOUBuD4u7Qkb1o5PdcwyA3kx8xCH2lwy0tJHi26Wb4,9
|
13
|
+
gnserver-0.0.0.0.38.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|