Skip to content

Commit 5127c85

Browse files
authored
Merge pull request #68 from rsocket/cli_improvements
Cli improvements
2 parents 20b67a7 + 08695b1 commit 5127c85

File tree

8 files changed

+301
-105
lines changed

8 files changed

+301
-105
lines changed

CHANGELOG.rst

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
Changelog
22
---------
33

4+
v0.4.2
5+
======
6+
- Command line fixes:
7+
- Support passing ssl certificate and http headers when using ws/wss
8+
- Support requesting --version without the need to specify URI arguments
9+
- Option --interactionModel to specify interaction (eg. request_response, request_stream)
10+
- Added Metadata Push support
411

512
v0.4.1
613
======

examples/fixtures.py

+46-29
Original file line numberDiff line numberDiff line change
@@ -7,46 +7,63 @@
77

88

99
@contextmanager
10-
def cert_gen(emailAddress="emailAddress",
11-
commonName="commonName",
12-
countryName="NT",
13-
localityName="localityName",
14-
stateOrProvinceName="stateOrProvinceName",
15-
organizationName="organizationName",
16-
organizationUnitName="organizationUnitName",
17-
serialNumber=0,
18-
validityStartInSeconds=0,
19-
validityEndInSeconds=None) -> Tuple[str, str]:
20-
if validityEndInSeconds is None:
21-
validityEndInSeconds = int(timedelta(days=3650).total_seconds())
10+
def generate_certificate_and_key(email_address="emailAddress",
11+
common_name="localhost",
12+
country_name="NT",
13+
locality_name="localityName",
14+
state_or_province_name="stateOrProvinceName",
15+
organization_name="organizationName",
16+
organization_unit_name="organizationUnitName",
17+
serial_number=0,
18+
validity_start_in_seconds=0,
19+
validity_end_in_seconds=None) -> Tuple[str, str]:
20+
if validity_end_in_seconds is None:
21+
validity_end_in_seconds = int(timedelta(days=3650).total_seconds())
22+
2223
# can look at generated file using openssl:
2324
# openssl x509 -inform pem -in selfsigned.crt -noout -text
2425
# create a key pair
25-
k = crypto.PKey()
26-
k.generate_key(crypto.TYPE_RSA, 4096)
26+
private_key = create_key()
2727

2828
# create a self-signed cert
29-
cert = crypto.X509()
30-
cert.get_subject().C = countryName
31-
cert.get_subject().ST = stateOrProvinceName
32-
cert.get_subject().L = localityName
33-
cert.get_subject().O = organizationName
34-
cert.get_subject().OU = organizationUnitName
35-
cert.get_subject().CN = commonName
36-
cert.get_subject().emailAddress = emailAddress
37-
cert.set_serial_number(serialNumber)
38-
cert.gmtime_adj_notBefore(0)
39-
cert.gmtime_adj_notAfter(validityEndInSeconds)
40-
cert.set_issuer(cert.get_subject())
41-
cert.set_pubkey(k)
42-
cert.sign(k, 'sha512')
29+
cert = create_self_signed_certificate(common_name, country_name, email_address, private_key, locality_name,
30+
organization_name,
31+
organization_unit_name, serial_number, state_or_province_name,
32+
validity_end_in_seconds, validity_start_in_seconds)
4333

4434
with tempfile.NamedTemporaryFile() as certificate_file:
4535
with tempfile.NamedTemporaryFile() as key_file:
4636
certificate_file.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
4737
certificate_file.flush()
4838

49-
key_file.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))
39+
key_file.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, private_key))
5040
key_file.flush()
5141

5242
yield certificate_file.name, key_file.name
43+
44+
45+
def create_key():
46+
k = crypto.PKey()
47+
k.generate_key(crypto.TYPE_RSA, 4096)
48+
return k
49+
50+
51+
def create_self_signed_certificate(common_name, country_name, email_address, private_key, locality_name,
52+
organization_name,
53+
organization_unit_name, serial_number, state_or_province_name,
54+
validity_end_in_seconds, validity_start_in_seconds):
55+
cert = crypto.X509()
56+
cert.get_subject().C = country_name
57+
cert.get_subject().ST = state_or_province_name
58+
cert.get_subject().L = locality_name
59+
cert.get_subject().O = organization_name
60+
cert.get_subject().OU = organization_unit_name
61+
cert.get_subject().CN = common_name
62+
cert.get_subject().emailAddress = email_address
63+
cert.set_serial_number(serial_number)
64+
cert.gmtime_adj_notBefore(validity_start_in_seconds)
65+
cert.gmtime_adj_notAfter(validity_end_in_seconds)
66+
cert.set_issuer(cert.get_subject())
67+
cert.set_pubkey(private_key)
68+
cert.sign(private_key, 'sha512')
69+
return cert

examples/server_aiohttp_websocket.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import asyncclick as click
55
from aiohttp import web
66

7-
from examples.fixtures import cert_gen
7+
from examples.fixtures import generate_certificate_and_key
88
from rsocket.helpers import create_future
99
from rsocket.local_typing import Awaitable
1010
from rsocket.payload import Payload
@@ -42,7 +42,7 @@ async def start_server(with_ssl: bool, port: int):
4242
if with_ssl:
4343
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
4444

45-
with cert_gen() as (certificate, key):
45+
with generate_certificate_and_key() as (certificate, key):
4646
ssl_context.load_cert_chain(certificate, key)
4747
else:
4848
ssl_context = None

examples/server_with_routing.py

+11-8
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from aiohttp import web
1010

1111
from examples.example_fixtures import large_data1
12-
from examples.fixtures import cert_gen
12+
from examples.fixtures import generate_certificate_and_key
1313
from examples.response_channel import response_stream_1, LoggingSubscriber
1414
from response_stream import response_stream_2
1515
from rsocket.extensions.authentication import Authentication, AuthenticationSimple
@@ -136,15 +136,18 @@ async def start_server(with_ssl: bool, port: int, transport: str):
136136
app = web.Application()
137137
app.add_routes([web.get('/', websocket_handler_factory(handler_factory=handler_factory))])
138138

139-
if with_ssl:
140-
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
139+
with generate_certificate_and_key() as (certificate_path, key_path):
140+
if with_ssl:
141+
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
141142

142-
with cert_gen() as (certificate, key):
143-
ssl_context.load_cert_chain(certificate, key)
144-
else:
145-
ssl_context = None
143+
logging.info('Certificate %s', certificate_path)
144+
logging.info('Private-key %s', key_path)
146145

147-
await web._run_app(app, port=port, ssl_context=ssl_context)
146+
ssl_context.load_cert_chain(certificate_path, key_path)
147+
else:
148+
ssl_context = None
149+
150+
await web._run_app(app, port=port, ssl_context=ssl_context)
148151
elif transport == 'tcp':
149152

150153
server = await asyncio.start_server(handle_client, 'localhost', port)

0 commit comments

Comments
 (0)