private RepositoryRestHandlerMapping(ResourceMappings mappings, RepositoryRestConfiguration config, Optional<Repositories> repositories) { super(config); Assert.notNull(mappings, "ResourceMappings must not be null!"); Assert.notNull(config, "RepositoryRestConfiguration must not be null!"); Assert.notNull(repositories, "Repositories must not be null!"); this.mappings = mappings; this.configuration = config; this.repositories = repositories; this.corsConfigurationAccessor = new RepositoryCorsConfigurationAccessor(mappings, NoOpStringValueResolver.INSTANCE, repositories); }
Optional<CorsConfiguration> findCorsConfiguration(String lookupPath) { return getResourceMetadata(getRepositoryBasePath(lookupPath))// .flatMap(it -> repositories.flatMap(foo -> foo.getRepositoryInformationFor(it.getDomainType())))// .map(it -> it.getRepositoryInterface())// .map(it -> createConfiguration(it)); }
@Override protected CorsConfiguration getCorsConfiguration(Object handler, HttpServletRequest request) { String lookupPath = getUrlPathHelper().getLookupPathForRequest(request); String repositoryLookupPath = new BaseUri(configuration.getBaseUri()).getRepositoryLookupPath(lookupPath); CorsConfiguration corsConfiguration = super.getCorsConfiguration(handler, request); return repositories.filter(it -> StringUtils.hasText(repositoryLookupPath))// .flatMap(it -> corsConfigurationAccessor.findCorsConfiguration(repositoryLookupPath)) .map(it -> it.combine(corsConfiguration))// .orElse(corsConfiguration); }
updateCorsConfig(config, typeAnnotation);
private void updateCorsConfig(CorsConfiguration config, CrossOrigin annotation) { for (String origin : annotation.origins()) { config.addAllowedOrigin(resolveCorsAnnotationValue(origin)); } for (RequestMethod method : annotation.methods()) { config.addAllowedMethod(method.name()); } for (String header : annotation.allowedHeaders()) { config.addAllowedHeader(resolveCorsAnnotationValue(header)); } for (String header : annotation.exposedHeaders()) { config.addExposedHeader(resolveCorsAnnotationValue(header)); } String allowCredentials = resolveCorsAnnotationValue(annotation.allowCredentials()); if ("true".equalsIgnoreCase(allowCredentials)) { config.setAllowCredentials(true); } else if ("false".equalsIgnoreCase(allowCredentials)) { config.setAllowCredentials(false); } else if (!allowCredentials.isEmpty()) { throw new IllegalStateException("@CrossOrigin's allowCredentials value must be \"true\", \"false\", " + "or an empty string (\"\"): current value is [" + allowCredentials + "]"); } if (annotation.maxAge() >= 0 && config.getMaxAge() == null) { config.setMaxAge(annotation.maxAge()); } }
@Override public void setEmbeddedValueResolver(StringValueResolver resolver) { super.setEmbeddedValueResolver(resolver); this.corsConfigurationAccessor = new RepositoryCorsConfigurationAccessor(mappings, resolver == null ? NoOpStringValueResolver.INSTANCE : resolver, repositories); }
@Override protected CorsConfiguration getCorsConfiguration(Object handler, HttpServletRequest request) { String lookupPath = getUrlPathHelper().getLookupPathForRequest(request); String repositoryLookupPath = new BaseUri(configuration.getBaseUri()).getRepositoryLookupPath(lookupPath); CorsConfiguration corsConfiguration = super.getCorsConfiguration(handler, request); return repositories.filter(it -> StringUtils.hasText(repositoryLookupPath))// .flatMap(it -> corsConfigurationAccessor.findCorsConfiguration(repositoryLookupPath)) .map(it -> it.combine(corsConfiguration))// .orElse(corsConfiguration); }
Optional<CorsConfiguration> findCorsConfiguration(String lookupPath) { return getResourceMetadata(getRepositoryBasePath(lookupPath))// .flatMap(it -> repositories.flatMap(foo -> foo.getRepositoryInformationFor(it.getDomainType())))// .map(it -> it.getRepositoryInterface())// .map(it -> createConfiguration(it)); }
private RepositoryRestHandlerMapping(ResourceMappings mappings, RepositoryRestConfiguration config, Optional<Repositories> repositories) { super(config); Assert.notNull(mappings, "ResourceMappings must not be null!"); Assert.notNull(config, "RepositoryRestConfiguration must not be null!"); Assert.notNull(repositories, "Repositories must not be null!"); this.mappings = mappings; this.configuration = config; this.repositories = repositories; this.corsConfigurationAccessor = new RepositoryCorsConfigurationAccessor(mappings, NoOpStringValueResolver.INSTANCE, repositories); }
updateCorsConfig(config, typeAnnotation);
private void updateCorsConfig(CorsConfiguration config, CrossOrigin annotation) { for (String origin : annotation.origins()) { config.addAllowedOrigin(resolveCorsAnnotationValue(origin)); } for (RequestMethod method : annotation.methods()) { config.addAllowedMethod(method.name()); } for (String header : annotation.allowedHeaders()) { config.addAllowedHeader(resolveCorsAnnotationValue(header)); } for (String header : annotation.exposedHeaders()) { config.addExposedHeader(resolveCorsAnnotationValue(header)); } String allowCredentials = resolveCorsAnnotationValue(annotation.allowCredentials()); if ("true".equalsIgnoreCase(allowCredentials)) { config.setAllowCredentials(true); } else if ("false".equalsIgnoreCase(allowCredentials)) { config.setAllowCredentials(false); } else if (!allowCredentials.isEmpty()) { throw new IllegalStateException("@CrossOrigin's allowCredentials value must be \"true\", \"false\", " + "or an empty string (\"\"): current value is [" + allowCredentials + "]"); } if (annotation.maxAge() >= 0 && config.getMaxAge() == null) { config.setMaxAge(annotation.maxAge()); } }
@Override public void setEmbeddedValueResolver(StringValueResolver resolver) { super.setEmbeddedValueResolver(resolver); this.corsConfigurationAccessor = new RepositoryCorsConfigurationAccessor(mappings, resolver == null ? NoOpStringValueResolver.INSTANCE : resolver, repositories); }