def test_tag_composite_metadata_too_long(): routing = RoutingMetadata(tags=[('some data too long %s' % ''.join(['x'] * 256)).encode()]) composite_metadata = CompositeMetadata() composite_metadata.items.append(routing) with pytest.raises(RSocketError): composite_metadata.serialize()
def test_data_mime_type_composite_metadata(): data = composite(data_mime_type(WellKnownMimeTypes.APPLICATION_JSON)) composite_metadata = CompositeMetadata() composite_metadata.parse(data) assert len(composite_metadata.items) == 1 assert composite_metadata.items[0].data_encoding == b'application/json' assert composite_metadata.serialize() == data
def test_data_mime_types_composite_metadata(): data = composite( data_mime_types(WellKnownMimeTypes.APPLICATION_JSON, WellKnownMimeTypes.TEXT_XML)) composite_metadata = CompositeMetadata() composite_metadata.parse(data) assert len(composite_metadata.items) == 1 assert composite_metadata.items[0].data_encodings[0] == b'application/json' assert composite_metadata.items[0].data_encodings[1] == b'text/xml' assert composite_metadata.serialize() == data
def test_basic_composite_metadata_item(): data = build_frame( bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.TEXT_PLAIN.value.id, 'Mime ID'), bits(24, 9, 'Metadata length'), data_bits(b'some data')) composite_metadata = CompositeMetadata() composite_metadata.parse(data) assert composite_metadata.items[0].content == b'some data' serialized = composite_metadata.serialize() assert data == serialized
async def test_composite_metadata_multiple_items(): data = build_frame( bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_ROUTING.value.id, 'Mime ID'), bits(24, 12, 'Metadata length'), bits(8, 11, 'Tag Length'), data_bits(b'target.path'), bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_MIMETYPE.value.id, 'Mime ID'), bits(24, 1, 'Metadata length'), bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.TEXT_CSS.value.id, 'Mime ID'), bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_MIMETYPE.value.id, 'Mime ID'), bits(24, 26, 'Metadata length'), bits(1, 0, 'Not well known metadata type'), bits(7, 24, 'Encoding length'), data_bits(b'some-custom-encoding/type'), bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_AUTHENTICATION.value.id, 'Mime ID'), bits(24, 19, 'Metadata length'), bits(1, 1, 'Well known authentication type'), bits(7, WellKnownAuthenticationTypes.SIMPLE.value.id, 'Authentication ID'), bits(16, 8, 'Username length'), data_bits(b'username'), data_bits(b'password')) composite_metadata = CompositeMetadata() composite_metadata.parse(data) assert composite_metadata.items[ 0].encoding == b'message/x.rsocket.routing.v0' assert composite_metadata.items[0].tags == [b'target.path'] assert composite_metadata.items[ 1].encoding == b'message/x.rsocket.mime-type.v0' assert composite_metadata.items[1].data_encoding == b'text/css' assert composite_metadata.items[ 2].encoding == b'message/x.rsocket.mime-type.v0' assert composite_metadata.items[ 2].data_encoding == b'some-custom-encoding/type' assert composite_metadata.items[ 3].encoding == b'message/x.rsocket.authentication.v0' assert composite_metadata.items[3].authentication.username == b'username' assert composite_metadata.items[3].authentication.password == b'password' assert composite_metadata.serialize() == data
async def test_request_channel_frame(frame_parser, follows, complete): data = build_frame( bits(24, 32, 'Frame size'), bits(1, 0, 'Padding'), bits(31, 15, 'Stream id'), bits(6, FrameType.REQUEST_CHANNEL.value, 'Frame type'), # Flags bits(1, 0, 'Ignore'), bits(1, 1, 'Metadata'), bits(1, follows, 'Follows'), bits(1, complete, 'Complete'), bits(6, 0, 'Empty flags'), bits(1, 0, 'Padding'), bits(31, 10, 'Initial request N'), # Metadata bits(24, 16, 'Metadata length'), # Composite metadata bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_ROUTING.value.id, 'Mime ID'), bits(24, 12, 'Metadata length'), bits(8, 11, 'Tag Length'), data_bits(b'target.path'), # Payload data_bits(b'\x01\x02\x03'), ) frames = await asyncstdlib.builtins.list(frame_parser.receive_data(data)) frame = frames[0] assert isinstance(frame, RequestChannelFrame) assert serialize_with_frame_size_header(frame) == data assert frame.data == b'\x01\x02\x03' assert frame.flags_follows == bool(follows) assert frame.flags_complete == bool(complete) assert frame.stream_id == 15 assert frame.frame_type is FrameType.REQUEST_CHANNEL composite_metadata = CompositeMetadata() composite_metadata.parse(frame.metadata) assert composite_metadata.items[ 0].encoding == b'message/x.rsocket.routing.v0' assert composite_metadata.items[0].tags == [b'target.path'] assert composite_metadata.serialize() == frame.metadata
async def test_authentication_frame_bearer(): data = build_frame( bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_AUTHENTICATION.value.id, 'Mime ID'), bits(24, 9, 'Metadata length'), bits(1, 1, 'Well known authentication type'), bits(7, WellKnownAuthenticationTypes.BEARER.value.id, 'Authentication ID'), data_bits(b'abcd1234')) composite_metadata = CompositeMetadata() composite_metadata.parse(data) auth = composite_metadata.items[0].authentication assert auth.token == b'abcd1234' serialized_data = composite_metadata.serialize() assert serialized_data == data
async def main(server_port): completion_event = Event() class Subscriber(DefaultSubscriber): def __init__(self): super().__init__() self.values = [] self.subscription: Optional[Subscription] = None def on_next(self, value, is_complete=False): self.values.append(value) self.subscription.request(1) def on_complete(self): completion_event.set() def on_error(self, exception: Exception): completion_event.set() connection = await asyncio.open_connection('localhost', server_port) async with RSocketClient(single_transport_provider( TransportTCP(*connection)), metadata_encoding=WellKnownMimeTypes. MESSAGE_RSOCKET_COMPOSITE_METADATA.value.name, data_encoding=WellKnownMimeTypes.APPLICATION_JSON. value.name) as client: metadata = CompositeMetadata() metadata.append( RoutingMetadata(['investigation.getInvestigationByContext'])) body = json.dumps({'active': True}).encode() request = Payload(body, metadata.serialize()) subscriber = Subscriber() client.request_stream(request).subscribe(subscriber) await completion_event.wait() await asyncio.sleep(4) # Used to show keepalive is working assert len(subscriber.values) == 2
async def test_authentication_frame_simple(): data = build_frame( bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_AUTHENTICATION.value.id, 'Mime ID'), bits(24, 19, 'Metadata length'), bits(1, 1, 'Well known authentication type'), bits(7, WellKnownAuthenticationTypes.SIMPLE.value.id, 'Authentication ID'), bits(16, 8, 'Username length'), data_bits(b'username'), data_bits(b'password')) composite_metadata = CompositeMetadata() composite_metadata.parse(data) auth = composite_metadata.items[0].authentication assert auth.username == b'username' assert auth.password == b'password' serialized_data = composite_metadata.serialize() assert serialized_data == data
def test_metadata_authentication_bearer(): metadata = build_frame( bits(1, 1, 'Well known metadata type'), bits(7, WellKnownMimeTypes.MESSAGE_RSOCKET_AUTHENTICATION.value.id, 'Mime ID'), bits(24, 6, 'Metadata length'), bits(1, 1, 'Well known authentication type'), bits(7, WellKnownAuthenticationTypes.BEARER.value.id, 'Authentication ID'), data_bits(b'12345'), ) composite_metadata = CompositeMetadata() composite_metadata.parse(metadata) assert composite_metadata.items[0].authentication.token == b'12345' assert composite_metadata.serialize() == metadata metadata_from_helper = composite(authenticate_bearer('12345')) assert metadata_from_helper == metadata
def composite(*items) -> bytes: metadata = CompositeMetadata() metadata.extend(*items) return metadata.serialize()