/** * 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(); }