Skip to content

Commit 83ff73b

Browse files
committed
cli - refactoring. added timeout option. added some compatibility with rsocket-cli
1 parent 195a295 commit 83ff73b

File tree

2 files changed

+49
-30
lines changed

2 files changed

+49
-30
lines changed

rsocket/cli/command.py

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
from contextlib import asynccontextmanager
55
from dataclasses import dataclass
66
from enum import Enum, unique
7-
from typing import Optional, Type, Collection, List
7+
from importlib.metadata import version as get_version
8+
from typing import Optional, Type, Collection, List, Callable
89

910
import aiohttp
1011
import asyncclick as click
@@ -21,7 +22,6 @@
2122
from rsocket.transports.abstract_messaging import AbstractMessagingTransport
2223
from rsocket.transports.aiohttp_websocket import TransportAioHttpClient
2324
from rsocket.transports.tcp import TransportTCP
24-
from importlib.metadata import version as get_version
2525

2626

2727
@unique
@@ -167,7 +167,7 @@ def get_request_type(request: bool,
167167
help='Fire and Forget')
168168
@click.option('--metadataPush', 'metadata_push', is_flag=True,
169169
help='Metadata Push')
170-
@click.option('-d', '--data', is_flag=False,
170+
@click.option('-d', '--data', '--input', 'data', is_flag=False,
171171
help='Data. Use "-" to read data from standard input. (default: )')
172172
@click.option('-l', '--load', is_flag=False,
173173
help='Load a file as Data. (e.g. ./foo.txt, /tmp/foo.txt)')
@@ -181,26 +181,28 @@ def get_request_type(request: bool,
181181
help='Enable take(n)')
182182
@click.option('-u', '--as', '--authSimple', 'auth_simple', is_flag=False, default=None,
183183
help='Enable Authentication Metadata Extension (Simple). The format must be "username: password"')
184-
@click.option('--sd', '--setupData', 'setup_data', is_flag=False, default=None,
184+
@click.option('--sd', '--setup', '--setupData', 'setup_data', is_flag=False, default=None,
185185
help='Data for Setup payload')
186186
@click.option('--sm', '--setupMetadata', 'setup_metadata', is_flag=False, default=None,
187187
help='Metadata for Setup payload')
188188
@click.option('--ab', '--authBearer', 'auth_bearer', is_flag=False, default=None,
189189
help='Enable Authentication Metadata Extension (Bearer)')
190-
@click.option('--dataMimeType', '--dmt', 'data_mime_type', is_flag=False,
190+
@click.option('--dataMimeType', '--dataFormat', '--dmt', 'data_mime_type', is_flag=False,
191191
help='MimeType for data (default: application/json)')
192-
@click.option('--metadataMimeType', '--mmt', 'metadata_mime_type', is_flag=False,
192+
@click.option('--metadataMimeType', '--metadataFormat', '--mmt', 'metadata_mime_type', is_flag=False,
193193
help='MimeType for metadata (default:application/json)')
194194
@click.option('--allowUntrustedSsl', 'allow_untrusted_ssl', is_flag=True, default=False,
195195
help='Do not verify SSL certificate (for wss:// urls)')
196-
@click.option('--httpHeader', 'http_header', multiple=True,
196+
@click.option('-H', '--header', '--httpHeader', 'http_header', multiple=True,
197197
help='ws/wss headers')
198198
@click.option('--trustCert', 'trust_cert', is_flag=False,
199199
help='PEM file for a trusted certificate. (e.g. ./foo.crt, /tmp/foo.crt)')
200200
@click.option('--debug', is_flag=True,
201201
help='Show debug log')
202202
@click.option('--quiet', '-q', is_flag=True,
203203
help='Disable the output on next')
204+
@click.option('--timeout', 'timeout_seconds', is_flag=False, type=int,
205+
help='Timeout in seconds')
204206
@click.option('--version', is_flag=True,
205207
help='Print version')
206208
@click.argument('uri', required=False)
@@ -209,7 +211,7 @@ async def command(context, data, load,
209211
metadata, route_value, auth_simple, auth_bearer,
210212
limit_rate, take_n, allow_untrusted_ssl,
211213
setup_data, setup_metadata, interaction_model,
212-
http_header, metadata_push,
214+
http_header, metadata_push, timeout_seconds,
213215
data_mime_type, metadata_mime_type,
214216
request, stream, channel, fnf, trust_cert,
215217
uri, debug, version, quiet):
@@ -233,27 +235,43 @@ async def command(context, data, load,
233235
return
234236

235237
request_type = get_request_type(request, stream, fnf, metadata_push, channel, interaction_model)
236-
237238
http_headers = parse_headers(http_header)
238-
239239
composite_items = build_composite_metadata(auth_simple, route_value, auth_bearer)
240+
setup_payload = create_setup_payload(setup_data, setup_metadata)
241+
metadata_value = get_metadata_value(composite_items, metadata)
242+
metadata_mime_type = normalize_metadata_mime_type(composite_items, metadata_mime_type)
243+
parsed_uri = parse_uri(uri)
244+
245+
def payload_provider():
246+
return create_request_payload(data, load, metadata_value)
247+
248+
future = run_request(request_type, limit_rate, payload_provider,
249+
http_headers=http_headers,
250+
allow_untrusted_ssl=allow_untrusted_ssl,
251+
metadata_mime_type=metadata_mime_type,
252+
data_mime_type=data_mime_type,
253+
setup_payload=setup_payload,
254+
trust_cert=trust_cert,
255+
parsed_uri=parsed_uri)
256+
257+
if timeout_seconds is not None:
258+
result = await asyncio.wait_for(future, timeout_seconds)
259+
else:
260+
result = await future
240261

241-
async with create_client(parse_uri(uri),
242-
data_mime_type,
243-
normalize_metadata_mime_type(composite_items, metadata_mime_type),
244-
create_setup_payload(setup_data, setup_metadata),
245-
allow_untrusted_ssl=allow_untrusted_ssl,
246-
http_headers=http_headers,
247-
trust_cert=trust_cert
248-
) as client:
262+
if not quiet:
263+
output_result(result)
249264

250-
result = await execute_request(client,
251-
request_type,
252-
normalize_limit_rate(limit_rate),
253-
create_request_payload(data, load, metadata, composite_items))
254265

255-
if not quiet:
256-
output_result(result)
266+
async def run_request(request_type: RequestType,
267+
limit_rate: Optional[int],
268+
payload_provider: Callable[[], Payload],
269+
**kwargs):
270+
async with create_client(**kwargs) as client:
271+
return await execute_request(client,
272+
request_type,
273+
normalize_limit_rate(limit_rate),
274+
payload_provider())
257275

258276

259277
def parse_headers(http_headers):
@@ -278,11 +296,10 @@ def normalize_metadata_mime_type(composite_items, metadata_mime_type):
278296

279297
def create_request_payload(data: Optional[str],
280298
load: Optional[str],
281-
metadata: Optional[str],
282-
composite_items: List) -> Payload:
299+
metadata: Optional[bytes]) -> Payload:
283300
data = normalize_data(data, load)
284-
metadata_value = get_metadata_value(composite_items, metadata)
285-
return Payload(data, metadata_value)
301+
302+
return Payload(data, metadata)
286303

287304

288305
def output_result(result):
@@ -292,7 +309,9 @@ def output_result(result):
292309
print([p.data.decode('utf-8') for p in result])
293310

294311

295-
async def execute_request(awaitable_client: AwaitableRSocket, request_type: RequestType, limit_rate: int,
312+
async def execute_request(awaitable_client: AwaitableRSocket,
313+
request_type: RequestType,
314+
limit_rate: int,
296315
payload: Payload):
297316
result = None
298317

tests/rsocket/test_cli_command.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def test_build_composite_metadata():
3535

3636
def test_create_request_payload():
3737
payload = create_request_payload(
38-
None, None, None, []
38+
None, None, None
3939
)
4040

4141
assert payload.data is None

0 commit comments

Comments
 (0)