@Override public Mono<Object> resolveArgument( MethodParameter parameter, BindingContext context, ServerWebExchange exchange) { Object errors = getErrors(parameter, context); if (Mono.class.isAssignableFrom(errors.getClass())) { return ((Mono<?>) errors).cast(Object.class); } else if (Errors.class.isAssignableFrom(errors.getClass())) { return Mono.just(errors); } else { throw new IllegalStateException("Unexpected Errors/BindingResult type: " + errors.getClass().getName()); } }
/** * Attempts to load the client registration id from the current {@link Authentication} * @return */ private Mono<String> clientRegistrationId(Mono<Authentication> authentication) { return authentication .filter(t -> this.defaultOAuth2AuthorizedClient && t instanceof OAuth2AuthenticationToken) .cast(OAuth2AuthenticationToken.class) .map(OAuth2AuthenticationToken::getAuthorizedClientRegistrationId); }
/** * Attempts to load the client registration id from the current {@link Authentication} * @return */ private Mono<String> clientRegistrationId(Mono<Authentication> authentication) { return authentication .filter(t -> this.defaultOAuth2AuthorizedClient && t instanceof OAuth2AuthenticationToken) .cast(OAuth2AuthenticationToken.class) .map(OAuth2AuthenticationToken::getAuthorizedClientRegistrationId); }
@Override public Mono<Authentication> authenticate(Authentication authentication) { return Mono.justOrEmpty(authentication) .filter(a -> a instanceof BearerTokenAuthenticationToken) .cast(BearerTokenAuthenticationToken.class) .map(BearerTokenAuthenticationToken::getToken) .flatMap(this.jwtDecoder::decode) .flatMap(this.jwtAuthenticationConverter::convert) .cast(Authentication.class) .onErrorMap(JwtException.class, this::onError); }
@Override public Mono<Object> readMono( ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) { // We're ahead of String + "*/*" // Let's see if we can aggregate the output (lest we time out)... if (elementType.resolve() == String.class) { Flux<DataBuffer> body = message.getBody(); return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class); } return Mono.error(new UnsupportedOperationException( "ServerSentEventHttpMessageReader only supports reading stream of events as a Flux")); }
@Override public Mono<OAuth2AuthorizationRequest> resolve(ServerWebExchange exchange) { return this.authorizationRequestMatcher.matches(exchange) .filter(matchResult -> matchResult.isMatch()) .map(ServerWebExchangeMatcher.MatchResult::getVariables) .map(variables -> variables.get(DEFAULT_REGISTRATION_ID_URI_VARIABLE_NAME)) .cast(String.class) .flatMap(clientRegistrationId -> resolve(exchange, clientRegistrationId)); }
@Override public Mono<Void> handle(ServerWebExchange exchange, AccessDeniedException denied) { Map<String, String> parameters = new LinkedHashMap<>(); if (this.realmName != null) { parameters.put("realm", this.realmName); } return exchange.getPrincipal() .filter(AbstractOAuth2TokenAuthenticationToken.class::isInstance) .cast(AbstractOAuth2TokenAuthenticationToken.class) .map(token -> errorMessageParameters(token, parameters)) .switchIfEmpty(Mono.just(parameters)) .flatMap(params -> respond(exchange, params)); }
@Override public Mono<Object> readMono( ResolvableType elementType, ReactiveHttpInputMessage message, Map<String, Object> hints) { // We're ahead of String + "*/*" // Let's see if we can aggregate the output (lest we time out)... if (elementType.resolve() == String.class) { Flux<DataBuffer> body = message.getBody(); return stringDecoder.decodeToMono(body, elementType, null, null).cast(Object.class); } return Mono.error(new UnsupportedOperationException( "ServerSentEventHttpMessageReader only supports reading stream of events as a Flux")); }
@Test(expected = NullPointerException.class) public void sourceNull() { Mono.just(1) .cast(null); }
private BearerTokenAuthenticationToken convertToToken(MockServerHttpRequest request) { MockServerWebExchange exchange = MockServerWebExchange.from(request); return this.converter.convert(exchange).cast(BearerTokenAuthenticationToken.class).block(); } }
@Test // SPR-15331 public void decodeFullContentAsString() { String body = "data:foo\ndata:bar\n\ndata:baz\n\n"; MockServerHttpRequest request = MockServerHttpRequest.post("/") .body(Mono.just(stringBuffer(body))); String actual = messageReader .readMono(ResolvableType.forClass(String.class), request, Collections.emptyMap()) .cast(String.class) .block(Duration.ZERO); assertEquals(body, actual); }
@SuppressWarnings({ "unchecked", "rawtypes" }) protected Mono<RedisReactiveCommands<ByteBuffer, ByteBuffer>> getCommands(RedisNode node) { if (StringUtils.hasText(node.getId())) { return getConnection().cast(StatefulRedisClusterConnection.class) .map(it -> it.getConnection(node.getId()).reactive()); } return getConnection().flatMap(it -> Mono.fromCompletionStage(it.getConnectionAsync(node.getHost(), node.getPort())) .map(StatefulRedisConnection::reactive)); } }
@Test public void error() { StepVerifier.create(Mono.just(1) .cast(String.class)) .verifyError(ClassCastException.class); }
@Override public Mono<Authentication> authenticate(Authentication authentication) { return Mono.defer(() -> { OAuth2AuthorizationCodeAuthenticationToken token = (OAuth2AuthorizationCodeAuthenticationToken) authentication; // Section 3.1.2.1 Authentication Request - http://openid.net/specs/openid-connect-core-1_0.html#AuthRequest // scope REQUIRED. OpenID Connect requests MUST contain the "openid" scope value. if (token.getAuthorizationExchange() .getAuthorizationRequest().getScopes().contains("openid")) { // This is an OpenID Connect Authentication Request so return null // and let OidcAuthorizationCodeReactiveAuthenticationManager handle it instead once one is created // FIXME: Once we create OidcAuthorizationCodeReactiveAuthenticationManager uncomment below // return Mono.empty(); } return this.authorizationCodeManager.authenticate(token) .onErrorMap(OAuth2AuthorizationException.class, e -> new OAuth2AuthenticationException(e.getError(), e.getError().toString())) .cast(OAuth2AuthorizationCodeAuthenticationToken.class) .flatMap(this::onSuccess); }); }
@Test public void transformExtLinksNotAllowed() { MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/external.css")); List<ResourceTransformer> transformers = Collections.singletonList(new CssLinkResourceTransformer()); ResourceResolverChain mockChain = Mockito.mock(DefaultResourceResolverChain.class); ResourceTransformerChain chain = new DefaultResourceTransformerChain(mockChain, transformers); Resource resource = getResource("external.css"); String expected = "@import url(\"http://example.org/fonts/css\");\n" + "body { background: url(\"file:///home/spring/image.png\") }\n" + "figure { background: url(\"//example.org/style.css\")}"; StepVerifier.create(chain.transform(exchange, resource) .cast(TransformedResource.class)) .consumeNextWith(transformedResource -> { String result = new String(transformedResource.getByteArray(), StandardCharsets.UTF_8); result = StringUtils.deleteAny(result, "\r"); assertEquals(expected, result); }) .expectComplete() .verify(); List<Resource> locations = Collections.singletonList(resource); Mockito.verify(mockChain, Mockito.never()).resolveUrlPath("http://example.org/fonts/css", locations); Mockito.verify(mockChain, Mockito.never()).resolveUrlPath("file:///home/spring/image.png", locations); Mockito.verify(mockChain, Mockito.never()).resolveUrlPath("//example.org/style.css", locations); }
@Test public void findByUsernameWhenClearCredentialsThenFindByUsernameStillHasCredentials() { User foundUser = users.findByUsername(USER_DETAILS.getUsername()).cast(User.class).block(); assertThat(foundUser.getPassword()).isNotEmpty(); foundUser.eraseCredentials(); assertThat(foundUser.getPassword()).isNull(); foundUser = users.findByUsername(USER_DETAILS.getUsername()).cast(User.class).block(); assertThat(foundUser.getPassword()).isNotEmpty(); }
private static Mono<AccessTokenResponse> oauth2AccessTokenResponse(TokenResponse tokenResponse) { if (tokenResponse.indicatesSuccess()) { return Mono.just(tokenResponse) .cast(AccessTokenResponse.class); } TokenErrorResponse tokenErrorResponse = (TokenErrorResponse) tokenResponse; ErrorObject errorObject = tokenErrorResponse.getErrorObject(); OAuth2Error oauth2Error; if (errorObject == null) { oauth2Error = new OAuth2Error(OAuth2ErrorCodes.SERVER_ERROR); } else { oauth2Error = new OAuth2Error( errorObject.getCode() != null ? errorObject.getCode() : OAuth2ErrorCodes.SERVER_ERROR, errorObject.getDescription(), errorObject.getURI() != null ? errorObject.getURI().toString() : null); } return Mono.error(new OAuth2AuthorizationException(oauth2Error)); }
@Test public void normal() { StepVerifier.create(Mono.just(1) .cast(Number.class)) .expectNext(1) .verifyComplete(); }
@Test public void transform() { MockServerWebExchange exchange = MockServerWebExchange.from(get("/static/main.css")); Resource css = getResource("main.css"); String expected = "\n" + "@import url(\"/static/bar-11e16cf79faee7ac698c805cf28248d2.css?#iefix\");\n" + "@import url('/static/bar-11e16cf79faee7ac698c805cf28248d2.css#bla-normal');\n" + "@import url(/static/bar-11e16cf79faee7ac698c805cf28248d2.css);\n\n" + "@import \"/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css\";\n" + "@import '/static/foo-e36d2e05253c6c7085a91522ce43a0b4.css';\n\n" + "body { background: url(\"/static/images/image-f448cd1d5dba82b774f3202c878230b3.png?#iefix\") }\n"; StepVerifier.create(this.transformerChain.transform(exchange, css) .cast(TransformedResource.class)) .consumeNextWith(transformedResource -> { String result = new String(transformedResource.getByteArray(), StandardCharsets.UTF_8); result = StringUtils.deleteAny(result, "\r"); assertEquals(expected, result); }) .expectComplete() .verify(); }