GNServer 0.0.0.0.57__py3-none-any.whl → 0.0.0.0.59__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 +17 -1
- GNServer/_app.py +14 -8
- GNServer/_client.py +28 -12
- GNServer/models.py +5 -2
- {gnserver-0.0.0.0.57.dist-info → gnserver-0.0.0.0.59.dist-info}/METADATA +1 -1
- gnserver-0.0.0.0.59.dist-info/RECORD +14 -0
- gnserver-0.0.0.0.57.dist-info/RECORD +0 -14
- {gnserver-0.0.0.0.57.dist-info → gnserver-0.0.0.0.59.dist-info}/WHEEL +0 -0
- {gnserver-0.0.0.0.57.dist-info → gnserver-0.0.0.0.59.dist-info}/licenses/LICENSE +0 -0
- {gnserver-0.0.0.0.57.dist-info → gnserver-0.0.0.0.59.dist-info}/top_level.txt +0 -0
GNServer/__init__.py
CHANGED
@@ -33,10 +33,26 @@ IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
33
33
|
DEALINGS IN THE SOFTWARE.
|
34
34
|
"""
|
35
35
|
|
36
|
+
__all__ = [
|
37
|
+
'App',
|
38
|
+
'Url',
|
39
|
+
'GNRequest',
|
40
|
+
'GNResponse',
|
41
|
+
'CommandObject',
|
42
|
+
'CORSObject',
|
43
|
+
'FileObject',
|
44
|
+
'TemplateObject',
|
45
|
+
'GNTransportProtocol',
|
46
|
+
'AsyncClient',
|
47
|
+
'response'
|
48
|
+
]
|
49
|
+
|
50
|
+
|
36
51
|
from ._app import App
|
37
52
|
|
38
53
|
from gnobjects.net.objects import Url, GNRequest, GNResponse, CommandObject, CORSObject, FileObject, TemplateObject, GNTransportProtocol
|
39
|
-
from gnobjects.net.objects import AllGNFastCommands as
|
54
|
+
from gnobjects.net.objects import AllGNFastCommands as response
|
40
55
|
|
56
|
+
responses = response
|
41
57
|
|
42
58
|
from ._client import AsyncClient
|
GNServer/_app.py
CHANGED
@@ -42,7 +42,7 @@ logger.setLevel(logging.DEBUG)
|
|
42
42
|
|
43
43
|
console = logging.StreamHandler(sys.stdout)
|
44
44
|
console.setLevel(logging.DEBUG)
|
45
|
-
console.setFormatter(logging.Formatter("[
|
45
|
+
console.setFormatter(logging.Formatter("[%(name)s] %(levelname)s: %(message)s"))
|
46
46
|
logger.addHandler(console)
|
47
47
|
|
48
48
|
|
@@ -227,8 +227,11 @@ class App:
|
|
227
227
|
for qn, qvals in request.url.params.items():
|
228
228
|
if qn in kw:
|
229
229
|
continue
|
230
|
-
|
231
|
-
|
230
|
+
if isinstance(qvals, int):
|
231
|
+
kw[qn] = qvals
|
232
|
+
else:
|
233
|
+
raw = qvals if len(qvals) > 1 else qvals[0]
|
234
|
+
kw[qn] = _convert_value(raw, _ann(qn), str)
|
232
235
|
|
233
236
|
|
234
237
|
params = set(sig.parameters.keys())
|
@@ -349,13 +352,15 @@ class App:
|
|
349
352
|
request.client._data['domain'] = domain
|
350
353
|
except:
|
351
354
|
asyncio.create_task(self.sendRawResponse(stream_id, AllGNFastCommands.KDCDecryptRequestFailed().serialize(mode=mode)))
|
355
|
+
self._buffer.pop(event.stream_id, None)
|
356
|
+
return
|
352
357
|
|
353
358
|
else:
|
354
359
|
raise Exception('Не удалось расшифровать от KDC')
|
355
360
|
|
356
361
|
request.stream_id = stream_id # type: ignore
|
362
|
+
logger.debug(f'Request: {request.method} {request.url}')
|
357
363
|
asyncio.create_task(self._handle_request(request, mode))
|
358
|
-
logger.debug(f'Отправлена задача разрешения пакета {request} route -> {request.route}')
|
359
364
|
|
360
365
|
self._buffer.pop(event.stream_id, None)
|
361
366
|
return
|
@@ -397,7 +402,6 @@ class App:
|
|
397
402
|
queue.put_nowait(None)
|
398
403
|
self._buffer.pop(event.stream_id)
|
399
404
|
self._streams.pop(event.stream_id)
|
400
|
-
logger.debug(f'Закрываем стрим [{event.stream_id}]')
|
401
405
|
return
|
402
406
|
|
403
407
|
queue.put_nowait(request)
|
@@ -439,12 +443,11 @@ class App:
|
|
439
443
|
return
|
440
444
|
|
441
445
|
await self.sendResponse(request, response, mode)
|
442
|
-
logger.debug(f'Отправлен на сервер ответ -> {response.command} {response.payload if response.payload and len(str(response.payload)) < 200 else ''}')
|
443
446
|
except Exception as e:
|
444
447
|
if isinstance(e, (GNRequest, GNFastCommand)):
|
445
448
|
await self.sendResponse(request, e, mode)
|
446
449
|
else:
|
447
|
-
logger.error('
|
450
|
+
logger.error('InternalServerError:\n' + traceback.format_exc())
|
448
451
|
|
449
452
|
await self.sendResponse(request, AllGNFastCommands.InternalServerError(), mode)
|
450
453
|
|
@@ -452,6 +455,9 @@ class App:
|
|
452
455
|
|
453
456
|
async def sendResponse(self, request: GNRequest, response: GNResponse, mode: int, end_stream: bool = True):
|
454
457
|
await response.assembly()
|
458
|
+
|
459
|
+
|
460
|
+
logger.debug(f'Response: {request.method} {request.url} -> {response.command} {response.payload if len(str(response.payload)) < 256 else ''}')
|
455
461
|
|
456
462
|
blob = response.serialize(mode)
|
457
463
|
|
@@ -508,7 +514,7 @@ class App:
|
|
508
514
|
if run is not None:
|
509
515
|
await run()
|
510
516
|
|
511
|
-
|
517
|
+
logger.debug('Server startup completed')
|
512
518
|
if wait:
|
513
519
|
await asyncio.Event().wait()
|
514
520
|
|
GNServer/_client.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import os
|
2
|
+
import sys
|
2
3
|
import time
|
3
4
|
import httpx
|
4
5
|
import asyncio
|
@@ -87,6 +88,21 @@ from ._crt import crt_client
|
|
87
88
|
from .models import KDCObject
|
88
89
|
|
89
90
|
|
91
|
+
|
92
|
+
|
93
|
+
import logging
|
94
|
+
|
95
|
+
logger = logging.getLogger("GNClient")
|
96
|
+
logger.setLevel(logging.DEBUG)
|
97
|
+
|
98
|
+
console = logging.StreamHandler(sys.stdout)
|
99
|
+
console.setLevel(logging.DEBUG)
|
100
|
+
console.setFormatter(logging.Formatter("[%(name)s] %(levelname)s: %(message)s"))
|
101
|
+
logger.addHandler(console)
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
90
106
|
_log_levels: dict[str, int] = {
|
91
107
|
"NOTSET": 0,
|
92
108
|
"DEBUG": 10,
|
@@ -122,7 +138,7 @@ def devLog(request: GNRequest, point: str, level: int, log: str):
|
|
122
138
|
|
123
139
|
|
124
140
|
|
125
|
-
|
141
|
+
_sys_s_mode = 2
|
126
142
|
|
127
143
|
async def chain_async(first_item, rest: AsyncIterable) -> AsyncGenerator:
|
128
144
|
yield first_item
|
@@ -263,8 +279,9 @@ class AsyncClient:
|
|
263
279
|
|
264
280
|
for f in self.__request_callbacks.values():
|
265
281
|
asyncio.create_task(f(request))
|
266
|
-
|
282
|
+
logger.debug(f'Request: {request.method} {request.url}')
|
267
283
|
r = await c.asyncRequest(request)
|
284
|
+
logger.debug(f'Response: {request.method} {request.url} -> {r.command} {r.payload if len(str(r.payload)) < 256 else ''}')
|
268
285
|
|
269
286
|
for f in self.__response_callbacks.values():
|
270
287
|
asyncio.create_task(f(r))
|
@@ -516,7 +533,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
516
533
|
del buf[:lenght]
|
517
534
|
|
518
535
|
|
519
|
-
r = GNResponse.deserialize(data,
|
536
|
+
r = GNResponse.deserialize(data, _sys_s_mode)
|
520
537
|
handler.put_nowait(r)
|
521
538
|
if event.end_stream:
|
522
539
|
handler.put_nowait(None)
|
@@ -574,7 +591,6 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
574
591
|
if q is None:
|
575
592
|
break
|
576
593
|
sid, blob, end_stream = q.popleft()
|
577
|
-
print(f'Отправка стрима {sid}')
|
578
594
|
self._quic.send_stream_data(sid, blob, end_stream=end_stream)
|
579
595
|
self.transmit()
|
580
596
|
self._activity()
|
@@ -590,7 +606,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
590
606
|
await self.ensure_sys_stream()
|
591
607
|
if response:
|
592
608
|
msg_id = next(self._sys_id_gen)
|
593
|
-
blob = request.serialize(
|
609
|
+
blob = request.serialize(_sys_s_mode)
|
594
610
|
payload = (
|
595
611
|
msg_id.to_bytes(8, "little") + len(blob).to_bytes(4, "little") + blob
|
596
612
|
)
|
@@ -606,7 +622,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
606
622
|
|
607
623
|
async def request(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]]):
|
608
624
|
if isinstance(request, GNRequest):
|
609
|
-
blob = request.serialize(
|
625
|
+
blob = request.serialize(_sys_s_mode)
|
610
626
|
|
611
627
|
if self.quicClient._client._kdc is not None:
|
612
628
|
blob = self.quicClient._client._kdc.encode(request.url.hostname, blob)
|
@@ -624,7 +640,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
624
640
|
data, domain = self.quicClient._client._kdc.decode(data)
|
625
641
|
|
626
642
|
if data is not None:
|
627
|
-
r = GNResponse.deserialize(data,
|
643
|
+
r = GNResponse.deserialize(data, _sys_s_mode)
|
628
644
|
return r
|
629
645
|
else:
|
630
646
|
return GNResponse('gn:client:0')
|
@@ -637,7 +653,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
637
653
|
_last = None
|
638
654
|
async for req in request:
|
639
655
|
_last = req
|
640
|
-
blob = req.serialize(
|
656
|
+
blob = req.serialize(_sys_s_mode)
|
641
657
|
self._enqueue(sid, blob, False, False)
|
642
658
|
|
643
659
|
|
@@ -648,7 +664,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
648
664
|
|
649
665
|
_last.setPayload(None)
|
650
666
|
_last.setMethod('gn:end-stream')
|
651
|
-
blob = _last.serialize(
|
667
|
+
blob = _last.serialize(_sys_s_mode)
|
652
668
|
self._enqueue(sid, blob, True, False)
|
653
669
|
self._schedule_flush()
|
654
670
|
|
@@ -661,7 +677,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
661
677
|
|
662
678
|
async def requestStream(self, request: Union[GNRequest, AsyncGenerator[GNRequest, Any]]) -> asyncio.Queue[GNResponse]:
|
663
679
|
if isinstance(request, GNRequest):
|
664
|
-
blob = request.serialize(
|
680
|
+
blob = request.serialize(_sys_s_mode)
|
665
681
|
sid = self._quic.get_next_available_stream_id()
|
666
682
|
self._enqueue(sid, blob, False, False)
|
667
683
|
self._schedule_flush()
|
@@ -678,7 +694,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
678
694
|
_last = None
|
679
695
|
async for req in request:
|
680
696
|
_last = req
|
681
|
-
blob = req.serialize(
|
697
|
+
blob = req.serialize(_sys_s_mode)
|
682
698
|
self._enqueue(sid, blob, False, False)
|
683
699
|
|
684
700
|
|
@@ -689,7 +705,7 @@ class RawQuicClient(QuicConnectionProtocol):
|
|
689
705
|
|
690
706
|
_last.setPayload(None)
|
691
707
|
_last.setMethod('gn:end-stream')
|
692
|
-
blob = _last.serialize(
|
708
|
+
blob = _last.serialize(_sys_s_mode)
|
693
709
|
self._enqueue(sid, blob, True, False)
|
694
710
|
self._schedule_flush()
|
695
711
|
|
GNServer/models.py
CHANGED
@@ -39,6 +39,8 @@ class KDCObject:
|
|
39
39
|
for i in self._requested_domains:
|
40
40
|
if i in servers_keys:
|
41
41
|
self._requested_domains.remove(i)
|
42
|
+
else:
|
43
|
+
servers_keys = {}
|
42
44
|
|
43
45
|
if len(self._requested_domains) > 0:
|
44
46
|
payload = self._requested_domains
|
@@ -48,11 +50,12 @@ class KDCObject:
|
|
48
50
|
print(f'ERROR: {r.command} {r.payload}')
|
49
51
|
raise r
|
50
52
|
|
51
|
-
servers_keys = r.payload
|
52
|
-
|
53
53
|
if servers_keys is None:
|
54
54
|
print(f'ERROR: {r.command} {r.payload}')
|
55
55
|
raise r
|
56
|
+
|
57
|
+
servers_keys.update(r.payload)
|
58
|
+
|
56
59
|
|
57
60
|
self._servers_keys.update(servers_keys)
|
58
61
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
GNServer/__init__.py,sha256=QmvIIE5RWIv040_l216aWtYuiIPtLasdsFbH0Fya2SI,1793
|
2
|
+
GNServer/_app.py,sha256=bf5sXwimwgsSq51bK3YVq0e46p-0Hr9NY5wME2Okh54,19328
|
3
|
+
GNServer/_client.py,sha256=MDAVnMGc5QNweOt8Tbas7OF9d_0Z3upxtrA7PmIttVs,33163
|
4
|
+
GNServer/_cors_resolver.py,sha256=aDxk4ItaEK-6vlDbkno8FJZEjczGEe8vkOui6_kz5-Y,5950
|
5
|
+
GNServer/_crt.py,sha256=SOmyX7zBiCY9EhVSekksQtBHgTIZVvdqNZ8Ni-E5Zow,1390
|
6
|
+
GNServer/_func_params_validation.py,sha256=pDXRzPVTdPnDHFMMmKd014SConBjFOuaLeJTY0vldlM,11412
|
7
|
+
GNServer/_routes.py,sha256=bJnmQ8uEhPVQgy2tTqE5TEIM8aFXV-lVI7c2nG0rQwk,3384
|
8
|
+
GNServer/_template_resolver.py,sha256=vdJYb_7PjIeTWq-Clr7jyj7QIvPBxplU7EqeOuMJ64c,1409
|
9
|
+
GNServer/models.py,sha256=CXBJR_g3clIKKaMJ_zsUFLEG0EBa3g_Ik10te7whd30,3211
|
10
|
+
gnserver-0.0.0.0.59.dist-info/licenses/LICENSE,sha256=_rN-sb3LemR3cKsEqjJRdXkdt7mME1mkW1BwWEn-zAw,1309
|
11
|
+
gnserver-0.0.0.0.59.dist-info/METADATA,sha256=8x6eFAgjqAlpnOR29WUGyFwtj78jLfU0UARWXZMqTwM,830
|
12
|
+
gnserver-0.0.0.0.59.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
13
|
+
gnserver-0.0.0.0.59.dist-info/top_level.txt,sha256=-UOUBuD4u7Qkb1o5PdcwyA3kx8xCH2lwy0tJHi26Wb4,9
|
14
|
+
gnserver-0.0.0.0.59.dist-info/RECORD,,
|
@@ -1,14 +0,0 @@
|
|
1
|
-
GNServer/__init__.py,sha256=6CMCZlkBO74PW8i8DAri5xz2fYM9EyPH8vdsLYBMmOo,1560
|
2
|
-
GNServer/_app.py,sha256=fXPrxk-YiprBvjYQckAj3oSHLdWlAENPZ6WkqC8bFZ8,19242
|
3
|
-
GNServer/_client.py,sha256=IEzben2zZfgpU9DhcnjB9uQLCInllZhdoLTZyM72ldA,32610
|
4
|
-
GNServer/_cors_resolver.py,sha256=aDxk4ItaEK-6vlDbkno8FJZEjczGEe8vkOui6_kz5-Y,5950
|
5
|
-
GNServer/_crt.py,sha256=SOmyX7zBiCY9EhVSekksQtBHgTIZVvdqNZ8Ni-E5Zow,1390
|
6
|
-
GNServer/_func_params_validation.py,sha256=pDXRzPVTdPnDHFMMmKd014SConBjFOuaLeJTY0vldlM,11412
|
7
|
-
GNServer/_routes.py,sha256=bJnmQ8uEhPVQgy2tTqE5TEIM8aFXV-lVI7c2nG0rQwk,3384
|
8
|
-
GNServer/_template_resolver.py,sha256=vdJYb_7PjIeTWq-Clr7jyj7QIvPBxplU7EqeOuMJ64c,1409
|
9
|
-
GNServer/models.py,sha256=Te9Fyw-EsMnEZt0TPE9H0Zc_atjq2X94VsLSQH_k1Kk,3145
|
10
|
-
gnserver-0.0.0.0.57.dist-info/licenses/LICENSE,sha256=_rN-sb3LemR3cKsEqjJRdXkdt7mME1mkW1BwWEn-zAw,1309
|
11
|
-
gnserver-0.0.0.0.57.dist-info/METADATA,sha256=0-K5kQ60Cyj5nwSYGxHYCa5FvGDJZxU6-PQwaTaE4ks,830
|
12
|
-
gnserver-0.0.0.0.57.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
13
|
-
gnserver-0.0.0.0.57.dist-info/top_level.txt,sha256=-UOUBuD4u7Qkb1o5PdcwyA3kx8xCH2lwy0tJHi26Wb4,9
|
14
|
-
gnserver-0.0.0.0.57.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|