/** * Create a new {@code ServerRequest} based on the given {@code ServerWebExchange} and * message readers. * @param exchange the exchange * @param messageReaders the message readers * @return the created {@code ServerRequest} */ static ServerRequest create(ServerWebExchange exchange, List<HttpMessageReader<?>> messageReaders) { return new DefaultServerRequest(exchange, messageReaders); }
@Override public ServerRequest build() { ServerHttpRequest serverHttpRequest = new BuiltServerHttpRequest(this.exchange.getRequest().getId(), this.methodName, this.uri, this.headers, this.cookies, this.body); ServerWebExchange exchange = new DelegatingServerWebExchange( serverHttpRequest, this.exchange, this.messageReaders); return new DefaultServerRequest(exchange, this.messageReaders); }
/** * Convert the given {@linkplain RouterFunction router function} into a {@link WebHandler}, * using the given strategies. * @param routerFunction the router function to convert * @param strategies the strategies to use * @return a web handler that handles web request using the given router function */ public static WebHandler toWebHandler(RouterFunction<?> routerFunction, HandlerStrategies strategies) { Assert.notNull(routerFunction, "RouterFunction must not be null"); Assert.notNull(strategies, "HandlerStrategies must not be null"); return exchange -> { ServerRequest request = new DefaultServerRequest(exchange, strategies.messageReaders()); addAttributes(exchange, request); return routerFunction.route(request) .defaultIfEmpty(notFound()) .flatMap(handlerFunction -> wrapException(() -> handlerFunction.handle(request))) .flatMap(response -> wrapException(() -> response.writeTo(exchange, new HandlerStrategiesResponseContext(strategies)))); }; }
@Test(expected = IllegalArgumentException.class) public void pathVariableNotFound() { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("http://example.com")); Map<String, String> pathVariables = Collections.singletonMap("foo", "bar"); exchange.getAttributes().put(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables); DefaultServerRequest request = new DefaultServerRequest(exchange, messageReaders); request.pathVariable("baz"); }
@Test public void uriBuilder() throws URISyntaxException { URI uri = new URI("http", "localhost", "/path", "a=1", null); DefaultServerRequest request = new DefaultServerRequest( MockServerWebExchange.from(MockServerHttpRequest.method(HttpMethod.GET, uri)), this.messageReaders); URI result = request.uriBuilder().build(); assertEquals("http", result.getScheme()); assertEquals("localhost", result.getHost()); assertEquals(-1, result.getPort()); assertEquals("/path", result.getPath()); assertEquals("a=1", result.getQuery()); }
@Test public void pathVariables() { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("http://example.com")); Map<String, String> pathVariables = Collections.singletonMap("foo", "bar"); exchange.getAttributes().put(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables); DefaultServerRequest request = new DefaultServerRequest(exchange, messageReaders); assertEquals(pathVariables, request.pathVariables()); }
@Test public void attribute() { MockServerWebExchange exchange = MockServerWebExchange.from( MockServerHttpRequest.method(HttpMethod.GET, "http://example.com")); exchange.getAttributes().put("foo", "bar"); DefaultServerRequest request = new DefaultServerRequest(exchange, messageReaders); assertEquals(Optional.of("bar"), request.attribute("foo")); }
@Test public void pathVariable() { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("http://example.com")); Map<String, String> pathVariables = Collections.singletonMap("foo", "bar"); exchange.getAttributes().put(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, pathVariables); DefaultServerRequest request = new DefaultServerRequest(exchange, messageReaders); assertEquals("bar", request.pathVariable("foo")); }
@Test public void uri() { URI uri = URI.create("https://example.com"); DefaultServerRequest request = new DefaultServerRequest( MockServerWebExchange.from(MockServerHttpRequest.method(HttpMethod.GET, uri)), this.messageReaders); assertEquals(uri, request.uri()); }
@Test public void absentQueryParam() { DefaultServerRequest request = new DefaultServerRequest( MockServerWebExchange.from(MockServerHttpRequest.method(HttpMethod.GET, "http://example.com?foo")), this.messageReaders); assertEquals(Optional.empty(), request.queryParam("bar")); }
@Test public void queryParams() { DefaultServerRequest request = new DefaultServerRequest( MockServerWebExchange.from(MockServerHttpRequest.method(HttpMethod.GET, "http://example.com?foo=bar")), this.messageReaders); assertEquals(Optional.of("bar"), request.queryParam("foo")); }
@Test public void emptyQueryParam() { DefaultServerRequest request = new DefaultServerRequest( MockServerWebExchange.from(MockServerHttpRequest.method(HttpMethod.GET, "http://example.com?foo")), this.messageReaders); assertEquals(Optional.of(""), request.queryParam("foo")); }
@Test public void cookies() { HttpCookie cookie = new HttpCookie("foo", "bar"); MockServerWebExchange exchange = MockServerWebExchange.from( MockServerHttpRequest.method(HttpMethod.GET, "http://example.com").cookie(cookie)); DefaultServerRequest request = new DefaultServerRequest(exchange, messageReaders); MultiValueMap<String, HttpCookie> expected = new LinkedMultiValueMap<>(); expected.add("foo", cookie); assertEquals(expected, request.cookies()); }
@Test public void bodyToFlux() { DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap("foo".getBytes(StandardCharsets.UTF_8))); Flux<DataBuffer> body = Flux.just(dataBuffer); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); MockServerHttpRequest mockRequest = MockServerHttpRequest .method(HttpMethod.GET, "http://example.com?foo=bar") .headers(httpHeaders) .body(body); DefaultServerRequest request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), messageReaders); Flux<String> resultFlux = request.bodyToFlux(String.class); assertEquals(Collections.singletonList("foo"), resultFlux.collectList().block()); }
@Before public void createRequest() { MockServerHttpRequest request = MockServerHttpRequest.get("http://example.com/path").build(); MockServerWebExchange webExchange = MockServerWebExchange.from(request); webExchange.getAttributes().put("exchange", "bar"); this.request = new DefaultServerRequest(webExchange, Collections.singletonList( new DecoderHttpMessageReader<>(StringDecoder.allMimeTypes()))); }
@Test public void bodyToMono() { DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap("foo".getBytes(StandardCharsets.UTF_8))); Flux<DataBuffer> body = Flux.just(dataBuffer); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); MockServerHttpRequest mockRequest = MockServerHttpRequest .method(HttpMethod.GET, "http://example.com?foo=bar") .headers(httpHeaders) .body(body); DefaultServerRequest request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), messageReaders); Mono<String> resultMono = request.bodyToMono(String.class); assertEquals("foo", resultMono.block()); }
@Test public void bodyToFluxParameterizedTypeReference() { DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap("foo".getBytes(StandardCharsets.UTF_8))); Flux<DataBuffer> body = Flux.just(dataBuffer); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); MockServerHttpRequest mockRequest = MockServerHttpRequest .method(HttpMethod.GET, "http://example.com?foo=bar") .headers(httpHeaders) .body(body); DefaultServerRequest request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), messageReaders); ParameterizedTypeReference<String> typeReference = new ParameterizedTypeReference<String>() {}; Flux<String> resultFlux = request.bodyToFlux(typeReference); assertEquals(Collections.singletonList("foo"), resultFlux.collectList().block()); }
@Test public void bodyToMonoParameterizedTypeReference() { DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap("foo".getBytes(StandardCharsets.UTF_8))); Flux<DataBuffer> body = Flux.just(dataBuffer); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); MockServerHttpRequest mockRequest = MockServerHttpRequest .method(HttpMethod.GET, "http://example.com?foo=bar") .headers(httpHeaders) .body(body); DefaultServerRequest request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), messageReaders); ParameterizedTypeReference<String> typeReference = new ParameterizedTypeReference<String>() {}; Mono<String> resultMono = request.bodyToMono(typeReference); assertEquals("foo", resultMono.block()); }
@Test public void body() { DefaultDataBufferFactory factory = new DefaultDataBufferFactory(); DefaultDataBuffer dataBuffer = factory.wrap(ByteBuffer.wrap("foo".getBytes(StandardCharsets.UTF_8))); Flux<DataBuffer> body = Flux.just(dataBuffer); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.TEXT_PLAIN); MockServerHttpRequest mockRequest = MockServerHttpRequest .method(HttpMethod.GET, "http://example.com?foo=bar") .headers(httpHeaders) .body(body); DefaultServerRequest request = new DefaultServerRequest(MockServerWebExchange.from(mockRequest), messageReaders); Mono<String> resultMono = request.body(toMono(String.class)); assertEquals("foo", resultMono.block()); }
@Test public void method() { HttpMethod method = HttpMethod.HEAD; DefaultServerRequest request = new DefaultServerRequest( MockServerWebExchange.from(MockServerHttpRequest.method(method, "http://example.com")), this.messageReaders); assertEquals(method, request.method()); }