diff options
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.java | 163 |
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); + } + } + } } |