@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)); })); }
/** * Method for receiving request messages coming a form of websocket frames. * * @return flux websocket {@link ByteBuf} */ public Flux<ByteBuf> receive() { return inbound.aggregateFrames().receive().retain(); }
@Override public Flux<DataBuffer> getBody() { return this.request.receive().retain().map(this.bufferFactory::wrap); }
@SuppressWarnings("unused") private Mono<Void> onMessage(NettyInbound in, NettyOutbound out) { return in.receive() // .retain() .map(this::toMessage) .doOnNext(messageSink::next) .then(); }
.aggregateFrames() .receive() .retain() .subscribe( byteBuf -> {
private Mono<Void> proxy(HttpServerRequest request, HttpServerResponse response) { return HttpClient.create() .wiretap(true) .headers(h -> h.add(filterRequestHeaders(request.requestHeaders()))) .get() .uri(URI.create("http://localhost:" + CONTENT_SERVER_PORT + "/" + request.path()) .toString()) .response((targetResponse, buf) -> response.headers(filterResponseHeaders(targetResponse.responseHeaders())) .send(buf.retain()) .then()) .then(); }
@Test public void testIssue525() { DisposableServer disposableServer = HttpServer.create() .port(0) .tcpConfiguration(tcpServer -> tcpServer.doOnConnection(c -> c.addHandlerFirst("decompressor", new HttpContentDecompressor()))) .handle((req, res) -> res.send(req.receive() .retain())) .wiretap(true) .bindNow(Duration.ofSeconds(30)); byte[] bytes = "test".getBytes(Charset.defaultCharset()); String response = HttpClient.create() .port(disposableServer.port()) .wiretap(true) .headers(h -> h.add("Content-Encoding", "gzip")) .post() .uri("/") .send(Mono.just(Unpooled.wrappedBuffer(compress(bytes)))) .responseContent() .aggregate() .asString() .block(Duration.ofSeconds(30)); assertThat(response).isEqualTo("test"); disposableServer.disposeNow(); }
HttpServer.create() .port(0) .handle((req, res) -> res.send(req.receive().retain())) .wiretap(true) .bindNow();
@Test public void testExplicitEmptyBodyOnGetWorks() throws Exception { SelfSignedCertificate ssc = new SelfSignedCertificate(); SslContext sslServer = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()) .build(); SslContext sslClient = SslContextBuilder.forClient() .trustManager(InsecureTrustManagerFactory.INSTANCE) .build(); DisposableServer server = HttpServer.create() .secure(ssl -> ssl.sslContext(sslServer)) .port(0) .handle((req, res) -> res.send(req.receive().retain())) .bindNow(); ConnectionProvider pool = ConnectionProvider.fixed("test", 1); for (int i = 0; i < 4; i++) { StepVerifier.create(createHttpClientForContextWithAddress(server, pool) .secure(ssl -> ssl.sslContext(sslClient)) .request(HttpMethod.GET) .uri("/") .send((req, out) -> out.send(Flux.empty())) .responseContent()) .expectComplete() .verify(Duration.ofSeconds(30)); } pool.dispose(); server.disposeNow(); }