Skip to content

Commit 82a5062

Browse files
author
Gabriel Shaar
authored
Merge pull request #41 from rsocket/aioquic_support
Basic QUIC support (aioquic)
2 parents 3598987 + b976253 commit 82a5062

28 files changed

+713
-175
lines changed

.github/workflows/python-package.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
3737
- name: Test with pytest
3838
run: |
39-
pytest --cov-report=html --cov -Werror tests
39+
pytest --cov-report=html --cov --ignore=examples tests
4040
- name: Archive code coverage html report
4141
uses: actions/upload-artifact@v2
4242
with:

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ all the examples
4141
| server (python) | server (java) | client (python) | client(java) |
4242
|-----------------------------|---------------|------------------------------------|-----------------|
4343
| server.py | | client.py | |
44+
| server_quic.py | | client_quic.py | |
4445
| server_with_lease.py | | | ClientWithLease |
4546
| server_with_routing.py | | client_with_routing.py | Client |
4647
| | Server | run_against_example_java_server.py | |
@@ -74,6 +75,7 @@ all the examples
7475
- [ ] Transports
7576
- [X] TCP
7677
- [X] Websocket
78+
- [X] QUIC
7779
- [ ] HTTP/2
7880
- [ ] Aeron
7981
- [X] RxPy Integration

examples/certificates/pycacert.pem

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
Certificate:
2+
Data:
3+
Version: 3 (0x2)
4+
Serial Number:
5+
cb:2d:80:99:5a:69:52:5b
6+
Signature Algorithm: sha256WithRSAEncryption
7+
Issuer: C=XY, O=Python Software Foundation CA, CN=our-ca-server
8+
Validity
9+
Not Before: Aug 29 14:23:16 2018 GMT
10+
Not After : Aug 26 14:23:16 2028 GMT
11+
Subject: C=XY, O=Python Software Foundation CA, CN=our-ca-server
12+
Subject Public Key Info:
13+
Public Key Algorithm: rsaEncryption
14+
Public-Key: (3072 bit)
15+
Modulus:
16+
00:97:ed:55:41:ba:36:17:95:db:71:1c:d3:e1:61:
17+
ac:58:73:e3:c6:96:cf:2b:1f:b8:08:f5:9d:4b:4b:
18+
c7:30:f6:b8:0b:b3:52:72:a0:bb:c9:4d:3b:8e:df:
19+
22:8e:01:57:81:c9:92:73:cc:00:c6:ec:70:b0:3a:
20+
17:40:c1:df:f2:8c:36:4c:c4:a7:81:e7:b6:24:68:
21+
e2:a0:7e:35:07:2f:a0:5b:f9:45:46:f7:1e:f0:46:
22+
11:fe:ca:1a:3c:50:f1:26:a9:5f:9c:22:9c:f8:41:
23+
e1:df:4f:12:95:19:2f:5c:90:01:17:6e:7e:3e:7d:
24+
cf:e9:09:af:25:f8:f8:42:77:2d:6d:5f:36:f2:78:
25+
1e:7d:4a:87:68:63:6c:06:71:1b:8d:fa:25:fe:d4:
26+
d3:f5:a5:17:b1:ef:ea:17:cb:54:c8:27:99:80:cb:
27+
3c:45:f1:2c:52:1c:dd:1f:51:45:20:50:1e:5e:ab:
28+
57:73:1b:41:78:96:de:84:a4:7a:dd:8f:30:85:36:
29+
58:79:76:a0:d2:61:c8:1b:a9:94:99:63:c6:ee:f8:
30+
14:bf:b4:52:56:31:97:fa:eb:ac:53:9e:95:ce:4c:
31+
c4:5a:4a:b7:ca:03:27:5b:35:57:ce:02:dc:ec:ca:
32+
69:f8:8a:5a:39:cb:16:20:15:03:24:61:6c:f4:7a:
33+
fc:b6:48:e5:59:10:5c:49:d0:23:9f:fb:71:5e:3a:
34+
e9:68:9f:34:72:80:27:b6:3f:4c:b1:d9:db:63:7f:
35+
67:68:4a:6e:11:f8:e8:c0:f4:5a:16:39:53:0b:68:
36+
de:77:fa:45:e7:f8:91:cd:78:cd:28:94:97:71:54:
37+
fb:cf:f0:37:de:c9:26:c5:dc:1b:9e:89:6d:09:ac:
38+
c8:44:71:cb:6d:f1:97:31:d5:4c:20:33:bf:75:4a:
39+
a0:e0:dc:69:11:ed:2a:b4:64:10:11:30:8b:0e:b0:
40+
a7:10:d8:8a:c5:aa:1b:c8:26:8a:25:e7:66:9f:a5:
41+
6a:1a:2f:7c:5f:83:c6:78:4f:1f
42+
Exponent: 65537 (0x10001)
43+
X509v3 extensions:
44+
X509v3 Subject Key Identifier:
45+
DD:BF:CA:DA:E6:D1:34:BA:37:75:21:CA:6F:9A:08:28:F2:35:B6:48
46+
X509v3 Authority Key Identifier:
47+
keyid:DD:BF:CA:DA:E6:D1:34:BA:37:75:21:CA:6F:9A:08:28:F2:35:B6:48
48+
49+
X509v3 Basic Constraints:
50+
CA:TRUE
51+
Signature Algorithm: sha256WithRSAEncryption
52+
33:6a:54:d3:6b:c0:d7:01:5f:9d:f4:05:c1:93:66:90:50:d0:
53+
b7:18:e9:b0:1e:4a:a0:b6:da:76:93:af:84:db:ad:15:54:31:
54+
15:13:e4:de:7e:4e:0c:d5:09:1c:34:35:b6:e5:4c:d6:6f:65:
55+
7d:32:5f:eb:fc:a9:6b:07:f7:49:82:e5:81:7e:07:80:9a:63:
56+
f8:2c:c3:40:bc:8f:d4:2a:da:3e:d1:ee:08:b7:4d:a7:84:ca:
57+
f4:3f:a1:98:45:be:b1:05:69:e7:df:d7:99:ab:1b:ee:8b:30:
58+
cc:f7:fc:e7:d4:0b:17:ae:97:bf:e4:7b:fd:0f:a7:b4:85:79:
59+
e3:59:e2:16:87:bf:1f:29:45:2c:23:93:76:be:c0:87:1d:de:
60+
ec:2b:42:6a:e5:bb:c8:f4:0a:4a:08:0a:8c:5c:d8:7d:4d:d1:
61+
b8:bf:d5:f7:29:ed:92:d1:94:04:e8:35:06:57:7f:2c:23:97:
62+
87:a5:35:8d:26:d3:1a:47:f2:16:d7:d9:c6:d4:1f:23:43:d3:
63+
26:99:39:ca:20:f4:71:23:6f:0c:4a:76:76:f7:76:1f:b3:fe:
64+
bf:47:b0:fc:2a:56:81:e1:d2:dd:ee:08:d8:f4:ff:5a:dc:25:
65+
61:8a:91:02:b9:86:1c:f2:50:73:76:25:35:fc:b6:25:26:15:
66+
cb:eb:c4:2b:61:0c:1c:e7:ee:2f:17:9b:ec:f0:d4:a1:84:e7:
67+
d2:af:de:e4:1b:24:14:a7:01:87:e3:ab:29:58:46:a0:d9:c0:
68+
0a:e0:8d:d7:59:d3:1b:f8:54:20:3e:78:a5:a5:c8:4f:8b:03:
69+
c4:96:9f:ec:fb:47:cf:76:2d:8d:65:34:27:bf:fa:ae:01:05:
70+
8a:f3:92:0a:dd:89:6c:97:a1:c7:e7:60:51:e7:ac:eb:4b:7d:
71+
2c:b8:65:c9:fe:5d:6a:48:55:8e:e4:c7:f9:6a:40:e1:b8:64:
72+
45:e9:b5:59:29:a5:5f:cf:7d:58:7d:64:79:e5:a4:09:ac:1e:
73+
76:65:3d:94:c4:68
74+
-----BEGIN CERTIFICATE-----
75+
MIIEbTCCAtWgAwIBAgIJAMstgJlaaVJbMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV
76+
BAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBDQTEW
77+
MBQGA1UEAwwNb3VyLWNhLXNlcnZlcjAeFw0xODA4MjkxNDIzMTZaFw0yODA4MjYx
78+
NDIzMTZaME0xCzAJBgNVBAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29mdHdhcmUg
79+
Rm91bmRhdGlvbiBDQTEWMBQGA1UEAwwNb3VyLWNhLXNlcnZlcjCCAaIwDQYJKoZI
80+
hvcNAQEBBQADggGPADCCAYoCggGBAJftVUG6NheV23Ec0+FhrFhz48aWzysfuAj1
81+
nUtLxzD2uAuzUnKgu8lNO47fIo4BV4HJknPMAMbscLA6F0DB3/KMNkzEp4HntiRo
82+
4qB+NQcvoFv5RUb3HvBGEf7KGjxQ8SapX5winPhB4d9PEpUZL1yQARdufj59z+kJ
83+
ryX4+EJ3LW1fNvJ4Hn1Kh2hjbAZxG436Jf7U0/WlF7Hv6hfLVMgnmYDLPEXxLFIc
84+
3R9RRSBQHl6rV3MbQXiW3oSket2PMIU2WHl2oNJhyBuplJljxu74FL+0UlYxl/rr
85+
rFOelc5MxFpKt8oDJ1s1V84C3OzKafiKWjnLFiAVAyRhbPR6/LZI5VkQXEnQI5/7
86+
cV466WifNHKAJ7Y/TLHZ22N/Z2hKbhH46MD0WhY5Uwto3nf6Ref4kc14zSiUl3FU
87+
+8/wN97JJsXcG56JbQmsyERxy23xlzHVTCAzv3VKoODcaRHtKrRkEBEwiw6wpxDY
88+
isWqG8gmiiXnZp+lahovfF+DxnhPHwIDAQABo1AwTjAdBgNVHQ4EFgQU3b/K2ubR
89+
NLo3dSHKb5oIKPI1tkgwHwYDVR0jBBgwFoAU3b/K2ubRNLo3dSHKb5oIKPI1tkgw
90+
DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAYEAM2pU02vA1wFfnfQFwZNm
91+
kFDQtxjpsB5KoLbadpOvhNutFVQxFRPk3n5ODNUJHDQ1tuVM1m9lfTJf6/ypawf3
92+
SYLlgX4HgJpj+CzDQLyP1CraPtHuCLdNp4TK9D+hmEW+sQVp59/Xmasb7oswzPf8
93+
59QLF66Xv+R7/Q+ntIV541niFoe/HylFLCOTdr7Ahx3e7CtCauW7yPQKSggKjFzY
94+
fU3RuL/V9yntktGUBOg1Bld/LCOXh6U1jSbTGkfyFtfZxtQfI0PTJpk5yiD0cSNv
95+
DEp2dvd2H7P+v0ew/CpWgeHS3e4I2PT/WtwlYYqRArmGHPJQc3YlNfy2JSYVy+vE
96+
K2EMHOfuLxeb7PDUoYTn0q/e5BskFKcBh+OrKVhGoNnACuCN11nTG/hUID54paXI
97+
T4sDxJaf7PtHz3YtjWU0J7/6rgEFivOSCt2JbJehx+dgUees60t9LLhlyf5dakhV
98+
juTH+WpA4bhkRem1WSmlX899WH1keeWkCawedmU9lMRo
99+
-----END CERTIFICATE-----

examples/certificates/ssl_cert.pem

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIF8TCCBFmgAwIBAgIJAMstgJlaaVJcMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNV
3+
BAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBDQTEW
4+
MBQGA1UEAwwNb3VyLWNhLXNlcnZlcjAeFw0xODA4MjkxNDIzMTZaFw0yODA3MDcx
5+
NDIzMTZaMF8xCzAJBgNVBAYTAlhZMRcwFQYDVQQHDA5DYXN0bGUgQW50aHJheDEj
6+
MCEGA1UECgwaUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24xEjAQBgNVBAMMCWxv
7+
Y2FsaG9zdDCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAJ8oLzdB739k
8+
YxZiFukBFGIpyjqYkj0I015p/sDz1MT7DljcZLBLy7OqnkLpB5tnM8256DwdihPA
9+
3zlnfEzTfr9DD0qFBW2H5cMCoz7X17koeRhzGDd3dkjUeBjXvR5qRosG8wM3lQug
10+
U7AizY+3Azaj1yN3mZ9K5a20jr58Kqinz+Xxx6sb2JfYYff2neJbBahNm5id0AD2
11+
pi/TthZqO5DURJYo+MdgZOcy+7jEjOJsLWZd3Yzq78iM07qDjbpIoVpENZCTHTWA
12+
hX8LIqz0OBmh4weQpm4+plU7E4r4D82uauocWw8iyuznCTtABWO7n9fWySmf9QZC
13+
WYxHAFpBQs6zUVqAD7nhFdTqpQ9bRiaEnjE4HiAccPW+MAoSxFnv/rNzEzI6b4zU
14+
NspFMfg1aNVamdjxdpUZ1GG1Okf0yPJykqEX4PZl3La1Be2q7YZ1wydR523Xd+f3
15+
EO4/g+imETSKn8gyCf6Rvib175L4r2WV1CXQH7gFwZYCod6WHYq5TQIDAQABo4IB
16+
wDCCAbwwFAYDVR0RBA0wC4IJbG9jYWxob3N0MA4GA1UdDwEB/wQEAwIFoDAdBgNV
17+
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
18+
FgQUj+od4zNcABazi29rb9NMy7XLfFUwfQYDVR0jBHYwdIAU3b/K2ubRNLo3dSHK
19+
b5oIKPI1tkihUaRPME0xCzAJBgNVBAYTAlhZMSYwJAYDVQQKDB1QeXRob24gU29m
20+
dHdhcmUgRm91bmRhdGlvbiBDQTEWMBQGA1UEAwwNb3VyLWNhLXNlcnZlcoIJAMst
21+
gJlaaVJbMIGDBggrBgEFBQcBAQR3MHUwPAYIKwYBBQUHMAKGMGh0dHA6Ly90ZXN0
22+
Y2EucHl0aG9udGVzdC5uZXQvdGVzdGNhL3B5Y2FjZXJ0LmNlcjA1BggrBgEFBQcw
23+
AYYpaHR0cDovL3Rlc3RjYS5weXRob250ZXN0Lm5ldC90ZXN0Y2Evb2NzcC8wQwYD
24+
VR0fBDwwOjA4oDagNIYyaHR0cDovL3Rlc3RjYS5weXRob250ZXN0Lm5ldC90ZXN0
25+
Y2EvcmV2b2NhdGlvbi5jcmwwDQYJKoZIhvcNAQELBQADggGBACf1jFkQ9MbnKAC/
26+
uo17EwPxHKZfswZVpCK527LVRr33DN1DbrR5ZWchDCpV7kCOhZ+fR7sKKk22ZHSY
27+
oH+u3PEu20J3GOB1iyY1aMNB7WvId3JvappdVWkC/VpUyFfLsGUDFuIPADmZZqCb
28+
iJMX4loteTVfl1d4xK/1mV6Gq9MRrRqiDfpSELn+v53OM9mGspwW+NZ1CIrbCuW0
29+
KxZ/tPkqn8PSd9fNZR70bB7rWbnwrl+kH8xKxLl6qdlrMmg74WWwhLeQxK7+9DdP
30+
IaDenzqx5cwWBGY/C0HcQj0gPuy3lSs1V/q+f7Y6uspPWP51PgiJLIywXS75iRAr
31+
+UFGTzwAtyfTZSQoFyMmMULqfk6T5HtoVMqfRvPvK+mFDLWEstU1NIB1K/CRI7gI
32+
AY65ClTU+zRS/tlF8IA7tsFvgtEf8jsI9kamlidhS1gyeg4dWcVErV4aeTPB1AUv
33+
StPYQkKNM+NjytWHl5tNuBoDNLsc0gI/WSPiI4CIY8LwomOoiw==
34+
-----END CERTIFICATE-----

examples/certificates/ssl_key.pem

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
39+
aH1M/zC4aVaS0DYB/Gxq7v8=
40+
-----END PRIVATE KEY-----

examples/client_quic.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import asyncio
2+
import logging
3+
import sys
4+
from pathlib import Path
5+
6+
from aioquic.quic.configuration import QuicConfiguration
7+
8+
from reactivestreams.subscriber import DefaultSubscriber
9+
from rsocket.helpers import single_transport_provider
10+
from rsocket.payload import Payload
11+
from rsocket.rsocket_client import RSocketClient
12+
from rsocket.transports.aioquic_transport import rsocket_connect
13+
14+
15+
class StreamSubscriber(DefaultSubscriber):
16+
17+
def on_next(self, value, is_complete=False):
18+
logging.info('RS: {}'.format(value))
19+
self.subscription.request(1)
20+
21+
22+
async def main(server_port):
23+
logging.info('Connecting to server at localhost:%s', server_port)
24+
25+
client_configuration = QuicConfiguration(
26+
is_client=True
27+
)
28+
ca_file_path = Path(__file__).parent / 'certificates' / 'pycacert.pem'
29+
client_configuration.load_verify_locations(cafile=str(ca_file_path))
30+
31+
async with rsocket_connect('localhost', server_port,
32+
configuration=client_configuration) as transport:
33+
async with RSocketClient(single_transport_provider(transport)) as client:
34+
payload = Payload(b'%Y-%m-%d %H:%M:%S')
35+
36+
async def run_request_response():
37+
try:
38+
while True:
39+
result = await client.request_response(payload)
40+
logging.info('Response: {}'.format(result.data))
41+
await asyncio.sleep(1)
42+
except asyncio.CancelledError:
43+
pass
44+
45+
task = asyncio.create_task(run_request_response())
46+
47+
await asyncio.sleep(5)
48+
task.cancel()
49+
await task
50+
51+
52+
if __name__ == '__main__':
53+
port = sys.argv[1] if len(sys.argv) > 1 else 6565
54+
logging.basicConfig(level=logging.DEBUG)
55+
asyncio.run(main(port))

examples/server_quic.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import asyncio
2+
import logging
3+
import sys
4+
from datetime import datetime
5+
from pathlib import Path
6+
7+
from aioquic.quic.configuration import QuicConfiguration
8+
9+
from rsocket.helpers import create_future
10+
from rsocket.payload import Payload
11+
from rsocket.request_handler import BaseRequestHandler
12+
from rsocket.transports.aioquic_transport import rsocket_serve
13+
14+
15+
class Handler(BaseRequestHandler):
16+
async def request_response(self, payload: Payload) -> asyncio.Future:
17+
await asyncio.sleep(0.1) # Simulate not immediate process
18+
date_time_format = payload.data.decode('utf-8')
19+
formatted_date_time = datetime.now().strftime(date_time_format)
20+
return create_future(Payload(formatted_date_time.encode('utf-8')))
21+
22+
23+
def run_server(server_port):
24+
logging.info('Starting server at localhost:%s', server_port)
25+
26+
configuration = QuicConfiguration(
27+
is_client=False
28+
)
29+
30+
certificates_path = Path(__file__).parent / 'certificates'
31+
configuration.load_cert_chain(certificates_path / 'ssl_cert.pem', certificates_path / 'ssl_key.pem')
32+
33+
return rsocket_serve(host='localhost',
34+
port=server_port,
35+
configuration=configuration,
36+
handler_factory=Handler)
37+
38+
39+
if __name__ == '__main__':
40+
port = sys.argv[1] if len(sys.argv) > 1 else 6565
41+
logging.basicConfig(level=logging.DEBUG)
42+
43+
loop = asyncio.get_event_loop()
44+
loop.run_until_complete(run_server(port))
45+
try:
46+
loop.run_forever()
47+
except KeyboardInterrupt:
48+
pass

examples/test_examples.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,19 @@ def test_simple_client_server(unused_tcp_port):
1919
os.kill(pid, signal.SIGTERM)
2020

2121

22+
def test_quic_client_server(unused_tcp_port):
23+
pid = os.spawnlp(os.P_NOWAIT, 'python3', 'python3', './server_quic.py', str(unused_tcp_port))
24+
25+
try:
26+
sleep(2)
27+
client = subprocess.Popen(['python3', './client.py_quic', str(unused_tcp_port)])
28+
client.wait(timeout=10)
29+
30+
assert client.returncode == 0
31+
finally:
32+
os.kill(pid, signal.SIGTERM)
33+
34+
2235
@pytest.mark.timeout(30)
2336
def test_client_server_with_routing(unused_tcp_port):
2437
pid = os.spawnlp(os.P_NOWAIT, 'python3', 'python3', './server_with_routing.py', str(unused_tcp_port))

requirements.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,6 @@ Rx==3.2.0
99
aiohttp==3.8.1
1010
quart==0.16.3
1111
coveralls==3.3.1
12+
aioquic==0.9.19
13+
14+
Jinja2==3.0.3

rsocket/transports/abstract_websocket.py renamed to rsocket/transports/abstract_messaging.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
from rsocket.transports.transport import Transport
55

66

7-
class AbstractWebsocketTransport(Transport, metaclass=abc.ABCMeta):
7+
class AbstractMessagingTransport(Transport, metaclass=abc.ABCMeta):
88
def __init__(self):
99
super().__init__()
1010
self._incoming_frame_queue = asyncio.Queue()
1111

12-
async def next_frame_generator(self, is_server_alive):
12+
async def next_frame_generator(self, is_server_alive: bool):
1313
frame = await self._incoming_frame_queue.get()
1414

1515
async def frame_generator():

0 commit comments

Comments
 (0)