Author: fmeschbe
Date: Mon Feb 17 07:47:44 2014
New Revision: 1568890
URL: http://svn.apache.org/r1568890
Log:
Some cleanup in the parameter support and a few unit tests
Added:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java
- copied, changed from r1559665,
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
Removed:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterEntryImpl.java
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/pom.xml
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java
Modified: sling/whiteboard/fmeschbe/parameters/parameters/pom.xml
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/pom.xml?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
--- sling/whiteboard/fmeschbe/parameters/parameters/pom.xml (original)
+++ sling/whiteboard/fmeschbe/parameters/parameters/pom.xml Mon Feb 17 07:47:44
2014
@@ -59,13 +59,6 @@
<version>1.3</version>
<scope>provided</scope>
</dependency>
- <!--
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- </dependency>
- -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
@@ -73,6 +66,12 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.commons.osgi</artifactId>
+ <version>2.1.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
Copied:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java
(from r1559665,
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java)
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java?p2=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java&p1=sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java&r1=1559665&r2=1568890&rev=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterEntry.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/NamedRequestParameter.java
Mon Feb 17 07:47:44 2014
@@ -23,10 +23,11 @@ import org.apache.sling.api.request.Requ
import aQute.bnd.annotation.ProviderType;
@ProviderType
-public interface ParameterEntry {
+public interface NamedRequestParameter extends RequestParameter {
+ /**
+ * @return the name of this {@code RequestParameter}
+ */
String getName();
- RequestParameter getParameter();
-
}
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/ParameterSupport.java
Mon Feb 17 07:47:44 2014
@@ -26,6 +26,7 @@ import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
+
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.request.RequestParameterMap;
import
org.apache.sling.parameters.impl.ParameterSupportHttpServletRequestWrapper3;
@@ -37,6 +38,9 @@ import aQute.bnd.annotation.ProviderType
@ProviderType
public abstract class ParameterSupport {
+ /** The name of the form encoding parameter */
+ public final static String PARAMETER_FORMENCODING = "_charset_";
+
private static final String ATTR_NAME =
ParameterSupportImpl.class.getName();
public static ParameterSupport getInstance(ServletRequest servletRequest) {
@@ -90,6 +94,6 @@ public abstract class ParameterSupport {
public abstract RequestParameterMap getRequestParameterMap();
- public abstract List<ParameterEntry> getRequestParameterList();
+ public abstract List<NamedRequestParameter> getRequestParameterList();
}
\ No newline at end of file
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/AbstractRequestParameter.java
Mon Feb 17 07:47:44 2014
@@ -18,16 +18,27 @@
*/
package org.apache.sling.parameters.impl;
-import org.apache.sling.api.request.RequestParameter;
+import org.apache.sling.parameters.NamedRequestParameter;
-abstract class AbstractRequestParameter implements RequestParameter {
+abstract class AbstractRequestParameter implements NamedRequestParameter {
+
+ private String name;
private String encoding;
- protected AbstractRequestParameter(String encoding) {
+ protected AbstractRequestParameter(String name, String encoding) {
+ this.name = name;
this.encoding = encoding;
}
+ void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
void setEncoding(String encoding) {
this.encoding = encoding;
}
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ContainerRequestParameter.java
Mon Feb 17 07:47:44 2014
@@ -33,8 +33,8 @@ public class ContainerRequestParameter e
private byte[] content;
- public ContainerRequestParameter(String value, String encoding) {
- super(encoding);
+ public ContainerRequestParameter(String name, String value, String
encoding) {
+ super(name, encoding);
this.value = value;
this.content = null;
}
@@ -48,7 +48,7 @@ public class ContainerRequestParameter e
} catch (UnsupportedEncodingException uee) {
throw new SlingUnsupportedEncodingException(uee);
}
-
+
super.setEncoding(encoding);
}
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/MultipartRequestParameter.java
Mon Feb 17 07:47:44 2014
@@ -25,7 +25,12 @@ import java.io.UnsupportedEncodingExcept
import org.apache.commons.fileupload.FileItem;
/**
- * The <code>MultipartRequestParameter</code> TODO
+ * The <code>MultipartRequestParameter</code> represents a request parameter
+ * from a multipart/form-data POST request.
+ * <p>
+ * To not add a dependency to Servlet API 3 this class does not implement the
+ * Servlet API 3 {@code Part} interface. To support Servlet API 3 {@code Part}s
+ * the {@link SlingPart} class wraps instances of this class.
*/
public class MultipartRequestParameter extends AbstractRequestParameter {
@@ -35,11 +40,8 @@ public class MultipartRequestParameter e
private String cachedValue;
- /**
- *
- */
public MultipartRequestParameter(FileItem delegatee) {
- super(null);
+ super(delegatee.getFieldName(), null);
this.delegatee = delegatee;
}
@@ -57,30 +59,18 @@ public class MultipartRequestParameter e
cachedValue = null;
}
- /**
- * @see org.apache.sling.api.request.RequestParameter#get()
- */
public byte[] get() {
return this.delegatee.get();
}
- /**
- * @see org.apache.sling.api.request.RequestParameter#getContentType()
- */
public String getContentType() {
return this.delegatee.getContentType();
}
- /**
- * @see org.apache.sling.api.request.RequestParameter#getInputStream()
- */
public InputStream getInputStream() throws IOException {
return this.delegatee.getInputStream();
}
- /**
- * @see org.apache.sling.api.request.RequestParameter#getFileName()
- */
public String getFileName() {
if (this.encodedFileName == null && this.delegatee.getName() != null) {
String tmpFileName = this.delegatee.getName();
@@ -98,16 +88,10 @@ public class MultipartRequestParameter e
return this.encodedFileName;
}
- /**
- * @see org.apache.sling.api.request.RequestParameter#getSize()
- */
public long getSize() {
return this.delegatee.getSize();
}
- /**
- * @see org.apache.sling.api.request.RequestParameter#getString()
- */
public String getString() {
// only apply encoding in the case of a form field
if (this.isFormField()) {
@@ -136,16 +120,10 @@ public class MultipartRequestParameter e
return this.delegatee.getString();
}
- /**
- * @see
org.apache.sling.api.request.RequestParameter#getString(java.lang.String)
- */
public String getString(String enc) throws UnsupportedEncodingException {
return this.delegatee.getString(enc);
}
- /**
- * @see org.apache.sling.api.request.RequestParameter#isFormField()
- */
public boolean isFormField() {
return this.delegatee.isFormField();
}
@@ -155,7 +133,6 @@ public class MultipartRequestParameter e
return this.getString();
}
- return "File: " + this.getFileName() + " (" + this.getSize()
- + " bytes)";
+ return "File: " + this.getFileName() + " (" + this.getSize() + "
bytes)";
}
}
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterMap.java
Mon Feb 17 07:47:44 2014
@@ -29,7 +29,8 @@ import javax.servlet.http.Part;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.request.RequestParameterMap;
-import org.apache.sling.parameters.ParameterEntry;
+import org.apache.sling.parameters.NamedRequestParameter;
+import org.slf4j.LoggerFactory;
/**
* The <code>ParameterMap</code> TODO
@@ -39,9 +40,17 @@ public class ParameterMap extends Linked
private static final long serialVersionUID = -3984737679401682171L;
+ static final int DEFAULT_MAX_PARAMS = 10000;
+
+ private static int maxParameters = DEFAULT_MAX_PARAMS;
+
private Map<String, String[]> stringParameterMap;
- private List<ParameterEntry> requestParameters = new
ArrayList<ParameterEntry>();
+ private List<NamedRequestParameter> requestParameters = new
ArrayList<NamedRequestParameter>();
+
+ static void setMaxParameters(final int maxParameters) {
+ ParameterMap.maxParameters = (maxParameters > 0) ? maxParameters : -1;
+ }
public RequestParameter getValue(String name) {
RequestParameter[] params = getValues(name);
@@ -54,11 +63,25 @@ public class ParameterMap extends Linked
void renameParameter(String oldName, String newName) {
RequestParameter[] params = super.remove(oldName);
+
+ for (RequestParameter param : params) {
+ ((AbstractRequestParameter) param).setName(newName);
+ }
+
super.put(newName, params);
}
- public void addParameter(String name, RequestParameter parameter, boolean
prependNew) {
+ void addParameter(NamedRequestParameter parameter, boolean prependNew) {
+
+ // check number of parameters
+ if (this.requestParameters.size() == maxParameters) {
+ // TODO: how to handle this situation ?? just ignore or throw or
what ??
+ LoggerFactory.getLogger(Util.class).warn("Too many name/value
pairs, stopped processing after " + maxParameters + " entries");
+ return;
+ }
+
// map of parameters
+ final String name = parameter.getName();
RequestParameter[] current = this.get(name);
if (current == null) {
super.put(name, new RequestParameter[] { parameter });
@@ -71,7 +94,7 @@ public class ParameterMap extends Linked
}
// list of parameters
- this.requestParameters.add(new ParameterEntryImpl(name, parameter));
+ this.requestParameters.add(parameter);
}
void setParameters(String name, RequestParameter[] parameters) {
@@ -124,7 +147,7 @@ public class ParameterMap extends Linked
// ---------- Order Request Parameter access
- public List<ParameterEntry> getRequestParameterList() {
+ public List<NamedRequestParameter> getRequestParameterList() {
return Collections.unmodifiableList(requestParameters);
}
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/ParameterSupportImpl.java
Mon Feb 17 07:47:44 2014
@@ -18,7 +18,6 @@
*/
package org.apache.sling.parameters.impl;
-import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
@@ -37,7 +36,7 @@ import org.apache.commons.fileupload.ser
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.request.RequestParameterMap;
-import org.apache.sling.parameters.ParameterEntry;
+import org.apache.sling.parameters.NamedRequestParameter;
import org.apache.sling.parameters.ParameterSupport;
import org.apache.sling.parameters.SlingUnsupportedEncodingException;
import org.slf4j.LoggerFactory;
@@ -125,7 +124,7 @@ public class ParameterSupportImpl extend
return getRequestParameterMapInternal();
}
- public List<ParameterEntry> getRequestParameterList() {
+ public List<NamedRequestParameter> getRequestParameterList() {
return getRequestParameterMapInternal().getRequestParameterList();
}
@@ -171,8 +170,8 @@ public class ParameterSupportImpl extend
final String query = getServletRequest().getQueryString();
if (query != null) {
try {
- ByteArrayInputStream input = new
ByteArrayInputStream(query.getBytes(Util.ENCODING_DIRECT));
- Util.parseQueryString(input, encoding, parameters, false, -1);
+ InputStream input = Util.toInputStream(query);
+ Util.parseQueryString(input, encoding, parameters, false);
} catch (UnsupportedEncodingException e) {
// TODO: don't expect this, thus log !!
} catch (IOException e) {
@@ -182,10 +181,11 @@ public class ParameterSupportImpl extend
// only read input in case of multipart-POST not handled
// by the servlet container
- if ("POST".equals(this.getServletRequest().getMethod()) &&
WWW_FORM_URL_ENC.equalsIgnoreCase(this.getServletRequest().getContentType())) {
+ if ("POST".equals(this.getServletRequest().getMethod())
+ &&
WWW_FORM_URL_ENC.equalsIgnoreCase(this.getServletRequest().getContentType())) {
try {
InputStream input = this.getServletRequest().getInputStream();
- Util.parseQueryString(input, encoding, parameters, false, -1);
+ Util.parseQueryString(input, encoding, parameters, false);
} catch (IllegalArgumentException e) {
// TODO: don't expect this, thus log !!
} catch (UnsupportedEncodingException e) {
@@ -194,7 +194,7 @@ public class ParameterSupportImpl extend
// TODO: don't expect this, thus log !!
}
this.requestDataUsed = true;
- }
+ }
// final Map<?, ?> pMap = getServletRequest().getParameterMap();
// for (Map.Entry<?, ?> entry : pMap.entrySet()) {
@@ -238,8 +238,8 @@ public class ParameterSupportImpl extend
if (items != null && items.size() > 0) {
for (Iterator<?> ii = items.iterator(); ii.hasNext();) {
FileItem fileItem = (FileItem) ii.next();
- RequestParameter pp = new MultipartRequestParameter(fileItem);
- parameters.addParameter(fileItem.getFieldName(), pp, false);
+ NamedRequestParameter pp = new
MultipartRequestParameter(fileItem);
+ parameters.addParameter(pp, false);
}
}
}
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/main/java/org/apache/sling/parameters/impl/Util.java
Mon Feb 17 07:47:44 2014
@@ -26,24 +26,44 @@ import java.io.UnsupportedEncodingExcept
import java.util.LinkedHashMap;
import java.util.Map;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Property;
import org.apache.sling.api.request.RequestParameter;
-import org.slf4j.LoggerFactory;
+import org.apache.sling.commons.osgi.PropertiesUtil;
+import org.apache.sling.parameters.ParameterSupport;
-/**
- * The <code>Util</code> TODO
- */
+@Component(
+ metatype = true,
+ name = "org.apache.sling.parameters.config",
+ label = "Apache Sling Request Parameter Handling",
+ description = "Configures Sling's request parameter handling.")
public class Util {
- /** The name of the form encoding parameter */
- public final static String PARAMETER_FORMENCODING = "_charset_";
+ @Property(value = Util.ENCODING_DIRECT,
+ label = "Default Parameter Encoding",
+ description = "The default request parameter encoding used to
decode request "
+ + "parameters into strings. If this property is not set the
default encoding "
+ + "is 'ISO-8859-1' as mandated by the Servlet API spec. This
default encoding "
+ + "is used if the '_charset_' request parameter is not set to
another "
+ + "(supported) character encoding. Applications being sure to
always use the "
+ + "same encoding (e.g. UTF-8) can set this default here and
may omit the "
+ + "'_charset_' request parameter")
+ private static final String PROP_FIX_ENCODING =
"sling.default.parameter.encoding";
+
+ @Property(
+ intValue = ParameterMap.DEFAULT_MAX_PARAMS,
+ label = "Maximum POST Parameters",
+ description = "The maximum number of parameters supported. To
prevent a DOS-style attack with an "
+ + "overrunning number of parameters the number of parameters
supported can be limited. This "
+ + "includes all of the query string as well as
application/x-www-form-urlencoded and "
+ + "multipart/form-data parameters. The default value is " +
ParameterMap.DEFAULT_MAX_PARAMS + ".")
+ private static final String PROP_MAX_PARAMS =
"sling.default.max.parameters";
// ISO-8859-1 mapps all characters 0..255 to \u0000..\u00ff directly
public static final String ENCODING_DIRECT = "ISO-8859-1";
- // the default encoding used in #fixEncoding if the _charset_ request
- // parameter is not set
- private static String defaultFixEncoding = ENCODING_DIRECT;
-
// Default query (and www-form-encoded) parameter encoding as per
// HTML spec.
// see http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.1
@@ -51,6 +71,10 @@ public class Util {
public static final byte[] NO_CONTENT = new byte[0];
+ // the default encoding used in #fixEncoding if the _charset_ request
+ // parameter is not set
+ private static String defaultFixEncoding = ENCODING_DIRECT;
+
/** Parse state constant */
private static final int BEFORE_NAME = 0;
@@ -78,6 +102,14 @@ public class Util {
/** Parse state constant */
private static final int BEFORE_SEP = AFTER_VALUE + 1;
+ @Activate
+ @Deactivate
+ private void configure(Map<String, Object> props) {
+
setDefaultFixEncoding(PropertiesUtil.toString(props.get(PROP_FIX_ENCODING),
ENCODING_DIRECT));
+
ParameterMap.setMaxParameters(PropertiesUtil.toInteger(props.get(PROP_MAX_PARAMS),
+ ParameterMap.DEFAULT_MAX_PARAMS));
+ }
+
public static void setDefaultFixEncoding(final String encoding) {
defaultFixEncoding = validateEncoding(encoding);
}
@@ -110,17 +142,17 @@ public class Util {
return data;
}
- static InputStream getInputStream(String source) {
+ static InputStream toInputStream(String source) {
byte[] data = fromIdentityEncodedString(source);
return new ByteArrayInputStream(data);
}
- public static void fixEncoding(ParameterMap parameterMap) {
+ static void fixEncoding(ParameterMap parameterMap) {
// default the encoding to defaultFixEncoding
String formEncoding = defaultFixEncoding;
// check whether a form encoding parameter overwrites this default
- RequestParameter[] feParm = parameterMap.get(PARAMETER_FORMENCODING);
+ RequestParameter[] feParm =
parameterMap.get(ParameterSupport.PARAMETER_FORMENCODING);
if (feParm != null) {
// get and check form encoding
byte[] rawEncoding = feParm[0].get();
@@ -211,18 +243,16 @@ public class Util {
* @param encoding encoding to use for converting bytes to characters
* @param map map to populate
* @param prependNew whether to prepend new values
- * @param maxcount maximum name/value count to process;
- * <code>-1</code> to allow unlimited number
*
* @exception IllegalArgumentException if the query string is malformed
* @exception UnsupportedEncodingException if the encoding is not supported
* @throws IOException
*/
public static void parseQueryString(InputStream data, String encoding,
ParameterMap map,
- boolean prependNew, int maxcount)
+ boolean prependNew)
throws IllegalArgumentException, UnsupportedEncodingException,
IOException {
- parseNVPairString(data, encoding, map, '&', false, prependNew,
maxcount);
+ parseNVPairString(data, encoding, map, '&', false, prependNew);
}
/**
@@ -234,14 +264,12 @@ public class Util {
* @param separator multi-value separator character
* @param allowSpaces allow spaces inside name/values
* @param prependNew whether to prepend new values
- * @param maxcount maximum name/value count to process;
- * <code>-1</code> to allow unlimited number
*
* @exception IllegalArgumentException if the nv string is malformed
*/
private static void parseNVPairString(InputStream data, String encoding,
ParameterMap map,
char separator, boolean allowSpaces,
- boolean prependNew, int maxcount)
+ boolean prependNew)
throws IllegalArgumentException, UnsupportedEncodingException,
IOException {
ByteArrayOutputStream keyBuffer = new ByteArrayOutputStream(256);
@@ -278,14 +306,7 @@ public class Util {
state = ESC_NAME;
subState = 0;
} else if (ch == '&') {
- String key = keyBuffer.toString(encoding);
- if (count++ == maxcount) {
- LoggerFactory.getLogger(Util.class).warn("Too many
name/value pairs, stopped processing after " + maxcount + " entries");
- return;
- }
- addNVPair(map, key, "", encoding, prependNew);
- keyBuffer.reset();
- valueBuffer.reset();
+ addNVPair(map, keyBuffer, valueBuffer, encoding,
prependNew);
state = BEFORE_NAME;
} else {
keyBuffer.write(ch);
@@ -319,18 +340,7 @@ public class Util {
valueBuffer.write(' ');
state = INSIDE_VALUE;
} else if (ch == separator) {
- String key = keyBuffer.toString(encoding);
- String value = valueBuffer.toString(encoding);
-
- if (count++ == maxcount) {
- LoggerFactory.getLogger(Util.class).warn("Too many
name/value pairs, stopped processing after " + maxcount + " entries");
- return;
- }
- addNVPair(map, key, value, encoding, prependNew);
-
- keyBuffer.reset();
- valueBuffer.reset();
-
+ addNVPair(map, keyBuffer, valueBuffer, encoding,
prependNew);
state = BEFORE_NAME;
} else {
valueBuffer.write(ch);
@@ -339,18 +349,7 @@ public class Util {
break;
case INSIDE_VALUE:
if (ch == separator) {
- String key = keyBuffer.toString(encoding);
- String value = valueBuffer.toString(encoding);
-
- if (count++ == maxcount) {
- LoggerFactory.getLogger(Util.class).warn("Too many
name/value pairs, stopped processing after " + maxcount + " entries");
- return;
- }
- addNVPair(map, key, value, encoding, prependNew);
-
- keyBuffer.reset();
- valueBuffer.reset();
-
+ addNVPair(map, keyBuffer, valueBuffer, encoding,
prependNew);
state = BEFORE_NAME;
} else if (ch == '+' && !allowSpaces) {
valueBuffer.write(' ');
@@ -383,23 +382,21 @@ public class Util {
}
if (keyBuffer.size() > 0) {
- String key = keyBuffer.toString(encoding);
- String value = valueBuffer.toString(encoding);
-
- if (count++ == maxcount) {
- LoggerFactory.getLogger(Util.class).warn("Too many name/value
pairs, stopped processing after " + maxcount + " entries");
- return;
- }
- addNVPair(map, key, value, encoding, prependNew);
+ addNVPair(map, keyBuffer, valueBuffer, encoding, prependNew);
}
}
/**
* Add a name/value pair to a map. The values are string arrays
* @param encoding TODO
+ * @throws UnsupportedEncodingException If the provided encoding is not
supported
*/
- private static void addNVPair(ParameterMap map, String key, String value,
- String encoding, boolean prependNew) {
- map.addParameter(key, new ContainerRequestParameter(value, encoding),
prependNew);
+ private static void addNVPair(ParameterMap map, ByteArrayOutputStream
keyBuffer, ByteArrayOutputStream valueBuffer,
+ String encoding, boolean prependNew) throws
UnsupportedEncodingException {
+ final String key = keyBuffer.toString(encoding);
+ final String value = valueBuffer.toString(encoding);
+ map.addParameter(new ContainerRequestParameter(key, value, encoding),
prependNew);
+ keyBuffer.reset();
+ valueBuffer.reset();
}
}
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/ContainerRequestParameterTest.java
Mon Feb 17 07:47:44 2014
@@ -39,7 +39,7 @@ public class ContainerRequestParameterTe
// encoded LATIN-1 String of UTF-8 encoding
testInternal("\u00c3\u00b6\u00c3\u00a4\u00c3\u00bc", UTF8, LATIN1);
}
-
+
public void testChangeEncodingUpper() throws UnsupportedEncodingException {
// runic letter e, katakana letter pa, halfwidth katakana letter no
// encoded LATIN-1 String of UTF-8 encoding
@@ -48,7 +48,7 @@ public class ContainerRequestParameterTe
private void testInternal(String value, String baseEncoding,
String targetEncoding) throws UnsupportedEncodingException {
- ContainerRequestParameter par = new ContainerRequestParameter(value,
+ ContainerRequestParameter par = new ContainerRequestParameter("name",
value,
baseEncoding);
assertEquals(baseEncoding, par.getEncoding());
Modified:
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java
URL:
http://svn.apache.org/viewvc/sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java?rev=1568890&r1=1568889&r2=1568890&view=diff
==============================================================================
---
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java
(original)
+++
sling/whiteboard/fmeschbe/parameters/parameters/src/test/java/org/apache/sling/parameters/impl/UtilTest.java
Mon Feb 17 07:47:44 2014
@@ -18,8 +18,12 @@
*/
package org.apache.sling.parameters.impl;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
import java.io.UnsupportedEncodingException;
+import java.util.List;
+import org.apache.sling.parameters.NamedRequestParameter;
import org.apache.sling.parameters.impl.ContainerRequestParameter;
import org.apache.sling.parameters.impl.ParameterMap;
import org.apache.sling.parameters.impl.ParameterSupportImpl;
@@ -93,7 +97,7 @@ public class UtilTest extends TestCase {
public void test_fix_encoding_direct() throws UnsupportedEncodingException
{
ParameterMap pm = new ParameterMap();
- pm.addParameter("par", new ContainerRequestParameter(utf8Coded,
+ pm.addParameter(new ContainerRequestParameter("par", utf8Coded,
Util.ENCODING_DIRECT), false);
Util.fixEncoding(pm);
assertEquals(utf8Coded, pm.getValue("par").getString());
@@ -102,9 +106,9 @@ public class UtilTest extends TestCase {
public void test_fix_encoding_charset() {
ParameterMap pm2 = new ParameterMap();
- pm2.addParameter("par", new ContainerRequestParameter(utf8Coded,
+ pm2.addParameter(new ContainerRequestParameter("par", utf8Coded,
Util.ENCODING_DIRECT), false);
- pm2.addParameter("_charset_", new ContainerRequestParameter(utf8,
+ pm2.addParameter(new ContainerRequestParameter("_charset_", utf8,
Util.ENCODING_DIRECT), false);
Util.fixEncoding(pm2);
assertEquals(utf8String, pm2.getValue("par").getString());
@@ -112,11 +116,41 @@ public class UtilTest extends TestCase {
public void test_fix_encoding_configured() {
ParameterMap pm3 = new ParameterMap();
- pm3.addParameter("par", new ContainerRequestParameter(utf8Coded,
+ pm3.addParameter(new ContainerRequestParameter("par", utf8Coded,
Util.ENCODING_DIRECT), false);
Util.setDefaultFixEncoding(utf8);
Util.fixEncoding(pm3);
assertEquals(utf8String, pm3.getValue("par").getString());
Util.setDefaultFixEncoding(Util.ENCODING_DIRECT);
}
+
+ public void test_decode_query() throws IllegalArgumentException,
UnsupportedEncodingException, IOException {
+ final ParameterMap map = new ParameterMap();
+ final String query = "a=1&b=2&c=3";
+ Util.parseQueryString(new
ByteArrayInputStream(query.getBytes(Util.ENCODING_DIRECT)),
Util.ENCODING_DIRECT, map, false);
+
+ assertEquals(3, map.size());
+
+ List<NamedRequestParameter> pars = map.getRequestParameterList();
+ assertEquals(3, pars.size());
+ assertEquals("a", pars.get(0).getName());
+ assertEquals("1", pars.get(0).getString());
+ assertEquals("b", pars.get(1).getName());
+ assertEquals("2", pars.get(1).getString());
+ assertEquals("c", pars.get(2).getName());
+ assertEquals("3", pars.get(2).getString());
+ }
+
+ public void test_getParameter_with_space() throws Exception {
+ final ParameterMap map = new ParameterMap();
+ final String query =
"cmsaction=createPage&templateName=/apps/geometrixx/templates/contentpage"
+ + "&label=&title=Some Page&parentPath=/content/geometrixx";
+ Util.parseQueryString(new
ByteArrayInputStream(query.getBytes(Util.ENCODING_DIRECT)),
Util.ENCODING_DIRECT,
+ map, false);
+ assertEquals("createPage", map.getStringValue("cmsaction"));
+ assertEquals("/apps/geometrixx/templates/contentpage",
map.getStringValue("templateName"));
+ assertEquals("", map.getStringValue("label"));
+ assertEquals("Some Page", map.getStringValue("title"));
+ assertEquals("/content/geometrixx", map.getStringValue("parentPath"));
+ }
}