Fix HttpSessionRequestCache#getMatchingRequest query string parsing
- URL parsing changed in framework 6.2, and fails when path contains a % sign. - The HttpSessionRequestCache only needs to inspect the query string, not the full URL. Fixes gh-16656 Signed-off-by: Daniel Garnier-Moiroux <git@garnier.wf>
This commit is contained in:
parent
db34de59bc
commit
ae998c7b52
|
@ -103,11 +103,11 @@ public class HttpSessionRequestCache implements RequestCache {
|
||||||
@Override
|
@Override
|
||||||
public HttpServletRequest getMatchingRequest(HttpServletRequest request, HttpServletResponse response) {
|
public HttpServletRequest getMatchingRequest(HttpServletRequest request, HttpServletResponse response) {
|
||||||
if (this.matchingRequestParameterName != null) {
|
if (this.matchingRequestParameterName != null) {
|
||||||
if (!StringUtils.hasText(request.getQueryString())
|
if (!StringUtils.hasText(request.getQueryString()) || !UriComponentsBuilder.newInstance()
|
||||||
|| !UriComponentsBuilder.fromUriString(UrlUtils.buildRequestUrl(request))
|
.query(request.getQueryString())
|
||||||
.build()
|
.build()
|
||||||
.getQueryParams()
|
.getQueryParams()
|
||||||
.containsKey(this.matchingRequestParameterName)) {
|
.containsKey(this.matchingRequestParameterName)) {
|
||||||
this.logger.trace(
|
this.logger.trace(
|
||||||
"matchingRequestParameterName is required for getMatchingRequest to lookup a value, but not provided");
|
"matchingRequestParameterName is required for getMatchingRequest to lookup a value, but not provided");
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -168,6 +168,21 @@ public class HttpSessionRequestCacheTests {
|
||||||
verify(request, never()).getParameterMap();
|
verify(request, never()).getParameterMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// gh-16656
|
||||||
|
@Test
|
||||||
|
public void getMatchingRequestWhenMatchingRequestPathContainsPercentSignThenLookedUp() {
|
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
|
request.setServletPath("/30 % off");
|
||||||
|
HttpSessionRequestCache cache = new HttpSessionRequestCache();
|
||||||
|
cache.saveRequest(request, new MockHttpServletResponse());
|
||||||
|
MockHttpServletRequest requestToMatch = new MockHttpServletRequest();
|
||||||
|
requestToMatch.setServletPath("/30 % off");
|
||||||
|
requestToMatch.setQueryString("continue");
|
||||||
|
requestToMatch.setSession(request.getSession());
|
||||||
|
HttpServletRequest matchingRequest = cache.getMatchingRequest(requestToMatch, new MockHttpServletResponse());
|
||||||
|
assertThat(matchingRequest).isNotNull();
|
||||||
|
}
|
||||||
|
|
||||||
private static final class CustomSavedRequest implements SavedRequest {
|
private static final class CustomSavedRequest implements SavedRequest {
|
||||||
|
|
||||||
private final SavedRequest delegate;
|
private final SavedRequest delegate;
|
||||||
|
|
Loading…
Reference in New Issue