@Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { return getDelegate().writeWith(body); }
@Override public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { return getDelegate().writeWith(body); }
@Override public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) { return response.writeWith(request.getBody()); } }
@Override public Mono<Void> render(@Nullable Map<String, ?> model, @Nullable MediaType contentType, ServerWebExchange exchange) { StringBuilder builder = new StringBuilder(); builder.append("name=").append(this.name).append('\n'); for (Map.Entry<String, ?> entry : model.entrySet()) { builder.append(entry.getKey()).append('=').append(entry.getValue()).append('\n'); } builder.setLength(builder.length() - 1); byte[] bytes = builder.toString().getBytes(StandardCharsets.UTF_8); ServerHttpResponse response = exchange.getResponse(); DataBuffer buffer = response.bufferFactory().wrap(bytes); response.getHeaders().setContentType(MediaType.TEXT_PLAIN); return response.writeWith(Mono.just(buffer)); } }
@Override public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) { Exception error = new UnsupportedOperationException(); String path = request.getURI().getPath(); if (path.endsWith("response-body-error")) { return response.writeWith(Mono.error(error)); } else if (path.endsWith("handling-error")) { return Mono.error(error); } else { return Mono.empty(); } } }
@Override public Mono<Void> render(@Nullable Map<String, ?> model, @Nullable MediaType mediaType, ServerWebExchange exchange) { ServerHttpResponse response = exchange.getResponse(); if (mediaType != null) { response.getHeaders().setContentType(mediaType); } model = new TreeMap<>(model); String value = this.name + ": " + model.toString(); ByteBuffer byteBuffer = ByteBuffer.wrap(value.getBytes(UTF_8)); DataBuffer dataBuffer = new DefaultDataBufferFactory().wrap(byteBuffer); return response.writeWith(Flux.just(dataBuffer)); } }
@Override protected WebHttpHandlerBuilder initHttpHandlerBuilder() { return WebHttpHandlerBuilder.webHandler(exchange -> { DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); String text = exchange.getAttributes().toString(); DataBuffer buffer = factory.wrap(text.getBytes(StandardCharsets.UTF_8)); return exchange.getResponse().writeWith(Mono.just(buffer)); }); } }
@Bean public SimpleUrlHandlerMapping handlerMapping() { return new SimpleUrlHandlerMapping() { { Map<String, Object> map = new HashMap<>(); map.put("/foo", (WebHandler) exchange -> exchange.getResponse().writeWith(Flux.just(asDataBuffer("foo")))); map.put("/bar", (WebHandler) exchange -> exchange.getResponse().writeWith(Flux.just(asDataBuffer("bar")))); map.put("/header", (WebHandler) exchange -> { exchange.getResponse().getHeaders().add("foo", "bar"); return Mono.empty(); }); setUrlMap(map); } }; }
@Override public Mono<Void> handleResult(ServerWebExchange exchange, HandlerResult result) { byte[] bytes = ((String) result.getReturnValue()).getBytes(StandardCharsets.UTF_8); DataBuffer dataBuffer = new DefaultDataBufferFactory().wrap(bytes); return exchange.getResponse().writeWith(Mono.just(dataBuffer)); } }
private static Mono<Void> writeToResponse(ServerWebExchange exchange, String value) { byte[] bytes = value.getBytes(StandardCharsets.UTF_8); DataBuffer buffer = new DefaultDataBufferFactory().wrap(bytes); return exchange.getResponse().writeWith(Flux.just(buffer)); }
@Override protected Mono<Void> renderInternal(Map<String, Object> renderAttributes, @Nullable MediaType contentType, ServerWebExchange exchange) { // Expose all standard FreeMarker hash models. SimpleHash freeMarkerModel = getTemplateModel(renderAttributes, exchange); if (logger.isDebugEnabled()) { logger.debug(exchange.getLogPrefix() + "Rendering [" + getUrl() + "]"); } Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext()); DataBuffer dataBuffer = exchange.getResponse().bufferFactory().allocateBuffer(); try { Charset charset = getCharset(contentType); Writer writer = new OutputStreamWriter(dataBuffer.asOutputStream(), charset); getTemplate(locale).process(freeMarkerModel, writer); } catch (IOException ex) { DataBufferUtils.release(dataBuffer); String message = "Could not load FreeMarker template for URL [" + getUrl() + "]"; return Mono.error(new IllegalStateException(message, ex)); } catch (Throwable ex) { DataBufferUtils.release(dataBuffer); return Mono.error(ex); } return exchange.getResponse().writeWith(Flux.just(dataBuffer)); }
@Override public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) { return response.writeWith(Flux.just("h", "e", "l", "l", "o") .delayElements(Duration.ofMillis(100)) .publishOn(asyncGroup) .collect(dataBufferFactory::allocateBuffer, (buffer, str) -> buffer.write(str.getBytes()))); } }
Mono<Void> responseMonoVoid(ServerHttpResponse response) { return Mono.delay(Duration.ofMillis(100)) .thenEmpty(Mono.defer(() -> response.writeWith(getBody("body")))); }
Mono<Void> exchangeMonoVoid(ServerWebExchange exchange) { return Mono.delay(Duration.ofMillis(100)) .thenEmpty(Mono.defer(() -> exchange.getResponse().writeWith(getBody("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()); } }
@Test public void testWebFilter() throws Exception { WebFilter filter = (exchange, chain) -> { DataBuffer buffer = new DefaultDataBufferFactory().allocateBuffer(); buffer.write("It works!".getBytes(StandardCharsets.UTF_8)); return exchange.getResponse().writeWith(Mono.just(buffer)); }; WebTestClient client = WebTestClient.bindToWebHandler(exchange -> Mono.empty()) .webFilter(filter) .build(); client.get().uri("/") .exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo("It works!"); }
@Test public void adaptResponse() throws Exception { ResponseCookie cookie = ResponseCookie.from("custom-cookie", "c0").build(); TestHttpHandler handler = new TestHttpHandler(response -> { response.setStatusCode(HttpStatus.OK); response.getHeaders().put("custom-header", Arrays.asList("h0", "h1")); response.addCookie(cookie); return response.writeWith(Mono.just(toDataBuffer("Custom body"))); }); ClientHttpResponse response = new HttpHandlerConnector(handler) .connect(HttpMethod.GET, URI.create("/custom-path"), ReactiveHttpOutputMessage::setComplete) .block(Duration.ofSeconds(5)); assertEquals(HttpStatus.OK, response.getStatusCode()); HttpHeaders headers = response.getHeaders(); assertEquals(Arrays.asList("h0", "h1"), headers.get("custom-header")); assertEquals(cookie, response.getCookies().getFirst("custom-cookie")); assertEquals(Collections.singletonList("custom-cookie=c0"), headers.get(HttpHeaders.SET_COOKIE)); DataBuffer buffer = response.getBody().blockFirst(Duration.ZERO); assertEquals("Custom body", DataBufferTestUtils.dumpString(buffer, UTF_8)); }
@Override public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) { Mono<Integer> requestSizeMono = request.getBody(). reduce(0, (integer, dataBuffer) -> integer + dataBuffer.readableByteCount()). doOnSuccessOrError((size, throwable) -> { assertNull(throwable); assertEquals(REQUEST_SIZE, (long) size); }); response.getHeaders().setContentLength(RESPONSE_SIZE); return requestSizeMono.then(response.writeWith(multipleChunks())); }
@Test public void responseBodyContentWithFluxExchangeResult() { FluxExchangeResult<String> result = WebTestClient .bindToWebHandler(exchange -> { ServerHttpResponse response = exchange.getResponse(); response.getHeaders().setContentType(MediaType.TEXT_PLAIN); return response.writeWith(Flux.just(toDataBuffer("body"))); }) .build() .get().uri("/") .exchange() .expectStatus().isOk() .returnResult(String.class); // Get the raw content without consuming the response body flux.. byte[] bytes = result.getResponseBodyContent(); assertNotNull(bytes); assertEquals("body", new String(bytes, UTF_8)); }
@Test // SPR-15674 (in comments) public void mutateDoesNotCreateNewSession() { WebTestClient client = WebTestClient .bindToWebHandler(exchange -> { if (exchange.getRequest().getURI().getPath().equals("/set")) { return exchange.getSession() .doOnNext(session -> session.getAttributes().put("foo", "bar")) .then(); } else { return exchange.getSession() .map(session -> session.getAttributeOrDefault("foo", "none")) .flatMap(value -> { DataBuffer buffer = toDataBuffer(value); return exchange.getResponse().writeWith(Mono.just(buffer)); }); } }) .build(); // Set the session attribute EntityExchangeResult<Void> result = client.get().uri("/set").exchange() .expectStatus().isOk().expectBody().isEmpty(); ResponseCookie session = result.getResponseCookies().getFirst("SESSION"); // Now get attribute client.mutate().build() .get().uri("/get") .cookie(session.getName(), session.getValue()) .exchange() .expectBody(String.class).isEqualTo("bar"); }