comparison src/org/eclipse/jetty/server/Request.java @ 859:3dcc52e17535

simplify multipart
author Franklin Schmidt <fschmidt@gmail.com>
date Wed, 21 Sep 2016 16:15:19 -0600
parents fa6158f29c45
children df84a1741687
comparison
equal deleted inserted replaced
858:dbbd9c3f14f8 859:3dcc52e17535
44 44
45 import javax.servlet.AsyncContext; 45 import javax.servlet.AsyncContext;
46 import javax.servlet.AsyncEvent; 46 import javax.servlet.AsyncEvent;
47 import javax.servlet.AsyncListener; 47 import javax.servlet.AsyncListener;
48 import javax.servlet.DispatcherType; 48 import javax.servlet.DispatcherType;
49 import javax.servlet.MultipartConfigElement;
50 import javax.servlet.RequestDispatcher; 49 import javax.servlet.RequestDispatcher;
51 import javax.servlet.ServletContext; 50 import javax.servlet.ServletContext;
52 import javax.servlet.ServletException; 51 import javax.servlet.ServletException;
53 import javax.servlet.ServletInputStream; 52 import javax.servlet.ServletInputStream;
54 import javax.servlet.ServletRequest; 53 import javax.servlet.ServletRequest;
87 import org.eclipse.jetty.util.AttributesMap; 86 import org.eclipse.jetty.util.AttributesMap;
88 import org.eclipse.jetty.util.IO; 87 import org.eclipse.jetty.util.IO;
89 import org.eclipse.jetty.util.LazyList; 88 import org.eclipse.jetty.util.LazyList;
90 import org.eclipse.jetty.util.MultiException; 89 import org.eclipse.jetty.util.MultiException;
91 import org.eclipse.jetty.util.MultiMap; 90 import org.eclipse.jetty.util.MultiMap;
92 import org.eclipse.jetty.util.MultiPartInputStream;
93 import org.eclipse.jetty.util.StringUtil; 91 import org.eclipse.jetty.util.StringUtil;
94 import org.eclipse.jetty.util.URIUtil; 92 import org.eclipse.jetty.util.URIUtil;
95 import org.eclipse.jetty.util.UrlEncoded; 93 import org.eclipse.jetty.util.UrlEncoded;
96 import org.slf4j.Logger; 94 import org.slf4j.Logger;
97 import org.slf4j.LoggerFactory; 95 import org.slf4j.LoggerFactory;
134 132
135 private static final String __ASYNC_FWD = "org.eclipse.asyncfwd"; 133 private static final String __ASYNC_FWD = "org.eclipse.asyncfwd";
136 private static final Collection __defaultLocale = Collections.singleton(Locale.getDefault()); 134 private static final Collection __defaultLocale = Collections.singleton(Locale.getDefault());
137 private static final int __NONE = 0, _STREAM = 1, __READER = 2; 135 private static final int __NONE = 0, _STREAM = 1, __READER = 2;
138 136
139 public static class MultiPartCleanerListener implements ServletRequestListener
140 {
141
142 @Override
143 public void requestDestroyed(ServletRequestEvent sre)
144 {
145 //Clean up any tmp files created by MultiPartInputStream
146 MultiPartInputStream mpis = (MultiPartInputStream)sre.getServletRequest().getAttribute(__MULTIPART_INPUT_STREAM);
147 if (mpis != null)
148 {
149 ContextHandler.Context context = (ContextHandler.Context)sre.getServletRequest().getAttribute(__MULTIPART_CONTEXT);
150
151 //Only do the cleanup if we are exiting from the context in which a servlet parsed the multipart files
152 if (context == sre.getServletContext())
153 {
154 try
155 {
156 mpis.deleteParts();
157 }
158 catch (MultiException e)
159 {
160 sre.getServletContext().log("Errors deleting multipart tmp files", e);
161 }
162 }
163 }
164 }
165
166 @Override
167 public void requestInitialized(ServletRequestEvent sre)
168 {
169 //nothing to do, multipart config set up by ServletHolder.handle()
170 }
171
172 }
173
174 137
175 /* ------------------------------------------------------------ */ 138 /* ------------------------------------------------------------ */
176 public static Request getRequest(HttpServletRequest request) 139 public static Request getRequest(HttpServletRequest request)
177 { 140 {
178 if (request instanceof Request) 141 if (request instanceof Request)
216 private long _timeStamp; 179 private long _timeStamp;
217 private long _dispatchTime; 180 private long _dispatchTime;
218 181
219 private Buffer _timeStampBuffer; 182 private Buffer _timeStampBuffer;
220 private HttpURI _uri; 183 private HttpURI _uri;
221
222 private MultiPartInputStream _multiPartInputStream; //if the request is a multi-part mime
223 184
224 /* ------------------------------------------------------------ */ 185 /* ------------------------------------------------------------ */
225 public Request() 186 public Request()
226 { 187 {
227 } 188 }
1387 if (_baseParameters != null) 1348 if (_baseParameters != null)
1388 _baseParameters.clear(); 1349 _baseParameters.clear();
1389 _parameters = null; 1350 _parameters = null;
1390 _paramsExtracted = false; 1351 _paramsExtracted = false;
1391 _inputState = __NONE; 1352 _inputState = __NONE;
1392
1393 _multiPartInputStream = null;
1394 } 1353 }
1395 1354
1396 /* ------------------------------------------------------------ */ 1355 /* ------------------------------------------------------------ */
1397 /* 1356 /*
1398 * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String) 1357 * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
1832 } 1791 }
1833 1792
1834 /* ------------------------------------------------------------ */ 1793 /* ------------------------------------------------------------ */
1835 public Part getPart(String name) throws IOException, ServletException 1794 public Part getPart(String name) throws IOException, ServletException
1836 { 1795 {
1837 getParts(); 1796 throw new UnsupportedOperationException();
1838 return _multiPartInputStream.getPart(name);
1839 } 1797 }
1840 1798
1841 /* ------------------------------------------------------------ */ 1799 /* ------------------------------------------------------------ */
1842 public Collection<Part> getParts() throws IOException, ServletException 1800 public Collection<Part> getParts() throws IOException, ServletException
1843 { 1801 {
1844 if (getContentType() == null || !getContentType().startsWith("multipart/form-data")) 1802 throw new UnsupportedOperationException();
1845 throw new ServletException("Content-Type != multipart/form-data");
1846
1847 if (_multiPartInputStream == null)
1848 _multiPartInputStream = (MultiPartInputStream)getAttribute(__MULTIPART_INPUT_STREAM);
1849
1850 if (_multiPartInputStream == null)
1851 {
1852 MultipartConfigElement config = (MultipartConfigElement)getAttribute(__MULTIPART_CONFIG_ELEMENT);
1853
1854 if (config == null)
1855 throw new IllegalStateException("No multipart config for servlet");
1856
1857 _multiPartInputStream = new MultiPartInputStream(getInputStream(),
1858 getContentType(), config,
1859 (_context != null?(File)_context.getAttribute("javax.servlet.context.tempdir"):null));
1860
1861 setAttribute(__MULTIPART_INPUT_STREAM, _multiPartInputStream);
1862 setAttribute(__MULTIPART_CONTEXT, _context);
1863 Collection<Part> parts = _multiPartInputStream.getParts(); //causes parsing
1864 for (Part p:parts)
1865 {
1866 MultiPartInputStream.MultiPart mp = (MultiPartInputStream.MultiPart)p;
1867 if (mp.getContentDispositionFilename() == null)
1868 {
1869 //Servlet Spec 3.0 pg 23, parts without filenames must be put into init params
1870 String charset = null;
1871 if (mp.getContentType() != null)
1872 charset = MimeTypes.getCharsetFromContentType(new ByteArrayBuffer(mp.getContentType()));
1873
1874 ByteArrayOutputStream os = null;
1875 InputStream is = mp.getInputStream(); //get the bytes regardless of being in memory or in temp file
1876 try
1877 {
1878 os = new ByteArrayOutputStream();
1879 IO.copy(is, os);
1880 String content=new String(os.toByteArray(),charset==null?StringUtil.__UTF8:charset);
1881 getParameter(""); //cause params to be evaluated
1882 getParameters().add(mp.getName(), content);
1883 }
1884 finally
1885 {
1886 IO.close(os);
1887 IO.close(is);
1888 }
1889 }
1890 }
1891 }
1892
1893 return _multiPartInputStream.getParts();
1894 } 1803 }
1895 1804
1896 /* ------------------------------------------------------------ */ 1805 /* ------------------------------------------------------------ */
1897 public void login(String username, String password) throws ServletException 1806 public void login(String username, String password) throws ServletException
1898 { 1807 {