353267 Request._parameters initialization bug
This commit is contained in:
parent
c984d25871
commit
479d9606ec
|
@ -186,79 +186,36 @@ public class Request implements HttpServletRequest
|
|||
|
||||
/* ------------------------------------------------------------ */
|
||||
/**
|
||||
* Extract Paramters from query string and/or form _content.
|
||||
* Extract Parameters from query string and/or form _content.
|
||||
*/
|
||||
public void extractParameters()
|
||||
{
|
||||
if (_baseParameters == null)
|
||||
_baseParameters = new MultiMap(16);
|
||||
|
||||
|
||||
if (_paramsExtracted)
|
||||
{
|
||||
if (_parameters==null)
|
||||
_parameters=_baseParameters;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
_paramsExtracted = true;
|
||||
|
||||
// Handle query string
|
||||
if (_uri!=null && _uri.hasQuery())
|
||||
try
|
||||
{
|
||||
if (_queryEncoding==null)
|
||||
_uri.decodeQueryTo(_baseParameters);
|
||||
else
|
||||
// Handle query string
|
||||
if (_uri!=null && _uri.hasQuery())
|
||||
{
|
||||
try
|
||||
{
|
||||
_uri.decodeQueryTo(_baseParameters,_queryEncoding);
|
||||
}
|
||||
catch (UnsupportedEncodingException e)
|
||||
{
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.warn(e);
|
||||
else
|
||||
LOG.warn(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// handle any _content.
|
||||
String encoding = getCharacterEncoding();
|
||||
String content_type = getContentType();
|
||||
if (content_type != null && content_type.length() > 0)
|
||||
{
|
||||
content_type = HttpFields.valueParameters(content_type, null);
|
||||
|
||||
if (MimeTypes.FORM_ENCODED.equalsIgnoreCase(content_type) && _inputState==__NONE &&
|
||||
(HttpMethods.POST.equals(getMethod()) || HttpMethods.PUT.equals(getMethod())))
|
||||
{
|
||||
int content_length = getContentLength();
|
||||
if (content_length != 0)
|
||||
if (_queryEncoding==null)
|
||||
_uri.decodeQueryTo(_baseParameters);
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
int maxFormContentSize=-1;
|
||||
|
||||
if (_context!=null)
|
||||
maxFormContentSize=_context.getContextHandler().getMaxFormContentSize();
|
||||
else
|
||||
{
|
||||
Integer size = (Integer)_connection.getConnector().getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormContentSize");
|
||||
if (size!=null)
|
||||
maxFormContentSize =size.intValue();
|
||||
}
|
||||
|
||||
if (content_length>maxFormContentSize && maxFormContentSize > 0)
|
||||
{
|
||||
throw new IllegalStateException("Form too large"+content_length+">"+maxFormContentSize);
|
||||
}
|
||||
InputStream in = getInputStream();
|
||||
|
||||
// Add form params to query params
|
||||
UrlEncoded.decodeTo(in, _baseParameters, encoding,content_length<0?maxFormContentSize:-1);
|
||||
_uri.decodeQueryTo(_baseParameters,_queryEncoding);
|
||||
}
|
||||
catch (IOException e)
|
||||
catch (UnsupportedEncodingException e)
|
||||
{
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.warn(e);
|
||||
|
@ -267,23 +224,75 @@ public class Request implements HttpServletRequest
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_parameters==null)
|
||||
_parameters=_baseParameters;
|
||||
else if (_parameters!=_baseParameters)
|
||||
{
|
||||
// Merge parameters (needed if parameters extracted after a forward).
|
||||
Iterator iter = _baseParameters.entrySet().iterator();
|
||||
while (iter.hasNext())
|
||||
|
||||
// handle any _content.
|
||||
String encoding = getCharacterEncoding();
|
||||
String content_type = getContentType();
|
||||
if (content_type != null && content_type.length() > 0)
|
||||
{
|
||||
Map.Entry entry = (Map.Entry)iter.next();
|
||||
String name=(String)entry.getKey();
|
||||
Object values=entry.getValue();
|
||||
for (int i=0;i<LazyList.size(values);i++)
|
||||
_parameters.add(name, LazyList.get(values, i));
|
||||
content_type = HttpFields.valueParameters(content_type, null);
|
||||
|
||||
if (MimeTypes.FORM_ENCODED.equalsIgnoreCase(content_type) && _inputState==__NONE &&
|
||||
(HttpMethods.POST.equals(getMethod()) || HttpMethods.PUT.equals(getMethod())))
|
||||
{
|
||||
int content_length = getContentLength();
|
||||
if (content_length != 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
int maxFormContentSize=-1;
|
||||
|
||||
if (_context!=null)
|
||||
maxFormContentSize=_context.getContextHandler().getMaxFormContentSize();
|
||||
else
|
||||
{
|
||||
Integer size = (Integer)_connection.getConnector().getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormContentSize");
|
||||
if (size!=null)
|
||||
maxFormContentSize =size.intValue();
|
||||
}
|
||||
|
||||
if (content_length>maxFormContentSize && maxFormContentSize > 0)
|
||||
{
|
||||
throw new IllegalStateException("Form too large"+content_length+">"+maxFormContentSize);
|
||||
}
|
||||
InputStream in = getInputStream();
|
||||
|
||||
// Add form params to query params
|
||||
UrlEncoded.decodeTo(in, _baseParameters, encoding,content_length<0?maxFormContentSize:-1);
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
if (LOG.isDebugEnabled())
|
||||
LOG.warn(e);
|
||||
else
|
||||
LOG.warn(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_parameters==null)
|
||||
_parameters=_baseParameters;
|
||||
else if (_parameters!=_baseParameters)
|
||||
{
|
||||
// Merge parameters (needed if parameters extracted after a forward).
|
||||
Iterator iter = _baseParameters.entrySet().iterator();
|
||||
while (iter.hasNext())
|
||||
{
|
||||
Map.Entry entry = (Map.Entry)iter.next();
|
||||
String name=(String)entry.getKey();
|
||||
Object values=entry.getValue();
|
||||
for (int i=0;i<LazyList.size(values);i++)
|
||||
_parameters.add(name, LazyList.get(values, i));
|
||||
}
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
//ensure params always set (even if empty) after extraction
|
||||
if (_parameters==null)
|
||||
_parameters=_baseParameters;
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------ */
|
||||
|
|
|
@ -24,12 +24,15 @@ import java.io.InputStream;
|
|||
import java.io.Reader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.eclipse.jetty.server.handler.AbstractHandler;
|
||||
import org.eclipse.jetty.util.IO;
|
||||
import org.eclipse.jetty.util.StringUtil;
|
||||
|
@ -68,7 +71,46 @@ public class RequestTest
|
|||
_server.stop();
|
||||
_server.join();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testParamExtraction() throws Exception
|
||||
{
|
||||
_handler._checker = new RequestTester()
|
||||
{
|
||||
public boolean check(HttpServletRequest request,HttpServletResponse response)
|
||||
{
|
||||
Map map = null;
|
||||
try
|
||||
{
|
||||
//do the parse
|
||||
request.getParameterMap();
|
||||
Assert.fail("Expected parsing failure");
|
||||
return false;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
//catch the error and check the param map is not null
|
||||
map = request.getParameterMap();
|
||||
assertFalse(map == null);
|
||||
assertTrue(map.isEmpty());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
//Send a request with query string with illegal hex code to cause
|
||||
//an exception parsing the params
|
||||
String request="GET /?param=%ZZaaa HTTP/1.1\r\n"+
|
||||
"Host: whatever\r\n"+
|
||||
"Content-Type: text/html;charset=utf8\n"+
|
||||
"\n";
|
||||
|
||||
String response = _connector.getResponses(request);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Test
|
||||
public void testContentTypeEncoding() throws Exception
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue