@NonNull private static List<MediaType> acceptedMediaTypes(ServerRequest.Headers headers) { List<MediaType> acceptedMediaTypes = headers.accept(); if (acceptedMediaTypes.isEmpty()) { acceptedMediaTypes = Collections.singletonList(MediaType.ALL); } else { MediaType.sortBySpecificityAndQuality(acceptedMediaTypes); } return acceptedMediaTypes; }
@Test public void accept() { List<MediaType> accept = Collections.singletonList(MediaType.APPLICATION_JSON); when(mockHeaders.accept()).thenReturn(accept); assertSame(accept, wrapper.accept()); }
@Test public void header() { HttpHeaders httpHeaders = new HttpHeaders(); List<MediaType> accept = Collections.singletonList(MediaType.APPLICATION_JSON); httpHeaders.setAccept(accept); List<Charset> acceptCharset = Collections.singletonList(StandardCharsets.UTF_8); httpHeaders.setAcceptCharset(acceptCharset); long contentLength = 42L; httpHeaders.setContentLength(contentLength); MediaType contentType = MediaType.TEXT_PLAIN; httpHeaders.setContentType(contentType); InetSocketAddress host = InetSocketAddress.createUnresolved("localhost", 80); httpHeaders.setHost(host); List<HttpRange> range = Collections.singletonList(HttpRange.createByteRange(0, 42)); httpHeaders.setRange(range); DefaultServerRequest request = new DefaultServerRequest( MockServerWebExchange.from(MockServerHttpRequest .method(HttpMethod.GET, "http://example.com?foo=bar") .headers(httpHeaders)), this.messageReaders); ServerRequest.Headers headers = request.headers(); assertEquals(accept, headers.accept()); assertEquals(acceptCharset, headers.acceptCharset()); assertEquals(OptionalLong.of(contentLength), headers.contentLength()); assertEquals(Optional.of(contentType), headers.contentType()); assertEquals(httpHeaders, headers.asHttpHeaders()); }
@Bean RouterFunction<ServerResponse> routes() { return route(GET("/api/v1/messages"), request -> ok().contentType(request.headers() .accept() .contains(TEXT_EVENT_STREAM) ? TEXT_EVENT_STREAM : APPLICATION_STREAM_JSON) .body(Flux.zip( Flux.interval(Duration.ofSeconds(1)), messages.findAll()) .map(Tuple2::getT2) .share(), Message.class)) .andRoute(POST("/api/v1/messages"), request -> ok().contentType(APPLICATION_JSON) .body(request.bodyToMono(Message.class) .flatMap(messages::save), Message.class)) .andRoute(GET("/"), request -> ok().render("index", Rendering.view("index") .modelAttribute("name", "Max") .build() .modelAttributes()) ); }
@Bean RouterFunction<ServerResponse> routes(final Flux<ServerSentEvent<Map>> processor, final Consumer<String> distributeEvent) { final ParameterizedTypeReference<Map<String, String>> type = new ParameterizedTypeReference<Map<String, String>>() {}; return route(GET("/**"), request -> ok().contentType(request.headers().accept().contains(TEXT_EVENT_STREAM) ? TEXT_EVENT_STREAM : APPLICATION_STREAM_JSON) .body(processor.map(s -> s), ServerSentEvent.class)) .andRoute(POST("/**"), request -> accepted().body(request.bodyToMono(type) .map(map -> map.getOrDefault("message", "")) .map(String::valueOf) .map(String::trim) .filter(s -> s.length() > 0) .doOnNext(distributeEvent) .map(m -> format("message '%s' accepted.", m)) .map(message -> singletonMap("response", message)) .subscribeOn(Schedulers.elastic()) .flatMap(Mono::just), Map.class)) ; }
/** * Return a {@code RequestPredicate} that tests if the request's * {@linkplain ServerRequest.Headers#accept() accept} header is * {@linkplain MediaType#isCompatibleWith(MediaType) compatible} with any of the given media types. * * @param mediaTypes the media types to match the request's accept header against * @return a predicate that tests the request's accept header against the given media types */ public static RequestPredicate accept(MediaType... mediaTypes) { Assert.notEmpty(mediaTypes, "'mediaTypes' must not be empty"); Set<MediaType> mediaTypeSet = new HashSet<>(Arrays.asList(mediaTypes)); return headers(headers -> { List<MediaType> acceptedMediaTypes = headers.accept(); MediaType.sortBySpecificityAndQuality(acceptedMediaTypes); return acceptedMediaTypes.stream() .anyMatch(acceptedMediaType -> mediaTypeSet.stream() .anyMatch(acceptedMediaType::isCompatibleWith)); }); }
@Override public List<MediaType> accept() { return this.headers.accept(); }
@Override public List<MediaType> accept() { return this.headers.accept(); }