@Override protected Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<? extends DataBuffer>> publisher) { return this.response.sendGroups(Flux.from(publisher).map(this::toByteBufs)).then(); }
@Override public Mono<Void> writeWith(Path file, long position, long count) { return doCommit(() -> this.outbound.sendFile(file, position, count).then()); }
@Override public Mono<Void> writeWith(Path file, long position, long count) { return doCommit(() -> this.response.sendFile(file, position, count).then()); }
@Override protected Mono<Void> writeWithInternal(Publisher<? extends DataBuffer> publisher) { return this.response.send(toByteBufs(publisher)).then(); }
@Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { return doCommit(() -> { Flux<ByteBuf> byteBufFlux = Flux.from(body).map(NettyDataBufferFactory::toByteBuf); return this.outbound.send(byteBufFlux).then(); }); }
@Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { Publisher<Publisher<ByteBuf>> byteBufs = Flux.from(body).map(ReactorClientHttpRequest::toByteBufs); return doCommit(() -> this.outbound.sendGroups(byteBufs).then()); }
@Override public ListenableFuture<Void> send(Message<P> message) { ByteBuf byteBuf = this.outbound.alloc().buffer(); this.codec.encode(message, byteBuf); Mono<Void> sendCompletion = this.outbound.send(Mono.just(byteBuf)).then(); return new MonoToListenableFutureAdapter<>(sendCompletion); }
@Override protected Mono<Void> writeAndFlushWithInternal(Publisher<? extends Publisher<? extends DataBuffer>> publisher) { return this.response.sendGroups(Flux.from(publisher).map(this::toByteBufs)).then(); }
@Override public Mono<Void> writeWith(Path file, long position, long count) { return doCommit(() -> this.outbound.sendFile(file, position, count).then()); }
@Override public Mono<Void> writeWith(Path file, long position, long count) { return doCommit(() -> this.response.sendFile(file, position, count).then()); }
@Override public Mono<Void> send(Publisher<WebSocketMessage> messages) { Flux<WebSocketFrame> frames = Flux.from(messages) .doOnNext(message -> { if (logger.isTraceEnabled()) { logger.trace(getLogPrefix() + "Sending " + message); } }) .map(this::toFrame); return getDelegate().getOutbound() .options(NettyPipeline.SendOptions::flushOnEach) .sendObject(frames) .then(); }
@Override protected Mono<Void> writeWithInternal(Publisher<? extends DataBuffer> publisher) { return this.response.send(toByteBufs(publisher)).then(); }
@Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { Publisher<Publisher<ByteBuf>> byteBufs = Flux.from(body).map(ReactorClientHttpRequest::toByteBufs); return doCommit(() -> this.outbound.sendGroups(byteBufs).then()); }
@Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { return doCommit(() -> { Flux<ByteBuf> byteBufFlux = Flux.from(body).map(NettyDataBufferFactory::toByteBuf); return this.outbound.send(byteBufFlux).then(); }); }
@Override public ListenableFuture<Void> send(Message<P> message) { ByteBuf byteBuf = this.outbound.alloc().buffer(); this.codec.encode(message, byteBuf); Mono<Void> sendCompletion = this.outbound.send(Mono.just(byteBuf)).then(); return new MonoToListenableFutureAdapter<>(sendCompletion); }
/** * Subscribe a {@code Void} subscriber to this outbound and trigger all eventual * parent outbound send. * * @param s the {@link Subscriber} to listen for send sequence completion/failure */ @Override default void subscribe(Subscriber<? super Void> s) { then().subscribe(s); }
OutboundThen(NettyOutbound source, Publisher<Void> thenPublisher) { this.source = source; Mono<Void> parentMono = source.then(); if (parentMono == Mono.<Void>empty()) { this.thenMono = Mono.from(thenPublisher); } else { this.thenMono = parentMono.thenEmpty(thenPublisher); } }
OutboundThen(NettyOutbound source, Publisher<Void> thenPublisher) { this.source = source; Mono<Void> parentMono = source.then(); if (parentMono == Mono.<Void>empty()) { this.thenMono = Mono.from(thenPublisher); } else { this.thenMono = parentMono.thenEmpty(thenPublisher); } }
@Test public void testDropPublisher() { ByteBuf data = ByteBufAllocator.DEFAULT.buffer(); data.writeCharSequence("test", Charset.defaultCharset()); doTestDropData( (req, res) -> res.header("Content-Length", "0") .send(Mono.fromRunnable(() -> Flux.just(data, data.retain(), data.retain()))) .then() .doOnCancel(() -> ReferenceCountUtil.release(data)), (req, out) -> out); assertThat(ReferenceCountUtil.refCnt(data)).isEqualTo(0); }