private Payload generatePayload(ServiceMessage msg) { try { ByteArrayOutputStream dataStream = new ByteArrayOutputStream(); dataCodec.encode(dataStream, msg.data()); System.out.println("generated dataBuffer: " + dataStream.toString()); ByteBuf dataBuffer = ByteBufAllocator.DEFAULT.buffer(); dataBuffer.writeBytes(dataStream.toByteArray()); ByteArrayOutputStream headersStream = new ByteArrayOutputStream(); headersCodec.encode(headersStream, msg.headers()); System.out.println("generated headersBuffer: " + headersStream.toString()); ByteBuf headersBuffer = ByteBufAllocator.DEFAULT.buffer(); headersBuffer.writeBytes(headersStream.toByteArray()); return ByteBufPayload.create(dataBuffer, headersBuffer); } catch (Throwable t) { throw new RuntimeException(t.getMessage(), t); } }
@Override public Mono<RSocket> accept(ConnectionSetupPayload setup, RSocket rsocket) { LOGGER.info("Accepted rsocket websocket: {}, connectionSetup: {}", rsocket, setup); rsocket .onClose() .doOnTerminate(() -> LOGGER.info("Client disconnected: {}", rsocket)) .subscribe(null, th -> LOGGER.error("Exception on closing rsocket: {}", th)); // Prepare message codec together with headers from metainfo HeadersCodec headersCodec = HeadersCodec.getInstance(setup.metadataMimeType()); ServiceMessageCodec messageCodec = new ServiceMessageCodec(headersCodec); return Mono.just(new GatewayRSocket(serviceCall, metrics, messageCodec)); }
/** * Get a HeadersCodec for a content type. * * @param contentType the content type. * @return a Headers codec for the content type or IllegalArgumentException is thrown if non exist */ static HeadersCodec loadInstance(String contentType) { return ServiceLoaderUtil.findFirst( HeadersCodec.class, codec -> codec.contentType().equalsIgnoreCase(contentType)) .orElseThrow(() -> new IllegalArgumentException("HeadersCodec not configured")); }
/** * Decoder function. Keeps data buffer untouched. * * @param dataBuffer data buffer. * @param headersBuffer headers buffer. * @return client message object. * @throws MessageCodecException in case if decode fails. */ private ClientMessage decode(ByteBuf dataBuffer, ByteBuf headersBuffer) throws MessageCodecException { ClientMessage.Builder builder = ClientMessage.builder(); if (dataBuffer.isReadable()) { builder.data(dataBuffer); } if (headersBuffer.isReadable()) { try (ByteBufInputStream stream = new ByteBufInputStream(headersBuffer, true)) { builder.headers(headersCodec.decode(stream)); } catch (Throwable ex) { ReferenceCountUtil.safestRelease(dataBuffer); // release data as well throw new MessageCodecException("Failed to decode message headers", ex); } } return builder.build(); }
/** * Decode buffers. * * @param dataBuffer the buffer of the data (payload) * @param headersBuffer the buffer of the headers * @return a new Service message with {@link ByteBuf} data and with parsed headers. * @throws MessageCodecException when decode fails */ public ServiceMessage decode(ByteBuf dataBuffer, ByteBuf headersBuffer) throws MessageCodecException { ServiceMessage.Builder builder = ServiceMessage.builder(); if (dataBuffer.isReadable()) { builder.data(dataBuffer); } if (headersBuffer.isReadable()) { try (ByteBufInputStream stream = new ByteBufInputStream(headersBuffer, true)) { builder.headers(headersCodec.decode(stream)); } catch (Throwable ex) { ReferenceCountUtil.safestRelease(dataBuffer); // release data buf as well throw new MessageCodecException("Failed to decode message headers", ex); } } return builder.build(); }
@Override public ServerTransport serverTransport(ServiceTransport.Resources resources) { return new RSocketServerTransport( new ServiceMessageCodec(HeadersCodec.getInstance(DEFAULT_HEADERS_FORMAT)), ((Resources) resources).workerPool); }
headersBuffer = ByteBufAllocator.DEFAULT.buffer(); try { headersCodec.encode(new ByteBufOutputStream(headersBuffer), message.headers()); } catch (Throwable ex) { ReferenceCountUtil.safestRelease(headersBuffer);
@Override public ServerTransport serverTransport(ServiceTransport.Resources resources) { return new RSocketServerTransport( new ServiceMessageCodec(HeadersCodec.getInstance(DEFAULT_HEADERS_FORMAT)), ((Resources) resources).workerPool); }
headersBuffer = ByteBufAllocator.DEFAULT.buffer(); try { headersCodec.encode(new ByteBufOutputStream(headersBuffer), message.headers()); } catch (Throwable ex) { ReferenceCountUtil.safestRelease(headersBuffer);
@Override public ClientTransport clientTransport(ServiceTransport.Resources resources) { return new RSocketClientTransport( new ServiceMessageCodec(HeadersCodec.getInstance(DEFAULT_HEADERS_FORMAT)), DelegatedLoopResources.newClientLoopResources(((Resources) resources).workerPool)); }
@Override public ClientTransport clientTransport(ServiceTransport.Resources resources) { return new RSocketClientTransport( new ServiceMessageCodec(HeadersCodec.getInstance(DEFAULT_HEADERS_FORMAT)), DelegatedLoopResources.newClientLoopResources(((Resources) resources).workerPool)); }
/** * Client on rsocket client transport. * * @param clientSettings client settings * @return client */ public static Client onRSocket(ClientSettings clientSettings) { RSocketClientCodec clientCodec = new RSocketClientCodec( HeadersCodec.getInstance(clientSettings.contentType()), DataCodec.getInstance(clientSettings.contentType())); RSocketClientTransport clientTransport = new RSocketClientTransport(clientSettings, clientCodec, clientSettings.loopResources()); return new Client(clientTransport, clientCodec, clientSettings.errorMapper()); }