@Override @Nullable public CorsConfiguration getCorsConfiguration(ServerWebExchange exchange) { PathContainer lookupPath = exchange.getRequest().getPath().pathWithinApplication(); return this.corsConfigurations.entrySet().stream() .filter(entry -> entry.getKey().matches(lookupPath)) .map(Map.Entry::getValue) .findFirst() .orElse(null); }
@Override protected Object resolveNamedValue(String name, MethodParameter parameter, ServerWebExchange exchange) { List<String> paramValues = exchange.getRequest().getQueryParams().get(name); Object result = null; if (paramValues != null) { result = (paramValues.size() == 1 ? paramValues.get(0) : paramValues); } return result; }
@Nullable private String getAcceptEncoding(ServerWebExchange exchange) { ServerHttpRequest request = exchange.getRequest(); String header = request.getHeaders().getFirst(HttpHeaders.ACCEPT_ENCODING); return (header != null ? header.toLowerCase() : null); }
@Override protected Object resolveNamedValue(String name, MethodParameter parameter, ServerWebExchange exchange) { List<String> headerValues = exchange.getRequest().getHeaders().get(name); Object result = null; if (headerValues != null) { result = (headerValues.size() == 1 ? headerValues.get(0) : headerValues); } return result; }
@Override public List<String> resolveSessionIds(ServerWebExchange exchange) { MultiValueMap<String, HttpCookie> cookieMap = exchange.getRequest().getCookies(); List<HttpCookie> cookies = cookieMap.get(getCookieName()); if (cookies == null) { return Collections.emptyList(); } return cookies.stream().map(HttpCookie::getValue).collect(Collectors.toList()); }
@Override protected boolean matchValue(ServerWebExchange exchange) { return (this.value != null && this.value.equals(exchange.getRequest().getQueryParams().getFirst(this.name))); } }
@Override protected boolean matchValue(ServerWebExchange exchange) { return (this.value != null && this.value.equals(exchange.getRequest().getHeaders().getFirst(this.name))); } }
@Override public Mono<Object> resolveArgument( MethodParameter parameter, BindingContext bindingContext, ServerWebExchange exchange) { Class<?> entityType = parameter.getParameterType(); return readBody(parameter.nested(), parameter, false, bindingContext, exchange) .map(body -> createEntity(body, entityType, exchange.getRequest())) .defaultIfEmpty(createEntity(null, entityType, exchange.getRequest())); }
@Override public ServerWebExchange.Builder request(Consumer<ServerHttpRequest.Builder> consumer) { ServerHttpRequest.Builder builder = this.delegate.getRequest().mutate(); consumer.accept(builder); return request(builder.build()); }
@Override public List<String> resolveSessionIds(ServerWebExchange exchange) { HttpHeaders headers = exchange.getRequest().getHeaders(); return headers.getOrDefault(getHeaderName(), Collections.emptyList()); }
@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); }
private Flux<?> decodePartValues(Flux<Part> parts, MethodParameter elementType, BindingContext bindingContext, ServerWebExchange exchange, boolean isRequired) { return parts.flatMap(part -> { ServerHttpRequest partRequest = new PartServerHttpRequest(exchange.getRequest(), part); ServerWebExchange partExchange = exchange.mutate().request(partRequest).build(); if (logger.isDebugEnabled()) { logger.debug(exchange.getLogPrefix() + "Decoding part '" + part.name() + "'"); } return readBody(elementType, isRequired, bindingContext, partExchange); }); }
@Override public Mono<Object> getHandlerInternal(ServerWebExchange exchange) { PathContainer lookupPath = exchange.getRequest().getPath().pathWithinApplication(); Object handler; try { handler = lookupHandler(lookupPath, exchange); } catch (Exception ex) { return Mono.error(ex); } return Mono.justOrEmpty(handler); }
@Override public final Mono<Void> writeTo(ServerWebExchange exchange, Context context) { writeStatusAndHeaders(exchange.getResponse()); Instant lastModified = Instant.ofEpochMilli(headers().getLastModified()); HttpMethod httpMethod = exchange.getRequest().getMethod(); if (SAFE_METHODS.contains(httpMethod) && exchange.checkNotModified(headers().getETag(), lastModified)) { return exchange.getResponse().setComplete(); } else { return writeToInternal(exchange, context); } }
@Override public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); if (hasForwardedHeaders(request)) { exchange = exchange.mutate().request(apply(request)).build(); } return chain.filter(exchange); }
@SuppressWarnings("unchecked") private <T> HttpEntity<T> resolveValueWithEmptyBody(ResolvableType type) { ServerWebExchange exchange = MockServerWebExchange.from(post("/path")); MethodParameter param = this.testMethod.arg(type); Mono<Object> result = this.resolver.resolveArgument(param, new BindingContext(), exchange); HttpEntity<String> httpEntity = (HttpEntity<String>) result.block(Duration.ofSeconds(5)); assertEquals(exchange.getRequest().getHeaders(), httpEntity.getHeaders()); return (HttpEntity<T>) httpEntity; }
@Test public void httpEntityWithCompletableFutureBody() throws Exception { ServerWebExchange exchange = postExchange("line1"); ResolvableType type = httpEntityType(CompletableFuture.class, String.class); HttpEntity<CompletableFuture<String>> httpEntity = resolveValue(exchange, type); assertEquals(exchange.getRequest().getHeaders(), httpEntity.getHeaders()); assertEquals("line1", httpEntity.getBody().get()); }
@Test public void unresolvedExceptionWithWebHttpHandlerAdapter() throws Exception { // HttpWebHandlerAdapter handles unresolved errors new HttpWebHandlerAdapter(createWebHandler(new UnresolvedExceptionHandler())) .handle(this.exchange.getRequest(), this.exchange.getResponse()).block(); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, this.exchange.getResponse().getStatusCode()); }
@Test public void httpEntityWithStringBody() throws Exception { ServerWebExchange exchange = postExchange("line1"); ResolvableType type = httpEntityType(String.class); HttpEntity<String> httpEntity = resolveValue(exchange, type); assertEquals(exchange.getRequest().getHeaders(), httpEntity.getHeaders()); assertEquals("line1", httpEntity.getBody()); }
@Test public void httpEntityWithRxJava2SingleBody() throws Exception { ServerWebExchange exchange = postExchange("line1"); ResolvableType type = httpEntityType(io.reactivex.Single.class, String.class); HttpEntity<io.reactivex.Single<String>> httpEntity = resolveValue(exchange, type); assertEquals(exchange.getRequest().getHeaders(), httpEntity.getHeaders()); assertEquals("line1", httpEntity.getBody().blockingGet()); }