44from contextlib import asynccontextmanager
55from dataclasses import dataclass
66from 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
910import aiohttp
1011import asyncclick as click
2122from rsocket .transports .abstract_messaging import AbstractMessagingTransport
2223from rsocket .transports .aiohttp_websocket import TransportAioHttpClient
2324from 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
259277def parse_headers (http_headers ):
@@ -278,11 +296,10 @@ def normalize_metadata_mime_type(composite_items, metadata_mime_type):
278296
279297def 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
288305def 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
0 commit comments