@Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { return getDelegate().writeAndFlushWith(body); }
@Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { return getDelegate().writeAndFlushWith(body); }
@RequestMapping(path = REQUEST_MAPPING_PATH, method = {RequestMethod.GET, RequestMethod.HEAD, RequestMethod.POST, RequestMethod.PUT, RequestMethod.PATCH, RequestMethod.DELETE, RequestMethod.OPTIONS}) public Mono<Void> endpointProxy(@PathVariable("instanceId") String instanceId, ServerHttpRequest request, ServerHttpResponse response) { String endpointLocalPath = getEndpointLocalPath(request.getPath().pathWithinApplication().value()); URI uri = UriComponentsBuilder.fromPath(endpointLocalPath) .query(request.getURI().getRawQuery()) .build(true) .toUri(); return super.forward(instanceId, uri, request.getMethod(), request.getHeaders(), () -> BodyInserters.fromDataBuffers(request.getBody())).flatMap(clientResponse -> { response.setStatusCode(clientResponse.statusCode()); response.getHeaders().addAll(filterHeaders(clientResponse.headers().asHttpHeaders())); return response.writeAndFlushWith(clientResponse.body(BodyExtractors.toDataBuffers()).window(1)); }); } }
@Override public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) { DataBuffer buffer = response.bufferFactory().allocateBuffer(body.length); buffer.write(body); return response.writeAndFlushWith(Flux.just(Flux.just(buffer))); } }
@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 Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) { String path = request.getURI().getPath(); switch (path) { case "/write-and-flush": return response.writeAndFlushWith( testInterval(Duration.ofMillis(50), 2) .map(longValue -> wrap("data" + longValue + "\n", response)) .map(Flux::just) .mergeWith(Flux.never())); case "/write-and-complete": return response.writeWith( chunks1K().take(64).map(s -> wrap(s, response))); case "/write-and-never-complete": // Reactor requires at least 50 to flush, Tomcat/Undertow 8, Jetty 1 return response.writeWith( chunks1K().take(64).map(s -> wrap(s, response)).mergeWith(Flux.never())); default: return response.writeWith(Flux.empty()); } }
@Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { return getDelegate().writeAndFlushWith(body); }
@Override public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) { return getDelegate().writeAndFlushWith(body); }
return response.writeAndFlushWith(Flux.from(stream).window(1));