Skip to content

Commit

Permalink
Adding new methods to manage the path params map
Browse files Browse the repository at this point in the history
  • Loading branch information
franz1981 committed Sep 5, 2024
1 parent e13de95 commit de06d19
Show file tree
Hide file tree
Showing 6 changed files with 54 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,13 @@ public void handle(RoutingContext routingContext) {
private Map<String, RequestParameter> validatePathParams(RoutingContext routingContext) throws ValidationException {
// Validation process validate only params that are registered in the validation -> extra params are allowed
Map<String, RequestParameter> parsedParams = new HashMap<>();
Map<String, String> pathParams = routingContext.pathParams();

for (ParameterValidationRule rule : pathParamsRules.values()) {
String name = rule.getName();
if (pathParams.containsKey(name)) {
if (pathParams.get(name) != null || !rule.isOptional() ) {
RequestParameter parsedParam = rule.validateSingleParam(pathParams.get(name));
if (routingContext.hasPathParam(name)) {
String pathParam = routingContext.pathParam(name);
if (pathParam != null || !rule.isOptional() ) {
RequestParameter parsedParam = rule.validateSingleParam(pathParam);
if (parsedParams.containsKey(parsedParam.getName()))
parsedParam = parsedParam.merge(parsedParams.get(parsedParam.getName()));
parsedParams.put(parsedParam.getName(), parsedParam);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,12 +187,8 @@ private void runPredicates(RoutingContext context) throws BadRequestException {

private Future<Map<String, RequestParameter>> validatePathParams(RoutingContext routingContext) {
// Validation process validate only params that are registered in the validation -> extra params are allowed
Map<String, List<String>> pathParams = routingContext
.pathParams()
.entrySet()
.stream()
.map(e -> new SimpleImmutableEntry<>(e.getKey(), Collections.singletonList(e.getValue())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map<String, List<String>> pathParams = new HashMap<>();
routingContext.forEachPathParam((name, params) -> pathParams.put(name, Collections.singletonList(params)));

Map<String, RequestParameter> parsedParams = new HashMap<>();

Expand Down
19 changes: 19 additions & 0 deletions vertx-web/src/main/java/io/vertx/ext/web/RoutingContext.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;

import static io.vertx.codegen.annotations.GenIgnore.PERMITTED_TYPE;

Expand Down Expand Up @@ -619,6 +620,24 @@ default LanguageHeader preferredLanguage() {
*/
Map<String, String> pathParams();

/**
* Remove a path parameter
* @return {@code true} when removed, {@code false} otherwise
*/
boolean removePathParam(String s);

/**
* Iterate over all the path parameters
*
* @param pathParamsConsumer the consumer for each path parameter
*/
void forEachPathParam(BiConsumer<String, String> pathParamsConsumer);

/**
* @return {@code true} if the context has a path parameter with the specified {@code name}, {@code false} otherwise.
*/
boolean hasPathParam(String name);

/**
* Gets the value of a single path parameter
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1001,8 +1001,7 @@ public int matches(RoutingContextImplBase context, String mountPoint, boolean fa
}
if (pattern != null) {
// need to reset "rest"
context.pathParams()
.remove("*");
context.removePathParam("*");

String path = useNormalizedPath ? context.normalizedPath() : context.request().path();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;
import java.util.stream.Collectors;

import static io.vertx.ext.web.handler.impl.SessionHandlerImpl.SESSION_USER_HOLDER_KEY;
Expand Down Expand Up @@ -439,6 +440,21 @@ public void reroute(HttpMethod method, String path) {
restart();
}

@Override
public void forEachPathParam(final BiConsumer<String, String> pathParamsConsumer) {
if (pathParams != null) {
pathParams.forEach(pathParamsConsumer);
}
}

@Override
public boolean hasPathParam(final String name) {
if (pathParams != null) {
return pathParams.containsKey(name);
}
return false;
}

@Override
public Map<String, String> pathParams() {
return getPathParams();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;

/**
* @author <a href="http://tfox.org">Tim Fox</a>
Expand Down Expand Up @@ -313,6 +314,16 @@ public Map<String, String> pathParams() {
return inner.pathParams();
}

@Override
public boolean hasPathParam(final String name) {
return inner.hasPathParam(name);
}

@Override
public void forEachPathParam(final BiConsumer<String, String> pathParamsConsumer) {
inner.forEachPathParam(pathParamsConsumer);
}

@Override
public @Nullable String pathParam(String name) {
return inner.pathParam(name);
Expand Down

0 comments on commit de06d19

Please sign in to comment.