Skip to content

Commit

Permalink
Support empty target request path in FlashMap
Browse files Browse the repository at this point in the history
Prior to this commit, if the user configured an empty path for the
targetRequestPath property of a FlashMap, the FlashMapManager threw a
StringIndexOutOfBoundsException when saving the output FlashMap for the
next request.

This commit fixes this by skipping the decoding and normalization of an
empty target request path. An empty target request path is therefore
effectively treated as the root path.

Fixes gh-23240
  • Loading branch information
sbrannen committed Jul 7, 2019
1 parent d893cda commit 271885c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 36 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2017 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -41,6 +41,7 @@
*
* @author Rossen Stoyanchev
* @author Juergen Hoeller
* @author Sam Brannen
* @since 3.1.1
*/
public abstract class AbstractFlashMapManager implements FlashMapManager {
Expand Down Expand Up @@ -228,7 +229,7 @@ public final void saveOutputFlashMap(FlashMap flashMap, HttpServletRequest reque

@Nullable
private String decodeAndNormalizePath(@Nullable String path, HttpServletRequest request) {
if (path != null) {
if (path != null && !path.isEmpty()) {
path = getUrlPathHelper().decodeRequestString(request, path);
if (path.charAt(0) != '/') {
String requestUri = getUrlPathHelper().getRequestUri(request);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -16,47 +16,37 @@

package org.springframework.web.servlet.support;

import static org.junit.Assert.*;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.Before;
import org.junit.Test;

import org.springframework.mock.web.test.MockHttpServletRequest;
import org.springframework.mock.web.test.MockHttpServletResponse;
import org.springframework.web.servlet.FlashMap;
import org.springframework.web.util.WebUtils;

import static org.junit.Assert.*;

/**
* Test fixture for testing {@link AbstractFlashMapManager} methods.
*
* @author Rossen Stoyanchev
* @author Sam Brannen
*/
public class FlashMapManagerTests {

private TestFlashMapManager flashMapManager;

private MockHttpServletRequest request;
private final TestFlashMapManager flashMapManager = new TestFlashMapManager();

private MockHttpServletResponse response;
private final MockHttpServletRequest request = new MockHttpServletRequest();


@Before
public void setup() {
this.flashMapManager = new TestFlashMapManager();
this.request = new MockHttpServletRequest();
this.response = new MockHttpServletResponse();
}
private final MockHttpServletResponse response = new MockHttpServletResponse();


@Test
Expand All @@ -73,9 +63,7 @@ public void retrieveAndUpdateMatchByPath() {
assertEquals(flashMap, inputFlashMap);
}

// SPR-8779

@Test
@Test // SPR-8779
public void retrieveAndUpdateMatchByOriginatingPath() {
FlashMap flashMap = new FlashMap();
flashMap.put("key", "value");
Expand Down Expand Up @@ -133,9 +121,7 @@ public void retrieveAndUpdateMatchByParams() {
assertEquals("Input FlashMap should have been removed", 0, this.flashMapManager.getFlashMaps().size());
}

// SPR-8798

@Test
@Test // SPR-8798
public void retrieveAndUpdateMatchWithMultiValueParam() {
FlashMap flashMap = new FlashMap();
flashMap.put("name", "value");
Expand Down Expand Up @@ -180,7 +166,7 @@ public void retrieveAndUpdateSortMultipleMatches() {
}

@Test
public void retrieveAndUpdateRemoveExpired() throws InterruptedException {
public void retrieveAndUpdateRemoveExpired() {
List<FlashMap> flashMaps = new ArrayList<>();
for (int i = 0; i < 5; i++) {
FlashMap expiredFlashMap = new FlashMap();
Expand All @@ -195,7 +181,7 @@ public void retrieveAndUpdateRemoveExpired() throws InterruptedException {
}

@Test
public void saveOutputFlashMapEmpty() throws InterruptedException {
public void saveOutputFlashMapEmpty() {
FlashMap flashMap = new FlashMap();

this.flashMapManager.saveOutputFlashMap(flashMap, this.request, this.response);
Expand All @@ -205,7 +191,7 @@ public void saveOutputFlashMapEmpty() throws InterruptedException {
}

@Test
public void saveOutputFlashMap() throws InterruptedException {
public void saveOutputFlashMap() {
FlashMap flashMap = new FlashMap();
flashMap.put("name", "value");

Expand All @@ -219,7 +205,7 @@ public void saveOutputFlashMap() throws InterruptedException {
}

@Test
public void saveOutputFlashMapDecodeTargetPath() throws InterruptedException {
public void saveOutputFlashMapDecodeTargetPath() {
FlashMap flashMap = new FlashMap();
flashMap.put("key", "value");

Expand All @@ -230,7 +216,7 @@ public void saveOutputFlashMapDecodeTargetPath() throws InterruptedException {
}

@Test
public void saveOutputFlashMapNormalizeTargetPath() throws InterruptedException {
public void saveOutputFlashMapNormalizeTargetPath() {
FlashMap flashMap = new FlashMap();
flashMap.put("key", "value");

Expand Down Expand Up @@ -265,11 +251,19 @@ public void saveOutputFlashMapNormalizeTargetPath() throws InterruptedException
assertEquals("/once/only", flashMap.getTargetRequestPath());
}

// SPR-9657, SPR-11504
@Test // gh-23240
public void saveOutputFlashMapAndNormalizeEmptyTargetPath() {
FlashMap flashMap = new FlashMap();
flashMap.put("key", "value");

@Test
public void saveOutputFlashMapDecodeParameters() throws Exception {
flashMap.setTargetRequestPath("");
this.flashMapManager.saveOutputFlashMap(flashMap, this.request, this.response);

assertEquals("", flashMap.getTargetRequestPath());
}

@Test // SPR-9657, SPR-11504
public void saveOutputFlashMapDecodeParameters() throws Exception {
FlashMap flashMap = new FlashMap();
flashMap.put("key", "value");
flashMap.setTargetRequestPath("/path");
Expand All @@ -295,11 +289,8 @@ public void saveOutputFlashMapDecodeParameters() throws Exception {
assertEquals("value", flashMap.get("key"));
}

// SPR-12569

@Test
@Test // SPR-12569
public void flashAttributesWithQueryParamsWithSpace() throws Exception {

String encodedValue = URLEncoder.encode("1 2", "UTF-8");

FlashMap flashMap = new FlashMap();
Expand Down

0 comments on commit 271885c

Please sign in to comment.