Skip to content

Commit 5ce1abe

Browse files
authored
Merge pull request #37513 from rmartinc/issue-35960
Save pathParamValues encoded and perform decoding when requested
2 parents 2aa5abb + aad19ca commit 5ce1abe

File tree

6 files changed

+33
-34
lines changed

6 files changed

+33
-34
lines changed

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/ResteasyReactiveRequestContext.java

+18-23
Original file line numberDiff line numberDiff line change
@@ -226,18 +226,20 @@ public void setMaxPathParams(int maxPathParams) {
226226
}
227227
}
228228

229-
public String getPathParam(int index) {
230-
return doGetPathParam(index, pathParamValues);
229+
public String getPathParam(int index, boolean encoded) {
230+
return doGetPathParam(index, pathParamValues, encoded);
231231
}
232232

233-
private String doGetPathParam(int index, Object pathParamValues) {
233+
private String doGetPathParam(int index, Object pathParamValues, boolean encoded) {
234234
if (pathParamValues instanceof String[]) {
235-
return ((String[]) pathParamValues)[index];
235+
String pathParam = ((String[]) pathParamValues)[index];
236+
return encoded ? pathParam : Encode.decodePath(pathParam);
236237
}
237238
if (index > 1) {
238239
throw new IndexOutOfBoundsException();
239240
}
240-
return (String) pathParamValues;
241+
String pathParam = (String) pathParamValues;
242+
return encoded ? pathParam : Encode.decodePath(pathParam);
241243
}
242244

243245
public ResteasyReactiveRequestContext setPathParamValue(int index, String value) {
@@ -926,18 +928,11 @@ public String getPathParameter(String name, boolean encoded) {
926928
Integer index = target.getPathParameterIndexes().get(name);
927929
String value;
928930
if (index != null) {
929-
value = getPathParam(index);
930-
} else {
931-
// Check previous resources if the path is not defined in the current target
932-
value = getResourceLocatorPathParam(name);
933-
}
934-
935-
// It's possible to inject a path param that's not defined, return null in this case
936-
if (encoded && value != null) {
937-
return Encode.encodeQueryParam(value);
931+
return getPathParam(index, encoded);
938932
}
939933

940-
return value;
934+
// Check previous resources if the path is not defined in the current target
935+
return getResourceLocatorPathParam(name, encoded);
941936
}
942937

943938
@Override
@@ -996,8 +991,8 @@ public ResteasyReactiveResourceInfo getResteasyReactiveResourceInfo() {
996991

997992
public abstract Runnable registerTimer(long millis, Runnable task);
998993

999-
public String getResourceLocatorPathParam(String name) {
1000-
return getResourceLocatorPathParam(name, (PreviousResource) getProperty(PreviousResource.PROPERTY_KEY));
994+
public String getResourceLocatorPathParam(String name, boolean encoded) {
995+
return getResourceLocatorPathParam(name, (PreviousResource) getProperty(PreviousResource.PROPERTY_KEY), encoded);
1001996
}
1002997

1003998
public FormData getFormData() {
@@ -1009,7 +1004,7 @@ public ResteasyReactiveRequestContext setFormData(FormData formData) {
10091004
return this;
10101005
}
10111006

1012-
private String getResourceLocatorPathParam(String name, PreviousResource previousResource) {
1007+
private String getResourceLocatorPathParam(String name, PreviousResource previousResource, boolean encoded) {
10131008
if (previousResource == null) {
10141009
return null;
10151010
}
@@ -1020,13 +1015,13 @@ private String getResourceLocatorPathParam(String name, PreviousResource previou
10201015
for (URITemplate.TemplateComponent component : classPath.components) {
10211016
if (component.name != null) {
10221017
if (component.name.equals(name)) {
1023-
return doGetPathParam(index, previousResource.locatorPathParamValues);
1018+
return doGetPathParam(index, previousResource.locatorPathParamValues, encoded);
10241019
}
10251020
index++;
10261021
} else if (component.names != null) {
10271022
for (String nm : component.names) {
10281023
if (nm.equals(name)) {
1029-
return doGetPathParam(index, previousResource.locatorPathParamValues);
1024+
return doGetPathParam(index, previousResource.locatorPathParamValues, encoded);
10301025
}
10311026
}
10321027
index++;
@@ -1036,19 +1031,19 @@ private String getResourceLocatorPathParam(String name, PreviousResource previou
10361031
for (URITemplate.TemplateComponent component : previousResource.locatorTarget.getPath().components) {
10371032
if (component.name != null) {
10381033
if (component.name.equals(name)) {
1039-
return doGetPathParam(index, previousResource.locatorPathParamValues);
1034+
return doGetPathParam(index, previousResource.locatorPathParamValues, encoded);
10401035
}
10411036
index++;
10421037
} else if (component.names != null) {
10431038
for (String nm : component.names) {
10441039
if (nm.equals(name)) {
1045-
return doGetPathParam(index, previousResource.locatorPathParamValues);
1040+
return doGetPathParam(index, previousResource.locatorPathParamValues, encoded);
10461041
}
10471042
}
10481043
index++;
10491044
}
10501045
}
1051-
return getResourceLocatorPathParam(name, previousResource.prev);
1046+
return getResourceLocatorPathParam(name, previousResource.prev, encoded);
10521047
}
10531048

10541049
public abstract boolean resumeExternalProcessing();

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/parameters/LocatableResourcePathParamExtractor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public LocatableResourcePathParamExtractor(String name) {
1212

1313
@Override
1414
public Object extractParameter(ResteasyReactiveRequestContext context) {
15-
return context.getResourceLocatorPathParam(name);
15+
return context.getResourceLocatorPathParam(name, false);
1616
}
1717

1818
}

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/core/parameters/PathParamExtractor.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.jboss.resteasy.reactive.server.core.parameters;
22

3+
import java.util.Arrays;
34
import java.util.List;
5+
import java.util.stream.Collectors;
46

57
import org.jboss.resteasy.reactive.common.util.Encode;
68
import org.jboss.resteasy.reactive.server.core.ResteasyReactiveRequestContext;
@@ -19,14 +21,14 @@ public PathParamExtractor(int index, boolean encoded, boolean single) {
1921

2022
@Override
2123
public Object extractParameter(ResteasyReactiveRequestContext context) {
22-
String pathParam = context.getPathParam(index);
23-
if (encoded) {
24-
pathParam = Encode.encodeQueryParam(pathParam);
25-
}
24+
String pathParam = context.getPathParam(index, true);
2625
if (single) {
27-
return pathParam;
26+
return encoded ? pathParam : Encode.decodePath(pathParam);
2827
} else {
29-
return List.of(pathParam.split("/"));
28+
return encoded
29+
? List.of(pathParam.split("/"))
30+
: Arrays.stream(pathParam.split("/")).map(Encode::decodePath)
31+
.collect(Collectors.toList());
3032
}
3133
}
3234
}

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/jaxrs/UriInfoImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ public MultivaluedMap<String, String> getPathParameters(boolean decode) {
152152
RuntimeResource target = currentRequest.getTarget();
153153
if (target != null) { // a target can be null if this happens in a filter that runs before the target is set
154154
for (Entry<String, Integer> pathParam : target.getPathParameterIndexes().entrySet()) {
155-
pathParams.add(pathParam.getKey(), currentRequest.getPathParam(pathParam.getValue()));
155+
pathParams.add(pathParam.getKey(), currentRequest.getPathParam(pathParam.getValue(), false));
156156
}
157157
}
158158
}

independent-projects/resteasy-reactive/server/runtime/src/main/java/org/jboss/resteasy/reactive/server/mapping/RequestMapper.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@
88
import java.util.Map;
99
import java.util.regex.Matcher;
1010

11-
import org.jboss.resteasy.reactive.common.util.URIDecoder;
12-
1311
public class RequestMapper<T> {
1412

1513
private static final String[] EMPTY_STRING_ARRAY = new String[0];
@@ -111,7 +109,7 @@ private RequestMatch<T> mapFromPathMatcher(String path, PathMatcher.PathMatch<Ar
111109
while (matchPos < pathLength && path.charAt(matchPos) != '/') {
112110
matchPos++;
113111
}
114-
params[paramCount++] = URIDecoder.decodeURIComponent(path.substring(start, matchPos), false);
112+
params[paramCount++] = path.substring(start, matchPos);
115113
}
116114
}
117115
if (!matched) {

independent-projects/resteasy-reactive/server/vertx/src/test/java/org/jboss/resteasy/reactive/server/vertx/test/matching/RegexMatchTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public void testLiteralInRegex() {
4141
.then()
4242
.statusCode(200)
4343
.body(equalTo("plain:abb/foo/alongpathtotriggerbug"));
44+
RestAssured.get("/regex/first space/foo/second space")
45+
.then()
46+
.statusCode(200)
47+
.body(equalTo("plain:first space/foo/second space"));
4448
RestAssured.get("/regex/abb/literal/ddc")
4549
.then()
4650
.statusCode(200)

0 commit comments

Comments
 (0)