You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2019/10/07 19:04:20 UTC

[wicket] branch master updated: WICKET-6708 FormComponent should read only the GET/POST parameters of the request, not both

This is an automated email from the ASF dual-hosted git repository.

mgrigorov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new 0c19cf8  WICKET-6708 FormComponent should read only the GET/POST parameters of the request, not both
0c19cf8 is described below

commit 0c19cf8f1ba9d1677303fa7a38c1df04c9becd3f
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
AuthorDate: Mon Oct 7 22:03:22 2019 +0300

    WICKET-6708 FormComponent should read only the GET/POST parameters of the request, not both
---
 .../RestartResponseAtInterceptPageException.java   |  4 +-
 .../wicket/markup/html/form/FormComponent.java     | 49 ++++++++++++++++++++--
 .../protocol/http/servlet/ServletWebRequest.java   |  2 +-
 .../ajax/markup/html/AjaxEditableTest.java         | 10 +++--
 .../markup/html/form/select/SelectTest.java        | 23 +++++-----
 .../markup/html/form/select/SelectTestPage.java    |  4 +-
 6 files changed, 70 insertions(+), 22 deletions(-)

diff --git a/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java b/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java
index e592f69..c34fcb1 100644
--- a/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java
+++ b/wicket-core/src/main/java/org/apache/wicket/RestartResponseAtInterceptPageException.java
@@ -154,7 +154,7 @@ public class RestartResponseAtInterceptPageException extends ResetResponseExcept
 				}
 			}
 
-			data.postParameters = new HashMap<String, List<StringValue>>();
+			data.postParameters = new HashMap<>();
 			for (String s : request.getPostParameters().getParameterNames())
 			{
 				if (WebRequest.PARAM_AJAX.equals(s) || WebRequest.PARAM_AJAX_BASE_URL.equals(s) ||
@@ -162,7 +162,7 @@ public class RestartResponseAtInterceptPageException extends ResetResponseExcept
 				{
 					continue;
 				}
-				data.postParameters.put(s, new ArrayList<StringValue>(request.getPostParameters()
+				data.postParameters.put(s, new ArrayList<>(request.getPostParameters()
 					.getParameterValues(s)));
 			}
 			session.setMetaData(key, data);
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
index 976a553..0713582 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
@@ -31,6 +31,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import javax.servlet.http.HttpServletRequest;
+
 import org.apache.wicket.Application;
 import org.apache.wicket.Component;
 import org.apache.wicket.IConverterLocator;
@@ -46,6 +48,9 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.IObjectClassAwareModel;
 import org.apache.wicket.model.IPropertyReflectionAwareModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.request.IRequestParameters;
+import org.apache.wicket.request.Request;
+import org.apache.wicket.request.parameter.EmptyRequestParameters;
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.lang.Args;
@@ -754,8 +759,7 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme
 	 */
 	public String[] getInputAsArray()
 	{
-		List<StringValue> list = getRequest().getRequestParameters().getParameterValues(
-			getInputName());
+		List<StringValue> list = getParameterValues(getInputName());
 
 		String[] values = null;
 		if (list != null)
@@ -784,6 +788,45 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme
 	}
 
 	/**
+	 * Reads the value(s) of the request parameter with name <em>inputName</em>
+	 * from either the query parameters for <em>GET</em> method or the request body
+	 * for <em>POST</em> method.
+	 *
+	 * @param inputName
+	 *      The name of the request parameter
+	 * @return The parameter's value(s)
+	 */
+	protected List<StringValue> getParameterValues(String inputName)
+	{
+		String method = Form.METHOD_POST;
+		final Form form = findParent(Form.class);
+		final Request request = getRequest();
+		if (getRequest().getContainerRequest() instanceof HttpServletRequest)
+		{
+			method = ((HttpServletRequest) getRequest().getContainerRequest()).getMethod();
+		}
+		else if (form != null)
+		{
+			method = form.getMethod();
+		}
+
+		final IRequestParameters parameters;
+		switch (method)
+		{
+			case Form.METHOD_POST:
+				parameters = request.getPostParameters();
+				break;
+			case Form.METHOD_GET:
+				parameters = request.getQueryParameters();
+				break;
+			default:
+				parameters = EmptyRequestParameters.INSTANCE;
+		}
+
+		return parameters.getParameterValues(inputName);
+	}
+
+	/**
 	 * Gets the string to be used for the <tt>name</tt> attribute of the form element. Generated
 	 * using the path from the form to the component, excluding the form itself. Override it if you
 	 * want even a smaller name. E.g. if you know for sure that the id is unique within a form.
@@ -1565,7 +1608,7 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer impleme
 	 * 
 	 * If the model object does not yet exists, a new suitable collection is filled with the converted
 	 * input and used as the new model object. Otherwise the existing collection is modified
-	 * in-place, then {@link Model#setObject(Object)} is called with the same instance: it allows
+	 * in-place, then {@link IModel#setObject(Object)} is called with the same instance: it allows
 	 * the Model to be notified of changes even when {@link Model#getObject()} returns a different
 	 * {@link Collection} at every invocation.
 	 * 
diff --git a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
index e8fb669..a69660b 100644
--- a/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
+++ b/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
@@ -264,7 +264,7 @@ public class ServletWebRequest extends WebRequest
 	@Override
 	public List<String> getHeaders(String name)
 	{
-		List<String> result = new ArrayList<String>();
+		List<String> result = new ArrayList<>();
 		Enumeration<String> e = httpServletRequest.getHeaders(name);
 		while (e.hasMoreElements())
 		{
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
index 4083705..316201f 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/ajax/markup/html/AjaxEditableTest.java
@@ -24,10 +24,12 @@ import java.util.Arrays;
 import org.apache.wicket.Page;
 import org.apache.wicket.ajax.markup.html.AjaxLink;
 import org.apache.wicket.behavior.AbstractAjaxBehavior;
+import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.IObjectClassAwareModel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.protocol.http.mock.MockHttpServletRequest;
 import org.apache.wicket.request.IWritableRequestParameters;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.tester.WicketTestCase;
@@ -138,8 +140,10 @@ public class AjaxEditableTest extends WicketTestCase
 
 		FormComponent<?> editor = (FormComponent<?>)ajaxLabel.get("editor");
 		// set some new value and submit it
-		tester.getRequest().setParameter(editor.getInputName(), "something");
-		tester.getRequest().setParameter("save", "true");
+		final MockHttpServletRequest request = tester.getRequest();
+		request.setParameter(editor.getInputName(), "something");
+		request.setParameter("save", "true");
+		request.setMethod(Form.METHOD_GET);
 		tester.executeBehavior((AbstractAjaxBehavior)editor.getBehaviorById(0));
 
 		tester.assertInvisible("ajaxLabel:editor");
@@ -174,4 +178,4 @@ public class AjaxEditableTest extends WicketTestCase
 
 		assertTrue(integerModel.getObject() instanceof Integer);
 	}
-}
\ No newline at end of file
+}
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTest.java
index 6bb79d2..a234b00 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTest.java
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTest.java
@@ -19,6 +19,7 @@ package org.apache.wicket.extensions.markup.html.form.select;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import org.apache.wicket.util.tester.FormTester;
 import org.apache.wicket.util.tester.WicketTestCase;
 import org.junit.jupiter.api.Test;
 
@@ -30,7 +31,6 @@ public class SelectTest extends WicketTestCase
 
 	/**
 	 * WICKET-4276
-	 *
      */
 	@Test
 	public void rawInputKeepsSelectionOnError() {
@@ -38,9 +38,10 @@ public class SelectTest extends WicketTestCase
 
 		tester.startPage(page);
 
-		tester.getRequest().setParameter("select", page.option1.getValue());
+		final FormTester formTester = tester.newFormTester("form");
+		formTester.setValue("select", "option1");
 
-		tester.submitForm(page.form);
+		formTester.submit();
 
 		// form has error ...
 		assertTrue(page.form.hasError());
@@ -53,9 +54,10 @@ public class SelectTest extends WicketTestCase
 		// ... even after re-render
 		assertTrue(page.select.isSelected(page.option1));
 
-		tester.getRequest().setParameter("select", page.option1.getValue());
-		tester.getRequest().setParameter("text", "text is required");
-		tester.submitForm(page.form);
+		final FormTester formTester2 = tester.newFormTester("form");
+		formTester2.setValue("select", "option1");
+		formTester2.setValue("text", "text is required");
+		formTester2.submit();
 
 		// ... until successful submit without rawInput
 		assertFalse(page.select.hasRawInput());
@@ -68,7 +70,6 @@ public class SelectTest extends WicketTestCase
 	@Test
 	public void selectionWithouEquals()
 	{
-
 		SelectTestPage2 page = new SelectTestPage2();
 
 		assertTrue(page.select.isSelected(page.option0));
@@ -80,13 +81,13 @@ public class SelectTest extends WicketTestCase
 	@Test
 	public void optionText()
 	{
-
 		SelectTestPage3 page = new SelectTestPage3();
 
 		tester.startPage(page);
 
-		assertTrue(tester.getLastResponseAsString().contains("&lt;1&gt;"));
-		assertTrue(tester.getLastResponseAsString().contains("&lt;2&gt;"));
-		assertTrue(tester.getLastResponseAsString().contains("&lt;3&gt;"));
+		final String lastResponseAsString = tester.getLastResponseAsString();
+		assertTrue(lastResponseAsString.contains("&lt;1&gt;"));
+		assertTrue(lastResponseAsString.contains("&lt;2&gt;"));
+		assertTrue(lastResponseAsString.contains("&lt;3&gt;"));
 	}
 }
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTestPage.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTestPage.java
index e8eeae9..c87a504 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTestPage.java
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/select/SelectTestPage.java
@@ -35,7 +35,7 @@ public class SelectTestPage extends WebPage
 		form = new Form<>("form");
 		add(form);
 
-		select = new Select<>("select", new Model<String>(null));
+		select = new Select<>("select", new Model<>(null));
 		form.add(select);
 
 		select.add(new SelectOption<>("option0", new Model<>("OPTION_0")));
@@ -44,4 +44,4 @@ public class SelectTestPage extends WebPage
 
 		form.add(new TextField<>("text", new Model<>(null)).setRequired(true));
 	}
-}
\ No newline at end of file
+}