Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java')
-rw-r--r--jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java163
1 files changed, 160 insertions, 3 deletions
diff --git a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
index f60ea4d65f..51f12d32af 100644
--- a/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
+++ b/jetty-server/src/test/java/org/eclipse/jetty/server/RequestTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertNotNull;
import java.io.BufferedReader;
import java.io.File;
@@ -36,10 +37,13 @@ import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
+import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletException;
+import javax.servlet.ServletRequestEvent;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.Part;
import junit.framework.Assert;
@@ -47,6 +51,7 @@ import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.IO;
+import org.eclipse.jetty.util.MultiPartInputStream;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.log.Log;
import org.junit.After;
@@ -127,6 +132,113 @@ public class RequestTest
assertTrue(responses.startsWith("HTTP/1.1 200"));
}
+
+ @Test
+ public void testMultiPartNoConfig() throws Exception
+ {
+ _handler._checker = new RequestTester()
+ {
+ public boolean check(HttpServletRequest request,HttpServletResponse response)
+ {
+ try
+ {
+ Part foo = request.getPart("stuff");
+ return false;
+ }
+ catch (IllegalStateException e)
+ {
+ //expected exception because no multipart config is set up
+ assertTrue(e.getMessage().startsWith("No multipart config"));
+ return true;
+ }
+ catch (Exception e)
+ {
+ return false;
+ }
+ }
+ };
+
+ String multipart = "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"field1\"\r\n"+
+ "\r\n"+
+ "Joe Blow\r\n"+
+ "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"stuff\"\r\n"+
+ "Content-Type: text/plain;charset=ISO-8859-1\r\n"+
+ "\r\n"+
+ "000000000000000000000000000000000000000000000000000\r\n"+
+ "--AaB03x--\r\n";
+
+ String request="GET / HTTP/1.1\r\n"+
+ "Host: whatever\r\n"+
+ "Content-Type: multipart/form-data; boundary=\"AaB03x\"\r\n"+
+ "Content-Length: "+multipart.getBytes().length+"\r\n"+
+ "\r\n"+
+ multipart;
+
+ String responses=_connector.getResponses(request);
+ assertTrue(responses.startsWith("HTTP/1.1 200"));
+ }
+
+
+ @Test
+ public void testMultiPart() throws Exception
+ {
+ final File tmpDir = new File (System.getProperty("java.io.tmpdir"));
+ final File testTmpDir = new File (tmpDir, "reqtest");
+ testTmpDir.deleteOnExit();
+ assertTrue(testTmpDir.mkdirs());
+ assertTrue(testTmpDir.list().length == 0);
+
+ ContextHandler contextHandler = new ContextHandler();
+ contextHandler.setContextPath("/foo");
+ contextHandler.setResourceBase(".");
+ contextHandler.setHandler(new MultiPartRequestHandler(testTmpDir));
+ contextHandler.addEventListener(new Request.MultiPartCleanerListener()
+ {
+
+ @Override
+ public void requestDestroyed(ServletRequestEvent sre)
+ {
+ MultiPartInputStream m = (MultiPartInputStream)sre.getServletRequest().getAttribute(Request.__MULTIPART_INPUT_STREAM);
+ ContextHandler.Context c = (ContextHandler.Context)sre.getServletRequest().getAttribute(Request.__MULTIPART_CONTEXT);
+ assertNotNull (m);
+ assertNotNull (c);
+ assertTrue(c == sre.getServletContext());
+ assertTrue(!m.getParsedParts().isEmpty());
+ assertTrue(testTmpDir.list().length == 2);
+ super.requestDestroyed(sre);
+ String[] files = testTmpDir.list();
+ assertTrue(files.length == 0);
+ }
+
+ });
+ _server.stop();
+ _server.setHandler(contextHandler);
+ _server.start();
+
+ String multipart = "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"field1\"\r\n"+
+ "\r\n"+
+ "Joe Blow\r\n"+
+ "--AaB03x\r\n"+
+ "content-disposition: form-data; name=\"stuff\"; filename=\"foo.upload\"\r\n"+
+ "Content-Type: text/plain;charset=ISO-8859-1\r\n"+
+ "\r\n"+
+ "000000000000000000000000000000000000000000000000000\r\n"+
+ "--AaB03x--\r\n";
+
+ String request="GET /foo/x.html HTTP/1.1\r\n"+
+ "Host: whatever\r\n"+
+ "Content-Type: multipart/form-data; boundary=\"AaB03x\"\r\n"+
+ "Content-Length: "+multipart.getBytes().length+"\r\n"+
+ "\r\n"+
+ multipart;
+
+ String responses=_connector.getResponses(request);
+ System.err.println(responses);
+ assertTrue(responses.startsWith("HTTP/1.1 200"));
+ }
@Test
public void testBadUtf8ParamExtraction() throws Exception
@@ -670,10 +782,12 @@ public class RequestTest
assertNotSame(cookies.get(1), cookies.get(3));
cookies.clear();
+//NOTE: the javax.servlet.http.Cookie class sets the system property org.glassfish.web.rfc2109_cookie_names_enforced
+//to TRUE by default, and rejects all cookie names containing punctuation.Therefore this test cannot use "name2".
response=_connector.getResponses(
"POST / HTTP/1.1\r\n"+
"Host: whatever\r\n"+
- "Cookie: name0=value0; name1 = value1 ; \"\\\"name2\\\"\" = \"\\\"value2\\\"\" \n" +
+ "Cookie: name0=value0; name1 = value1 ; \"name2\" = \"\\\"value2\\\"\" \n" +
"Cookie: $Version=2; name3=value3=value3;$path=/path;$domain=acme.com;$port=8080; name4=; name5 = ; name6\n" +
"Cookie: name7=value7;\n" +
"Connection: close\r\n"+
@@ -683,7 +797,7 @@ public class RequestTest
assertEquals("value0", cookies.get(0).getValue());
assertEquals("name1", cookies.get(1).getName());
assertEquals("value1", cookies.get(1).getValue());
- assertEquals("\"name2\"", cookies.get(2).getName());
+ assertEquals("name2", cookies.get(2).getName());
assertEquals("\"value2\"", cookies.get(2).getValue());
assertEquals("name3", cookies.get(3).getName());
assertEquals("value3=value3", cookies.get(3).getValue());
@@ -850,7 +964,9 @@ public class RequestTest
{
((Request)request).setHandled(true);
- if (request.getContentLength()>0 && !MimeTypes.FORM_ENCODED.equals(request.getContentType()))
+ if (request.getContentLength()>0
+ && !MimeTypes.FORM_ENCODED.equals(request.getContentType())
+ && !request.getContentType().startsWith("multipart/form-data"))
_content=IO.toString(request.getInputStream());
if (_checker!=null && _checker.check(request,response))
@@ -861,4 +977,45 @@ public class RequestTest
}
}
+
+ private class MultiPartRequestHandler extends AbstractHandler
+ {
+ File tmpDir;
+
+ public MultiPartRequestHandler(File tmpDir)
+ {
+ this.tmpDir = tmpDir;
+ }
+
+
+ @Override
+ public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
+ {
+ ((Request)request).setHandled(true);
+ try
+ {
+
+ MultipartConfigElement mpce = new MultipartConfigElement(tmpDir.getAbsolutePath(),-1, -1, 2);
+ request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, mpce);
+
+ String field1 = request.getParameter("field1");
+ assertNotNull(field1);
+
+ Part foo = request.getPart("stuff");
+ assertNotNull(foo);
+ assertTrue(foo.getSize() > 0);
+ response.setStatus(200);
+ }
+ catch (IllegalStateException e)
+ {
+ //expected exception because no multipart config is set up
+ assertTrue(e.getMessage().startsWith("No multipart config"));
+ response.setStatus(200);
+ }
+ catch (Exception e)
+ {
+ response.sendError(500);
+ }
+ }
+ }
}

Back to the top