Restore attributes for failed AND/OR request predicates
This commit restores the attributes when either of the predicates in an AND/OR conjunction is false. Issue: SPR-17210
This commit is contained in:
@@ -23,6 +23,7 @@ import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
@@ -349,6 +350,11 @@ public abstract class RequestPredicates {
|
||||
}
|
||||
}
|
||||
|
||||
private static void restoreAttributes(ServerRequest request, Map<String, Object> attributes) {
|
||||
request.attributes().clear();
|
||||
request.attributes().putAll(attributes);
|
||||
}
|
||||
|
||||
|
||||
private static class HttpMethodPredicate implements RequestPredicate {
|
||||
|
||||
@@ -518,8 +524,14 @@ public abstract class RequestPredicates {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(ServerRequest t) {
|
||||
return (this.left.test(t) && this.right.test(t));
|
||||
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
|
||||
@@ -533,7 +545,6 @@ public abstract class RequestPredicates {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@link RequestPredicate} for where either {@code left} or {@code right} predicates
|
||||
* may match.
|
||||
@@ -552,8 +563,20 @@ public abstract class RequestPredicates {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(ServerRequest t) {
|
||||
return (this.left.test(t) || this.right.test(t));
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user