@Override public Flux<DataBuffer> getBody() { return this.request.receive().retain().map(this.bufferFactory::wrap); }
@Override public Flux<DataBuffer> getBody() { return this.request.receive().retain().map(this.bufferFactory::wrap); }
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // NOTICE: nothing in "pre" filter stage as CLIENT_RESPONSE_CONN_ATTR is not added // until the NettyRoutingFilter is run return chain.filter(exchange).then(Mono.defer(() -> { Connection connection = exchange.getAttribute(CLIENT_RESPONSE_CONN_ATTR); if (connection == null) { return Mono.empty(); } log.trace("NettyWriteResponseFilter start"); ServerHttpResponse response = exchange.getResponse(); NettyDataBufferFactory factory = (NettyDataBufferFactory) response.bufferFactory(); //TODO: what if it's not netty final Flux<NettyDataBuffer> body = connection.inbound().receive() .retain() //TODO: needed? .map(factory::wrap); MediaType contentType = null; try { contentType = response.getHeaders().getContentType(); } catch (Exception e) { log.trace("invalid media type", e); } return (isStreamingMediaType(contentType) ? response.writeAndFlushWith(body.map(Flux::just)) : response.writeWith(body)); })); }
@Override public Flux<Frame> receive() { return connection.inbound().receive().map(buf -> Frame.from(buf.retain())); }
@Override public Flux<Frame> receive() { return connection .inbound() .receive() .map( buf -> { CompositeByteBuf composite = connection.channel().alloc().compositeBuffer(); ByteBuf length = wrappedBuffer(new byte[FRAME_LENGTH_SIZE]); FrameHeaderFlyweight.encodeLength(length, 0, buf.readableBytes()); composite.addComponents(true, length, buf.retain()); return Frame.from(composite); }); }
@Override public Flux<DataBuffer> getBody() { // 5.0.x only: do not retain, make a copy.. return this.request.receive().map(byteBuf -> { byte[] data = new byte[byteBuf.readableBytes()]; byteBuf.readBytes(data); return bufferFactory.wrap(data); }); }
@Override public Flux<DataBuffer> getBody() { return this.request.receive().retain().map(this.bufferFactory::wrap); }
@Override public Flux<Frame> receive() { return connection.inbound().receive().map(buf -> Frame.from(buf.retain())); }
@SuppressWarnings("unused") private Mono<Void> onMessage(NettyInbound in, NettyOutbound out) { return in.receive() // .retain() .map(this::toMessage) .doOnNext(messageSink::next) .then(); }
@Override public Flux<Frame> receive() { return connection .inbound() .receive() .map( buf -> { CompositeByteBuf composite = connection.channel().alloc().compositeBuffer(); ByteBuf length = wrappedBuffer(new byte[FRAME_LENGTH_SIZE]); FrameHeaderFlyweight.encodeLength(length, 0, buf.readableBytes()); composite.addComponents(true, length, buf.retain()); return Frame.from(composite); }); }
@Test @Ignore public void testIssue395() throws Exception { BiFunction<HttpServerRequest, HttpServerResponse, Mono<Void>> echoHandler = (req, res) -> res.send(req.receive().map(ByteBuf::retain)).then(); SelfSignedCertificate cert = new SelfSignedCertificate(); SslContextBuilder serverOptions = SslContextBuilder.forServer(cert.certificate(), cert.privateKey()); DisposableServer server = HttpServer.create() .secure(ssl -> ssl.sslContext(serverOptions)) .protocol(HttpProtocol.H2) .handle(echoHandler) .port(8080) .wiretap(true) .bindNow(); new CountDownLatch(1).await(); server.disposeNow(); }