@Override public NettyDataBuffer write(DataBuffer... buffers) { if (!ObjectUtils.isEmpty(buffers)) { if (hasNettyDataBuffers(buffers)) { ByteBuf[] nativeBuffers = new ByteBuf[buffers.length]; for (int i = 0; i < buffers.length; i++) { nativeBuffers[i] = ((NettyDataBuffer) buffers[i]).getNativeBuffer(); } write(nativeBuffers); } else { ByteBuffer[] byteBuffers = new ByteBuffer[buffers.length]; for (int i = 0; i < buffers.length; i++) { byteBuffers[i] = buffers[i].asByteBuffer(); } write(byteBuffers); } } return this; }
/** * {@inheritDoc} * <p>This implementation uses Netty's {@link CompositeByteBuf}. */ @Override public DataBuffer join(List<? extends DataBuffer> dataBuffers) { Assert.notEmpty(dataBuffers, "DataBuffer List must not be empty"); int bufferCount = dataBuffers.size(); if (bufferCount == 1) { return dataBuffers.get(0); } CompositeByteBuf composite = this.byteBufAllocator.compositeBuffer(bufferCount); for (DataBuffer dataBuffer : dataBuffers) { Assert.isInstanceOf(NettyDataBuffer.class, dataBuffer); composite.addComponent(true, ((NettyDataBuffer) dataBuffer).getNativeBuffer()); } return new NettyDataBuffer(composite, this); }
/** * Return the given Netty {@link DataBuffer} as a {@link ByteBuf}. * <p>Returns the {@linkplain NettyDataBuffer#getNativeBuffer() native buffer} * if {@code buffer} is a {@link NettyDataBuffer}; returns * {@link Unpooled#wrappedBuffer(ByteBuffer)} otherwise. * @param buffer the {@code DataBuffer} to return a {@code ByteBuf} for * @return the netty {@code ByteBuf} */ public static ByteBuf toByteBuf(DataBuffer buffer) { if (buffer instanceof NettyDataBuffer) { return ((NettyDataBuffer) buffer).getNativeBuffer(); } else { return Unpooled.wrappedBuffer(buffer.asByteBuffer()); } }
/** * Wrap the given Netty {@link ByteBuf} in a {@code NettyDataBuffer}. * @param byteBuf the Netty byte buffer to wrap * @return the wrapped buffer */ public NettyDataBuffer wrap(ByteBuf byteBuf) { return new NettyDataBuffer(byteBuf, this); }
@Test // SPR-17054 public void unsupportedMediaTypeShouldConsumeAndCancel() { NettyDataBufferFactory factory = new NettyDataBufferFactory(new PooledByteBufAllocator(true)); NettyDataBuffer buffer = factory.wrap(ByteBuffer.wrap("spring".getBytes(StandardCharsets.UTF_8))); TestPublisher<DataBuffer> body = TestPublisher.create(); MockClientHttpResponse response = new MockClientHttpResponse(HttpStatus.OK); response.getHeaders().setContentType(MediaType.APPLICATION_PDF); response.setBody(body.flux()); BodyExtractor<Mono<User>, ReactiveHttpInputMessage> extractor = BodyExtractors.toMono(User.class); StepVerifier.create(extractor.extract(response, this.context)) .then(() -> { body.assertWasSubscribed(); body.emit(buffer); }) .expectErrorSatisfies(throwable -> { assertTrue(throwable instanceof UnsupportedMediaTypeException); try { buffer.release(); Assert.fail("releasing the buffer should have failed"); } catch (IllegalReferenceCountException exc) { } body.assertCancelled(); }).verify(); }
/** * Return the given Netty {@link DataBuffer} as a {@link ByteBuf}. * <p>Returns the {@linkplain NettyDataBuffer#getNativeBuffer() native buffer} * if {@code buffer} is a {@link NettyDataBuffer}; returns * {@link Unpooled#wrappedBuffer(ByteBuffer)} otherwise. * @param buffer the {@code DataBuffer} to return a {@code ByteBuf} for * @return the netty {@code ByteBuf} */ public static ByteBuf toByteBuf(DataBuffer buffer) { if (buffer instanceof NettyDataBuffer) { return ((NettyDataBuffer) buffer).getNativeBuffer(); } else { return Unpooled.wrappedBuffer(buffer.asByteBuffer()); } }
@Override public DataBuffer wrap(byte[] bytes) { ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes); return new NettyDataBuffer(byteBuf, this); }
@Override public NettyDataBuffer write(DataBuffer... buffers) { if (!ObjectUtils.isEmpty(buffers)) { if (hasNettyDataBuffers(buffers)) { ByteBuf[] nativeBuffers = new ByteBuf[buffers.length]; for (int i = 0; i < buffers.length; i++) { nativeBuffers[i] = ((NettyDataBuffer) buffers[i]).getNativeBuffer(); } write(nativeBuffers); } else { ByteBuffer[] byteBuffers = new ByteBuffer[buffers.length]; for (int i = 0; i < buffers.length; i++) { byteBuffers[i] = buffers[i].asByteBuffer(); } write(byteBuffers); } } return this; }
private static void assertReleased(DataBuffer dataBuffer) { if (dataBuffer instanceof NettyDataBuffer) { ByteBuf byteBuf = ((NettyDataBuffer) dataBuffer).getNativeBuffer(); assertEquals(0, byteBuf.refCnt()); } }
/** * {@inheritDoc} * <p>This implementation uses Netty's {@link CompositeByteBuf}. */ @Override public DataBuffer join(List<? extends DataBuffer> dataBuffers) { Assert.notEmpty(dataBuffers, "DataBuffer List must not be empty"); int bufferCount = dataBuffers.size(); if (bufferCount == 1) { return dataBuffers.get(0); } CompositeByteBuf composite = this.byteBufAllocator.compositeBuffer(bufferCount); for (DataBuffer dataBuffer : dataBuffers) { Assert.isInstanceOf(NettyDataBuffer.class, dataBuffer); composite.addComponent(true, ((NettyDataBuffer) dataBuffer).getNativeBuffer()); } return new NettyDataBuffer(composite, this); }
@Override public NettyDataBuffer allocateBuffer() { ByteBuf byteBuf = this.byteBufAllocator.buffer(); return new NettyDataBuffer(byteBuf, this); }
@Override public NettyDataBuffer write(DataBuffer... buffers) { if (!ObjectUtils.isEmpty(buffers)) { if (hasNettyDataBuffers(buffers)) { ByteBuf[] nativeBuffers = new ByteBuf[buffers.length]; for (int i = 0; i < buffers.length; i++) { nativeBuffers[i] = ((NettyDataBuffer) buffers[i]).getNativeBuffer(); } write(nativeBuffers); } else { ByteBuffer[] byteBuffers = new ByteBuffer[buffers.length]; for (int i = 0; i < buffers.length; i++) { byteBuffers[i] = buffers[i].asByteBuffer(); } write(byteBuffers); } } return this; }
/** * Converts a {@link DataBuffer} into an {@link HttpData}. */ HttpData toHttpData(DataBuffer dataBuffer) { if (dataBuffer instanceof NettyDataBuffer) { return new ByteBufHttpData(((NettyDataBuffer) dataBuffer).getNativeBuffer(), false); } if (dataBuffer instanceof DefaultDataBuffer) { return new ByteBufHttpData( Unpooled.wrappedBuffer(((DefaultDataBuffer) dataBuffer).getNativeBuffer()), false); } return new ByteBufHttpData(Unpooled.wrappedBuffer(dataBuffer.asByteBuffer()), false); }
/** * {@inheritDoc} * <p>This implementation uses Netty's {@link CompositeByteBuf}. */ @Override public DataBuffer join(List<? extends DataBuffer> dataBuffers) { Assert.notNull(dataBuffers, "'dataBuffers' must not be null"); CompositeByteBuf composite = this.byteBufAllocator.compositeBuffer(dataBuffers.size()); for (DataBuffer dataBuffer : dataBuffers) { Assert.isInstanceOf(NettyDataBuffer.class, dataBuffer); composite.addComponent(true, ((NettyDataBuffer) dataBuffer).getNativeBuffer()); } return new NettyDataBuffer(composite, this); }
@Override public NettyDataBuffer wrap(ByteBuffer byteBuffer) { ByteBuf byteBuf = Unpooled.wrappedBuffer(byteBuffer); return new NettyDataBuffer(byteBuf, this); }
@Override public NettyDataBuffer write(DataBuffer... buffers) { Assert.notNull(buffers, "'buffers' must not be null"); if (buffers.length > 0) { if (hasNettyDataBuffers(buffers)) { ByteBuf[] nativeBuffers = new ByteBuf[buffers.length]; for (int i = 0 ; i < buffers.length; i++) { nativeBuffers[i] = ((NettyDataBuffer) buffers[i]).getNativeBuffer(); } write(nativeBuffers); } else { ByteBuffer[] byteBuffers = new ByteBuffer[buffers.length]; for (int i = 0 ; i < buffers.length; i++) { byteBuffers[i] = buffers[i].asByteBuffer(); } write(byteBuffers); } } return this; }
@Test public void usingNettyDataBufferFactory_ByteBufHttpData() { final DataBufferFactoryWrapper<?> wrapper = new DataBufferFactoryWrapper<>(new NettyDataBufferFactory(UnpooledByteBufAllocator.DEFAULT)); final ByteBufHttpData httpData1 = new ByteBufHttpData(Unpooled.wrappedBuffer("abc".getBytes()), false); final DataBuffer buffer = wrapper.toDataBuffer(httpData1); assertThat(buffer).isInstanceOf(NettyDataBuffer.class); assertThat(((NettyDataBuffer) buffer).getNativeBuffer().refCnt()).isOne(); final HttpData httpData2 = wrapper.toHttpData(buffer); assertThat(httpData2).isInstanceOf(ByteBufHttpData.class); assertThat(((ByteBufHttpData) httpData2).content()) .isEqualTo(((NettyDataBuffer) buffer).getNativeBuffer()); assertThat(((ByteBufHttpData) httpData2).refCnt()).isOne(); }
/** * {@inheritDoc} * <p>This implementation uses Netty's {@link CompositeByteBuf}. */ @Override public DataBuffer join(List<? extends DataBuffer> dataBuffers) { Assert.notEmpty(dataBuffers, "DataBuffer List must not be empty"); int bufferCount = dataBuffers.size(); if (bufferCount == 1) { return dataBuffers.get(0); } CompositeByteBuf composite = this.byteBufAllocator.compositeBuffer(bufferCount); for (DataBuffer dataBuffer : dataBuffers) { Assert.isInstanceOf(NettyDataBuffer.class, dataBuffer); composite.addComponent(true, ((NettyDataBuffer) dataBuffer).getNativeBuffer()); } return new NettyDataBuffer(composite, this); }
@Override public NettyDataBuffer allocateBuffer(int initialCapacity) { ByteBuf byteBuf = this.byteBufAllocator.buffer(initialCapacity); return new NettyDataBuffer(byteBuf, this); }
@Test public void usingNettyDataBufferFactory_HttpData() { final DataBufferFactoryWrapper<?> wrapper = new DataBufferFactoryWrapper<>(new NettyDataBufferFactory(UnpooledByteBufAllocator.DEFAULT)); final HttpData httpData1 = HttpData.ofUtf8("abc"); final DataBuffer buffer = wrapper.toDataBuffer(httpData1); assertThat(buffer).isInstanceOf(NettyDataBuffer.class); assertThat(((NettyDataBuffer) buffer).getNativeBuffer().refCnt()).isOne(); final HttpData httpData2 = wrapper.toHttpData(buffer); assertThat(httpData2).isInstanceOf(ByteBufHttpData.class); assertThat(((ByteBufHttpData) httpData2).content()) .isEqualTo(((NettyDataBuffer) buffer).getNativeBuffer()); assertThat(((ByteBufHttpData) httpData2).refCnt()).isOne(); }