Author: markt
Date: Thu Apr 15 22:57:36 2010
New Revision: 934634

URL: http://svn.apache.org/viewvc?rev=934634&view=rev
Log:
Implement SRV.3.2. Non file parts should be exposed via getParameters()
Cache results so multiple calls to getParts() work

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationPart.java
    tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=934634&r1=934633&r2=934634&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Thu Apr 15 
22:57:36 2010
@@ -318,6 +318,18 @@ public class Request
 
 
     /**
+     * The parts, if any, uploaded with this request.
+     */
+    protected Collection<Part> parts = null;
+    
+    
+    /**
+     * The exception thrown, if any when parsing the parts.
+     */
+    protected Exception partsParseException = null;
+    
+    
+    /**
      * The currently active session for this request.
      */
     protected Session session = null;
@@ -441,6 +453,8 @@ public class Request
         subject = null;
         sessionParsed = false;
         parametersParsed = false;
+        parts = null;
+        partsParseException = null;
         cookiesParsed = false;
         locales.clear();
         localesParsed = false;
@@ -2431,11 +2445,35 @@ public class Request
     public Collection<Part> getParts() throws IOException, 
IllegalStateException,
             ServletException {
         
+        parseParts();
+        
+        if (partsParseException != null) {
+            if (partsParseException instanceof IOException) { 
+                throw (IOException) partsParseException;
+            } else if (partsParseException instanceof IllegalStateException) {
+                throw (IllegalStateException) partsParseException;
+            } else if (partsParseException instanceof ServletException) {
+                throw (ServletException) partsParseException;
+            }
+        }
+        
+        return parts;
+    }
+    
+    private void parseParts() {
+
+        // Return immediately if the parts have already been parsed
+        if (parts != null || partsParseException != null)
+            return;
+
         MultipartConfigElement mce = getWrapper().getMultipartConfigElement();
         if (mce == null) {
-            return Collections.emptyList();
+            parts = Collections.emptyList();
+            return;
         }
         
+        Parameters parameters = coyoteRequest.getParameters();
+        
         File location;
         String locationStr = mce.getLocation();
         if (locationStr == null || locationStr.length() == 0) {
@@ -2446,14 +2484,20 @@ public class Request
         }
         
         if (!location.isAbsolute() || !location.isDirectory()) {
-            throw new IOException(
+            partsParseException = new IOException(
                     sm.getString("coyoteRequest.uploadLocationInvalid",
                             location));
+            return;
         }
         
         // Create a new file upload handler
         DiskFileItemFactory factory = new DiskFileItemFactory();
-        factory.setRepository(location.getCanonicalFile());
+        try {
+            factory.setRepository(location.getCanonicalFile());
+        } catch (IOException ioe) {
+            partsParseException = ioe;
+            return;
+        }
         factory.setSizeThreshold(mce.getFileSizeThreshold());
         
         ServletFileUpload upload = new ServletFileUpload();
@@ -2461,31 +2505,48 @@ public class Request
         upload.setFileSizeMax(mce.getMaxFileSize());
         upload.setSizeMax(mce.getMaxRequestSize());
         
-        List<Part> result = new ArrayList<Part>();
+        parts = new ArrayList<Part>();
         try {
-           List<FileItem> items = upload.parseRequest(this);
-           for (FileItem item : items) {
-                result.add(new ApplicationPart(item, mce));
+            List<FileItem> items = upload.parseRequest(this);
+            for (FileItem item : items) {
+                ApplicationPart part = new ApplicationPart(item, mce);
+                parts.add(part);
+                if (part.getFilename() == null) {
+                    try {
+                        parameters.addParameterValues(part.getName(),
+                                new String[] {part.getString(
+                                        parameters.getEncoding())});
+                    } catch (UnsupportedEncodingException uee) {
+                        try {
+                            parameters.addParameterValues(part.getName(),
+                                    new String[] {part.getString(
+                                            Parameters.DEFAULT_ENCODING)});
+                        } catch (UnsupportedEncodingException e) {
+                            // Should not be possible
+                        }
+                    }
+                }
             }
             
         } catch (InvalidContentTypeException e) {
-            throw new ServletException(e);
+            partsParseException = new ServletException(e);
         } catch (FileUploadBase.SizeException e) {
-            throw new IllegalStateException(e);
+            partsParseException = new IllegalStateException(e);
         } catch (FileUploadException e) {
-            throw new IOException();
+            partsParseException = new IOException();
         }
         
-        return result;
+        return;
     }
-    
+
+
     /**
      * {...@inheritdoc}
      */
     public Part getPart(String name) throws IOException, IllegalStateException,
             ServletException {
-        Collection<Part> parts = getParts();
-        Iterator<Part> iterator = parts.iterator();
+        Collection<Part> c = getParts();
+        Iterator<Part> iterator = c.iterator();
         while (iterator.hasNext()) {
             Part part = iterator.next();
             if (name.equals(part.getName())) {
@@ -2677,6 +2738,12 @@ public class Request
         } else {
             contentType = contentType.trim();
         }
+        
+        if ("multipart/form-data".equals(contentType)) {
+            parseParts();
+            return;
+        }
+        
         if (!("application/x-www-form-urlencoded".equals(contentType)))
             return;
 

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationPart.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationPart.java?rev=934634&r1=934633&r2=934634&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationPart.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationPart.java Thu Apr 15 
22:57:36 2010
@@ -20,16 +20,19 @@ package org.apache.catalina.core;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Map;
 
 import javax.servlet.MultipartConfigElement;
 import javax.servlet.http.Part;
 
 import org.apache.tomcat.util.http.fileupload.DiskFileItem;
 import org.apache.tomcat.util.http.fileupload.FileItem;
+import org.apache.tomcat.util.http.fileupload.ParameterParser;
 
 /**
  * Adaptor to allow {...@link FileItem} objects generated by the package 
renamed
@@ -120,4 +123,37 @@ public class ApplicationPart implements 
         }
     }
 
+    public String getString(String encoding) throws 
UnsupportedEncodingException {
+        return fileItem.getString(encoding);
+    }
+
+    /*
+     * Adapted from FileUploadBase.getFileName()
+     */
+    public String getFilename() {
+        String fileName = null;
+        String cd = getHeader("Content-Disposition");
+        if (cd != null) {
+            String cdl = cd.toLowerCase();
+            if (cdl.startsWith("form-data") || cdl.startsWith("attachment")) {
+                ParameterParser paramParser = new ParameterParser();
+                paramParser.setLowerCaseNames(true);
+                // Parameter parser can handle null input
+                Map<String,String> params =
+                    paramParser.parse(cd, ';');
+                if (params.containsKey("filename")) {
+                    fileName = params.get("filename");
+                    if (fileName != null) {
+                        fileName = fileName.trim();
+                    } else {
+                        // Even if there is no value, the parameter is present,
+                        // so we return an empty file name rather than no file
+                        // name.
+                        fileName = "";
+                    }
+                }
+            }
+        }
+        return fileName;
+    }
 }

Modified: tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java?rev=934634&r1=934633&r2=934634&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/http/Parameters.java Thu Apr 15 
22:57:36 2010
@@ -66,6 +66,10 @@ public final class Parameters extends Mu
         this.queryMB=queryMB;
     }
 
+    public String getEncoding() {
+        return encoding;
+    }
+
     public void setEncoding( String s ) {
         encoding=s;
         if(log.isDebugEnabled()) {
@@ -194,7 +198,7 @@ public final class Parameters extends Mu
     private ByteChunk origName=new ByteChunk();
     private ByteChunk origValue=new ByteChunk();
     CharChunk tmpNameC=new CharChunk(1024);
-    private static final String DEFAULT_ENCODING = "ISO-8859-1";
+    public static final String DEFAULT_ENCODING = "ISO-8859-1";
     
     public void processParameters( byte bytes[], int start, int len ) {
         processParameters(bytes, start, len, encoding);



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to