@Override public Map<String, Object> attributes() { return this.delegate.attributes(); }
private static void restoreAttributes(ServerRequest request, Map<String, Object> attributes) { request.attributes().clear(); request.attributes().putAll(attributes); }
/** * Get the request attribute value if present. * @param name the attribute name * @return the attribute value */ default Optional<Object> attribute(String name) { return Optional.ofNullable(attributes().get(name)); }
private static void mergeAttributes(ServerRequest request, Map<String, String> variables, PathPattern pattern) { Map<String, String> pathVariables = mergePathVariables(request.pathVariables(), variables); request.attributes().put(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, Collections.unmodifiableMap(pathVariables)); pattern = mergePatterns( (PathPattern) request.attributes().get(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE), pattern); request.attributes().put(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE, pattern); }
private static Map<String, Object> mergeAttributes(ServerRequest request, Map<String, String> pathVariables, PathPattern pattern) { Map<String, Object> result = new ConcurrentHashMap<>(request.attributes()); result.put(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE, mergePathVariables(request.pathVariables(), pathVariables)); pattern = mergePatterns( (PathPattern) request.attributes().get(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE), pattern); result.put(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE, pattern); return result; }
@Override public boolean test(ServerRequest request) { Map<String, Object> oldAttributes = new HashMap<>(request.attributes()); boolean result = !this.delegate.test(request); if (!result) { restoreAttributes(request, oldAttributes); } return result; }
@Override public boolean test(ServerRequest request) { request.attributes().put(key, value); return this.result; } }
@Override public Mono<HandlerFunction<T>> route(ServerRequest serverRequest) { return this.predicate.nest(serverRequest) .map(nestedRequest -> { if (logger.isTraceEnabled()) { String logPrefix = serverRequest.exchange().getLogPrefix(); logger.trace(logPrefix + String.format("Matched nested %s", this.predicate)); } return this.routerFunction.route(nestedRequest) .doOnNext(match -> { if (nestedRequest != serverRequest) { serverRequest.attributes().clear(); serverRequest.attributes() .putAll(nestedRequest.attributes()); } }); } ).orElseGet(Mono::empty); }
@Override public boolean test(ServerRequest request) { Map<String, Object> oldAttributes = new HashMap<>(request.attributes()); if (this.left.test(request) && this.right.test(request)) { return true; } restoreAttributes(request, oldAttributes); return false; }
@Override public boolean test(ServerRequest request) { Map<String, Object> oldAttributes = new HashMap<>(request.attributes()); if (this.left.test(request)) { return true; } else { restoreAttributes(request, oldAttributes); if (this.right.test(request)) { return true; } } restoreAttributes(request, oldAttributes); return false; }
@Nullable private PathPattern matchingPattern(ServerRequest request) { return (PathPattern) request.attributes().get(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE); }
public DefaultServerRequestBuilder(ServerRequest other) { Assert.notNull(other, "ServerRequest must not be null"); this.messageReaders = other.messageReaders(); this.exchange = other.exchange(); this.methodName = other.methodName(); this.uri = other.uri(); headers(headers -> headers.addAll(other.headers().asHttpHeaders())); cookies(cookies -> cookies.addAll(other.cookies())); attributes(attributes -> attributes.putAll(other.attributes())); }
@SuppressWarnings("unchecked") public Mono<ServerResponse> attributes(ServerRequest request) { assertTrue(request.attributes().containsKey(RouterFunctions.REQUEST_ATTRIBUTE)); assertTrue(request.attributes().containsKey(HandlerMapping.BEST_MATCHING_HANDLER_ATTRIBUTE)); Map<String, String> pathVariables = (Map<String, String>) request.attributes().get(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE); assertNotNull(pathVariables); assertEquals(1, pathVariables.size()); assertEquals("bar", pathVariables.get("foo")); pathVariables = (Map<String, String>) request.attributes().get(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE); assertNotNull(pathVariables); assertEquals(1, pathVariables.size()); assertEquals("bar", pathVariables.get("foo")); PathPattern pattern = (PathPattern) request.attributes().get(RouterFunctions.MATCHING_PATTERN_ATTRIBUTE); assertNotNull(pattern); assertEquals("/attributes/{foo}", pattern.getPatternString()); pattern = (PathPattern) request.attributes() .get(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE); assertNotNull(pattern); assertEquals("/attributes/{foo}", pattern.getPatternString()); return ServerResponse.ok().build(); } }
@SuppressWarnings("unchecked") public Mono<ServerResponse> variables(ServerRequest request) { Map<String, String> pathVariables = request.pathVariables(); Map<String, String> attributePathVariables = (Map<String, String>) request.attributes().get(RouterFunctions.URI_TEMPLATE_VARIABLES_ATTRIBUTE); assertTrue( (pathVariables.equals(attributePathVariables)) || (pathVariables.isEmpty() && (attributePathVariables == null))); PathPattern pathPattern = matchingPattern(request); String pattern = pathPattern != null ? pathPattern.getPatternString() : ""; Flux<String> responseBody; if (!pattern.isEmpty()) { responseBody = Flux.just(pattern, "\n", pathVariables.toString()); } else { responseBody = Flux.just(pathVariables.toString()); } return ServerResponse.ok().body(responseBody, String.class); }