diff --git a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index f5bbf557f0f..5d4e3cc7e60 100644 --- a/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -74,7 +74,7 @@ import org.eclipse.jetty.util.Attributes; import org.eclipse.jetty.util.AttributesMap; import org.eclipse.jetty.util.MultiException; import org.eclipse.jetty.util.MultiMap; -import org.eclipse.jetty.util.MultiPartInputStream; +import org.eclipse.jetty.util.MultiPartInputStreamParser; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.URIUtil; import org.eclipse.jetty.util.UrlEncoded; @@ -134,7 +134,7 @@ public class Request implements HttpServletRequest public void requestDestroyed(ServletRequestEvent sre) { //Clean up any tmp files created by MultiPartInputStream - MultiPartInputStream mpis = (MultiPartInputStream)sre.getServletRequest().getAttribute(__MULTIPART_INPUT_STREAM); + MultiPartInputStreamParser mpis = (MultiPartInputStreamParser)sre.getServletRequest().getAttribute(__MULTIPART_INPUT_STREAM); if (mpis != null) { ContextHandler.Context context = (ContextHandler.Context)sre.getServletRequest().getAttribute(__MULTIPART_CONTEXT); @@ -203,7 +203,7 @@ public class Request implements HttpServletRequest private long _timeStamp; private long _dispatchTime; private HttpURI _uri; - private MultiPartInputStream _multiPartInputStream; //if the request is a multi-part mime + private MultiPartInputStreamParser _multiPartInputStream; //if the request is a multi-part mime /* ------------------------------------------------------------ */ public Request(HttpChannel channel, HttpInput input) @@ -2000,7 +2000,7 @@ public class Request implements HttpServletRequest if (config == null) throw new IllegalStateException("No multipart config for servlet"); - _multiPartInputStream = new MultiPartInputStream(getInputStream(), + _multiPartInputStream = new MultiPartInputStreamParser(getInputStream(), getContentType(),config, (_context != null?(File)_context.getAttribute("javax.servlet.context.tempdir"):null)); setAttribute(__MULTIPART_INPUT_STREAM, _multiPartInputStream); @@ -2008,7 +2008,7 @@ public class Request implements HttpServletRequest Collection parts = _multiPartInputStream.getParts(); //causes parsing for (Part p:parts) { - MultiPartInputStream.MultiPart mp = (MultiPartInputStream.MultiPart)p; + MultiPartInputStreamParser.MultiPart mp = (MultiPartInputStreamParser.MultiPart)p; if (mp.getContentDispositionFilename() == null && mp.getFile() == null) { //Servlet Spec 3.0 pg 23, parts without filenames must be put into init params @@ -2039,7 +2039,7 @@ public class Request implements HttpServletRequest if (config == null) throw new IllegalStateException("No multipart config for servlet"); - _multiPartInputStream = new MultiPartInputStream(getInputStream(), + _multiPartInputStream = new MultiPartInputStreamParser(getInputStream(), getContentType(), config, (_context != null?(File)_context.getAttribute("javax.servlet.context.tempdir"):null)); @@ -2048,7 +2048,7 @@ public class Request implements HttpServletRequest Collection parts = _multiPartInputStream.getParts(); //causes parsing for (Part p:parts) { - MultiPartInputStream.MultiPart mp = (MultiPartInputStream.MultiPart)p; + MultiPartInputStreamParser.MultiPart mp = (MultiPartInputStreamParser.MultiPart)p; if (mp.getContentDispositionFilename() == null && mp.getFile() == null) { //Servlet Spec 3.0 pg 23, parts without filenames must be put into init params 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 749a1c5dcc9..c02262f2e4a 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 @@ -50,7 +50,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.MultiPartInputStreamParser; import org.eclipse.jetty.util.StringUtil; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; @@ -204,7 +204,7 @@ public class RequestTest @Override public void requestDestroyed(ServletRequestEvent sre) { - MultiPartInputStream m = (MultiPartInputStream)sre.getServletRequest().getAttribute(Request.__MULTIPART_INPUT_STREAM); + MultiPartInputStreamParser m = (MultiPartInputStreamParser)sre.getServletRequest().getAttribute(Request.__MULTIPART_INPUT_STREAM); ContextHandler.Context c = (ContextHandler.Context)sre.getServletRequest().getAttribute(Request.__MULTIPART_CONTEXT); assertNotNull (m); assertNotNull (c); diff --git a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java index 081457e7adc..0f6c67901d3 100644 --- a/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java +++ b/jetty-servlets/src/main/java/org/eclipse/jetty/servlets/MultiPartFilter.java @@ -48,7 +48,7 @@ import javax.servlet.http.Part; import org.eclipse.jetty.util.IO; import org.eclipse.jetty.util.LazyList; import org.eclipse.jetty.util.MultiMap; -import org.eclipse.jetty.util.MultiPartInputStream; +import org.eclipse.jetty.util.MultiPartInputStreamParser; import org.eclipse.jetty.util.StringUtil; /* ------------------------------------------------------------ */ @@ -141,7 +141,7 @@ public class MultiPartFilter implements Filter } MultipartConfigElement config = new MultipartConfigElement(tempdir.getCanonicalPath(), _maxFileSize, _maxRequestSize, _fileOutputBuffer); - MultiPartInputStream mpis = new MultiPartInputStream(in, content_type, config, tempdir); + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(in, content_type, config, tempdir); mpis.setDeleteOnExit(_deleteFiles); request.setAttribute(MULTIPART, mpis); try @@ -153,7 +153,7 @@ public class MultiPartFilter implements Filter while (itor.hasNext() && params.size() < _maxFormKeys) { Part p = itor.next(); - MultiPartInputStream.MultiPart mp = (MultiPartInputStream.MultiPart)p; + MultiPartInputStreamParser.MultiPart mp = (MultiPartInputStreamParser.MultiPart)p; if (mp.getFile() != null) { request.setAttribute(mp.getName(),mp.getFile()); @@ -191,7 +191,7 @@ public class MultiPartFilter implements Filter if (!_deleteFiles) return; - MultiPartInputStream mpis = (MultiPartInputStream)request.getAttribute(MULTIPART); + MultiPartInputStreamParser mpis = (MultiPartInputStreamParser)request.getAttribute(MULTIPART); if (mpis != null) { try diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStream.java b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java similarity index 92% rename from jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStream.java rename to jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java index c5f40118b88..7850eed4a5a 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStream.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/MultiPartInputStreamParser.java @@ -47,7 +47,7 @@ import javax.servlet.http.Part; * * Handle a MultiPart Mime input stream, breaking it up on the boundary into files and strings. */ -public class MultiPartInputStream +public class MultiPartInputStreamParser { public static final MultipartConfigElement __DEFAULT_MULTIPART_CONFIG = new MultipartConfigElement(System.getProperty("java.io.tmpdir")); protected InputStream _in; @@ -113,10 +113,10 @@ public class MultiPartInputStream protected void write (int b) throws IOException { - if (MultiPartInputStream.this._config.getMaxFileSize() > 0 && _size + 1 > MultiPartInputStream.this._config.getMaxFileSize()) + if (MultiPartInputStreamParser.this._config.getMaxFileSize() > 0 && _size + 1 > MultiPartInputStreamParser.this._config.getMaxFileSize()) throw new IllegalStateException ("Multipart Mime part "+_name+" exceeds max filesize"); - if (MultiPartInputStream.this._config.getFileSizeThreshold() > 0 && _size + 1 > MultiPartInputStream.this._config.getFileSizeThreshold() && _file==null) + if (MultiPartInputStreamParser.this._config.getFileSizeThreshold() > 0 && _size + 1 > MultiPartInputStreamParser.this._config.getFileSizeThreshold() && _file==null) createFile(); _out.write(b); _size ++; @@ -125,10 +125,10 @@ public class MultiPartInputStream protected void write (byte[] bytes, int offset, int length) throws IOException { - if (MultiPartInputStream.this._config.getMaxFileSize() > 0 && _size + length > MultiPartInputStream.this._config.getMaxFileSize()) + if (MultiPartInputStreamParser.this._config.getMaxFileSize() > 0 && _size + length > MultiPartInputStreamParser.this._config.getMaxFileSize()) throw new IllegalStateException ("Multipart Mime part "+_name+" exceeds max filesize"); - if (MultiPartInputStream.this._config.getFileSizeThreshold() > 0 && _size + length > MultiPartInputStream.this._config.getFileSizeThreshold() && _file==null) + if (MultiPartInputStreamParser.this._config.getFileSizeThreshold() > 0 && _size + length > MultiPartInputStreamParser.this._config.getFileSizeThreshold() && _file==null) createFile(); _out.write(bytes, offset, length); @@ -138,7 +138,7 @@ public class MultiPartInputStream protected void createFile () throws IOException { - _file = File.createTempFile("MultiPart", "", MultiPartInputStream.this._tmpDir); + _file = File.createTempFile("MultiPart", "", MultiPartInputStreamParser.this._tmpDir); if (_deleteOnExit) _file.deleteOnExit(); FileOutputStream fos = new FileOutputStream(_file); @@ -325,9 +325,9 @@ public class MultiPartInputStream * @param config MultipartConfigElement * @param contextTmpDir javax.servlet.context.tempdir */ - public MultiPartInputStream (InputStream in, String contentType, MultipartConfigElement config, File contextTmpDir) + public MultiPartInputStreamParser (InputStream in, String contentType, MultipartConfigElement config, File contextTmpDir) { - _in = new BufferedInputStream(in); + _in = new ReadLineInputStream(in); _contentType = contentType; _config = config; _contextTmpDir = contextTmpDir; @@ -372,7 +372,7 @@ public class MultiPartInputStream { try { - ((MultiPartInputStream.MultiPart)p).cleanUp(); + ((MultiPartInputStreamParser.MultiPart)p).cleanUp(); } catch(Exception e) { @@ -470,8 +470,7 @@ public class MultiPartInputStream byte[] byteBoundary=(boundary+"--").getBytes(StringUtil.__ISO_8859_1); // Get first boundary - byte[] bytes=TypeUtil.readLine(_in); - String line=bytes==null?null:new String(bytes,"UTF-8"); + String line = ((ReadLineInputStream)_in).readLine(); if(line==null || !line.equals(boundary)) { throw new IOException("Missing initial multi part boundary"); @@ -487,20 +486,20 @@ public class MultiPartInputStream MultiMap headers = new MultiMap(); while(true) { - bytes=TypeUtil.readLine(_in); - if(bytes==null) + line = ((ReadLineInputStream)_in).readLine(); + + //run out of input: + if (line == null) break outer; - - // If blank line, end of part headers - if(bytes.length==0) + + //end of headers: + if ("".equals(line)) break; - - total += bytes.length; + + total += line.length(); if (_config.getMaxRequestSize() > 0 && total > _config.getMaxRequestSize()) throw new IllegalStateException ("Request exceeds maxRequestSize ("+_config.getMaxRequestSize()+")"); - line=new String(bytes,"UTF-8"); - //get content-disposition and content-type int c=line.indexOf(':',0); if(c>0) @@ -514,7 +513,6 @@ public class MultiPartInputStream contentType = value; if(key.equals("content-transfer-encoding")) contentTransferEncoding=value; - } } @@ -600,7 +598,7 @@ public class MultiPartInputStream boolean cr=false; boolean lf=false; - // loop for all lines` + // loop for all lines while(true) { int b=0; @@ -615,7 +613,14 @@ public class MultiPartInputStream if(c==13||c==10) { if(c==13) - state=_in.read(); + { + _in.mark(1); + int tmp=_in.read(); + if (tmp!=10) + _in.reset(); + else + state=tmp; + } break; } // look for boundary diff --git a/jetty-util/src/main/java/org/eclipse/jetty/util/ReadLineInputStream.java b/jetty-util/src/main/java/org/eclipse/jetty/util/ReadLineInputStream.java index 7d04df90c81..3946ca07483 100644 --- a/jetty-util/src/main/java/org/eclipse/jetty/util/ReadLineInputStream.java +++ b/jetty-util/src/main/java/org/eclipse/jetty/util/ReadLineInputStream.java @@ -22,6 +22,11 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; +/** + * ReadLineInputStream + * + * Read from an input stream, accepting CR/LF, LF or just CR. + */ public class ReadLineInputStream extends BufferedInputStream { boolean _seenCRLF; diff --git a/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java index 951a7234046..31ff1c3f809 100644 --- a/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java +++ b/jetty-util/src/test/java/org/eclipse/jetty/util/MultiPartInputStreamTest.java @@ -43,7 +43,8 @@ import javax.servlet.MultipartConfigElement; import javax.servlet.ServletException; import javax.servlet.http.Part; -import org.eclipse.jetty.util.MultiPartInputStream.MultiPart; +import org.eclipse.jetty.util.MultiPartInputStreamParser.MultiPart; +import org.hamcrest.core.IsNot; import org.junit.Test; /** @@ -75,7 +76,7 @@ public class MultiPartInputStreamTest "\r\n--" + boundary + "-\r\n\r\n"; MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(str.getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(str.getBytes()), "multipart/form-data, boundary="+boundary, config, _tmpDir); @@ -122,7 +123,7 @@ public class MultiPartInputStreamTest "----\r\n"; MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(str.getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(str.getBytes()), "multipart/form-data", config, _tmpDir); @@ -157,7 +158,7 @@ public class MultiPartInputStreamTest throws Exception { MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(_multi.getBytes()), "Content-type: text/plain", config, _tmpDir); @@ -170,7 +171,7 @@ public class MultiPartInputStreamTest throws Exception { MultipartConfigElement config = new MultipartConfigElement(_dirname); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(_multi.getBytes()), _contentType, config, _tmpDir); @@ -184,7 +185,7 @@ public class MultiPartInputStreamTest throws Exception { MultipartConfigElement config = new MultipartConfigElement(_dirname, 60, 100, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(_multi.getBytes()), _contentType, config, _tmpDir); @@ -206,7 +207,7 @@ public class MultiPartInputStreamTest throws Exception { MultipartConfigElement config = new MultipartConfigElement(_dirname, 40, 1024, 30); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(_multi.getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(_multi.getBytes()), _contentType, config, _tmpDir); @@ -227,7 +228,7 @@ public class MultiPartInputStreamTest public void testPartFileNotDeleted () throws Exception { MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(createMultipartRequestString("tptfd").getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(createMultipartRequestString("tptfd").getBytes()), _contentType, config, _tmpDir); @@ -235,7 +236,7 @@ public class MultiPartInputStreamTest Collection parts = mpis.getParts(); MultiPart part = (MultiPart)mpis.getPart("stuff"); - File stuff = ((MultiPartInputStream.MultiPart)part).getFile(); + File stuff = ((MultiPartInputStreamParser.MultiPart)part).getFile(); assertThat(stuff,notNullValue()); // longer than 100 bytes, should already be a tmp file part.write("tptfd.txt"); File tptfd = new File (_dirname+File.separator+"tptfd.txt"); @@ -246,26 +247,136 @@ public class MultiPartInputStreamTest tptfd.deleteOnExit(); //clean up test } - + @Test public void testPartTmpFileDeletion () throws Exception { MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(createMultipartRequestString("tptfd").getBytes()), - _contentType, - config, - _tmpDir); + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(createMultipartRequestString("tptfd").getBytes()), + _contentType, + config, + _tmpDir); mpis.setDeleteOnExit(true); Collection parts = mpis.getParts(); - + MultiPart part = (MultiPart)mpis.getPart("stuff"); - File stuff = ((MultiPartInputStream.MultiPart)part).getFile(); + File stuff = ((MultiPartInputStreamParser.MultiPart)part).getFile(); assertThat(stuff,notNullValue()); // longer than 100 bytes, should already be a tmp file assertThat (stuff.exists(), is(true)); part.cleanUp(); assertThat(stuff.exists(), is(false)); //tmp file was removed after cleanup } + @Test + public void testLFOnlyRequest() + throws Exception + { + String str = "--AaB03x\n"+ + "content-disposition: form-data; name=\"field1\"\n"+ + "\n"+ + "Joe Blow\n"+ + "--AaB03x\n"+ + "content-disposition: form-data; name=\"field2\"\n"+ + "\n"+ + "Other\n"+ + "--AaB03x--\n"; + + MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(str.getBytes()), + _contentType, + config, + _tmpDir); + mpis.setDeleteOnExit(true); + Collection parts = mpis.getParts(); + assertThat(parts.size(), is(2)); + Part p1 = mpis.getPart("field1"); + assertThat(p1, notNullValue()); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + IO.copy(p1.getInputStream(), baos); + assertThat(baos.toString("UTF-8"), is("Joe Blow")); + + Part p2 = mpis.getPart("field2"); + assertThat(p2, notNullValue()); + baos = new ByteArrayOutputStream(); + IO.copy(p2.getInputStream(), baos); + assertThat(baos.toString("UTF-8"), is("Other")); + } + @Test + public void testCROnlyRequest() + throws Exception + { + String str = "--AaB03x\r"+ + "content-disposition: form-data; name=\"field1\"\r"+ + "\r"+ + "Joe Blow\r"+ + "--AaB03x\r"+ + "content-disposition: form-data; name=\"field2\"\r"+ + "\r"+ + "Other\r"+ + "--AaB03x--\r"; + + MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(str.getBytes()), + _contentType, + config, + _tmpDir); + mpis.setDeleteOnExit(true); + Collection parts = mpis.getParts(); + assertThat(parts.size(), is(2)); + + assertThat(parts.size(), is(2)); + Part p1 = mpis.getPart("field1"); + assertThat(p1, notNullValue()); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + IO.copy(p1.getInputStream(), baos); + assertThat(baos.toString("UTF-8"), is("Joe Blow")); + + Part p2 = mpis.getPart("field2"); + assertThat(p2, notNullValue()); + baos = new ByteArrayOutputStream(); + IO.copy(p2.getInputStream(), baos); + assertThat(baos.toString("UTF-8"), is("Other")); + } + + @Test + public void testCRandLFMixRequest() + throws Exception + { + String str = "--AaB03x\r"+ + "content-disposition: form-data; name=\"field1\"\r"+ + "\r"+ + "\nJoe Blow\n"+ + "\r"+ + "--AaB03x\r"+ + "content-disposition: form-data; name=\"field2\"\r"+ + "\r"+ + "Other\r"+ + "--AaB03x--\r"; + + MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(str.getBytes()), + _contentType, + config, + _tmpDir); + mpis.setDeleteOnExit(true); + Collection parts = mpis.getParts(); + assertThat(parts.size(), is(2)); + + Part p1 = mpis.getPart("field1"); + assertThat(p1, notNullValue()); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + IO.copy(p1.getInputStream(), baos); + assertThat(baos.toString("UTF-8"), is("\nJoe Blow\n")); + + Part p2 = mpis.getPart("field2"); + assertThat(p2, notNullValue()); + baos = new ByteArrayOutputStream(); + IO.copy(p2.getInputStream(), baos); + assertThat(baos.toString("UTF-8"), is("Other")); + } + + public void testMulti () throws Exception { @@ -281,7 +392,7 @@ public class MultiPartInputStreamTest private void testMulti(String filename) throws IOException, ServletException { MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(createMultipartRequestString(filename).getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(createMultipartRequestString(filename).getBytes()), _contentType, config, _tmpDir); @@ -297,9 +408,9 @@ public class MultiPartInputStreamTest assertEquals("Joe Blow", new String(os.toByteArray())); assertEquals(8, field1.getSize()); - assertNotNull(((MultiPartInputStream.MultiPart)field1).getBytes());//in internal buffer + assertNotNull(((MultiPartInputStreamParser.MultiPart)field1).getBytes());//in internal buffer field1.write("field1.txt"); - assertNull(((MultiPartInputStream.MultiPart)field1).getBytes());//no longer in internal buffer + assertNull(((MultiPartInputStreamParser.MultiPart)field1).getBytes());//no longer in internal buffer File f = new File (_dirname+File.separator+"field1.txt"); assertTrue(f.exists()); field1.write("another_field1.txt"); //write after having already written @@ -318,9 +429,9 @@ public class MultiPartInputStreamTest assertThat(stuff.getHeader("content-disposition"),is("form-data; name=\"stuff\"; filename=\"" + filename + "\"")); assertThat(stuff.getHeaderNames().size(),is(2)); assertThat(stuff.getSize(),is(51L)); - File tmpfile = ((MultiPartInputStream.MultiPart)stuff).getFile(); + File tmpfile = ((MultiPartInputStreamParser.MultiPart)stuff).getFile(); assertThat(tmpfile,notNullValue()); // longer than 100 bytes, should already be a tmp file - assertThat(((MultiPartInputStream.MultiPart)stuff).getBytes(),nullValue()); //not in an internal buffer + assertThat(((MultiPartInputStreamParser.MultiPart)stuff).getBytes(),nullValue()); //not in an internal buffer assertThat(tmpfile.exists(),is(true)); assertThat(tmpfile.getName(),is(not("stuff with space.txt"))); stuff.write(filename); @@ -355,7 +466,7 @@ public class MultiPartInputStreamTest "--AaB03x--\r\n"; MultipartConfigElement config = new MultipartConfigElement(_dirname, 1024, 3072, 50); - MultiPartInputStream mpis = new MultiPartInputStream(new ByteArrayInputStream(sameNames.getBytes()), + MultiPartInputStreamParser mpis = new MultiPartInputStreamParser(new ByteArrayInputStream(sameNames.getBytes()), _contentType, config, _tmpDir);