Changeset c299976 for apps/jetty


Ignore:
Timestamp:
Dec 4, 2017 4:08:03 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
7f5f764
Parents:
14941d0d
Message:

Jetty: Refactor (rather than remove) RequestWrapper? to use Servlet 3.0 API.
Remove old org.mortbay helper classes copied from Jetty 5, saving about 24 KB.
Large attachments will now be written to temp files. (ticket #2109)

Location:
apps/jetty/java/src
Files:
6 deleted
1 edited

Legend:

Unmodified
Added
Removed
  • apps/jetty/java/src/net/i2p/servlet/RequestWrapper.java

    r14941d0d rc299976  
    3131import java.util.Map;
    3232
     33import javax.servlet.ServletException;
    3334import javax.servlet.http.HttpServletRequest;
    3435import javax.servlet.http.HttpSession;
    35 
    36 import org.mortbay.servlet.MultiPartRequest;
     36import javax.servlet.http.Part;
     37
     38import net.i2p.I2PAppContext;
     39import net.i2p.data.DataHelper;
     40import net.i2p.util.Log;
    3741
    3842/**
     43 *  Refactored in 0.9.33 to use Servlet 3.0 API and remove dependency
     44 *  on old Jetty 5 MultiPartRequest code. See ticket 2109.
     45 *
     46 *  Previous history:
     47 *
    3948 *  Required major changes for Jetty 6
    4049 *  to support change from MultiPartRequest to MultiPartFilter.
     
    5362 *  @author user
    5463 *  @since 0.9.19 moved from susimail so it may be used by routerconsole too
    55  *  @deprecated scheduled for removal in 0.9.34, see ticket #2109
    5664 */
    57 @Deprecated
    5865public class RequestWrapper {
    5966
    6067        private final HttpServletRequest httpRequest;
    61         private final MultiPartRequest multiPartRequest;
     68        private final boolean isMultiPartRequest;
    6269        private final Hashtable<String, String> cache;
    6370        private Hashtable<String, Integer> cachedParameterNames;
     71        private static final int MAX_STRING_SIZE = 64*1024;
    6472
    6573        /**
     
    7078                this.httpRequest = httpRequest;
    7179                String contentType = httpRequest.getContentType();
    72                 MultiPartRequest mpr = null;
    73                 if( contentType != null && contentType.toLowerCase(Locale.US).startsWith( "multipart/form-data" ) ) {
    74                         try {
    75                                 mpr = new MultiPartRequest( httpRequest );
    76                         } catch (OutOfMemoryError oome) {
    77                                 // TODO Throw ioe from constructor?
    78                                 oome.printStackTrace();
    79                         } catch (IOException e) {
    80                                 // TODO Throw ioe from constructor?
    81                                 e.printStackTrace();
    82                         }
    83                 }
    84                 multiPartRequest = mpr;
     80                isMultiPartRequest = contentType != null && contentType.toLowerCase(Locale.US).startsWith("multipart/form-data");
    8581        }
    8682
     
    107103         * @return List of request parameter names
    108104         */
    109         @SuppressWarnings("unchecked") // TODO-Java6: Remove, type is correct
    110105        public Enumeration<String> getParameterNames() {
    111                 if( multiPartRequest != null ) {
     106                if (isMultiPartRequest) {
    112107                        if( cachedParameterNames == null ) {
    113108                                cachedParameterNames = new Hashtable<String, Integer>();
    114                                 String[] partNames = multiPartRequest.getPartNames();
    115                                 for( int i = 0; i < partNames.length; i++ )
    116                                         cachedParameterNames.put( partNames[i], Integer.valueOf( i ) );
     109                                try {
     110                                        Integer DUMMY = Integer.valueOf(0);
     111                                        for (Part p : httpRequest.getParts()) {
     112                                                cachedParameterNames.put(p.getName(), DUMMY);
     113                                        }
     114                                } catch (IOException ioe) {
     115                                        log(ioe);
     116                                } catch (ServletException se) {
     117                                        log(se);
     118                                } catch (IllegalStateException ise) {
     119                                        log(ise);
     120                                }
    117121                        }
    118122                        return cachedParameterNames.keys();
    119                 }
    120                 else
     123                } else {
    121124                        return httpRequest.getParameterNames();
     125                }
    122126        }
    123127
     
    139143        {
    140144                String result = null;
    141                 if( multiPartRequest != null ) {
    142                         Hashtable<String, String> params = multiPartRequest.getParams( partName );
    143                         for( Map.Entry<String, String> e : params.entrySet() ) {
    144                                 String key = e.getKey();
    145                                 if( key.toLowerCase(Locale.US).compareToIgnoreCase( "content-type") == 0 ) {
    146                                         String value = e.getValue();
    147                                         int i = value.indexOf( ';' );
    148                                         if( i != -1 )
    149                                                 result = value.substring( 0, i );
    150                                         else
    151                                                 result = value;
    152                                 }
     145                if (isMultiPartRequest) {
     146                        try {
     147                                Part p = httpRequest.getPart(partName);
     148                                if (p != null)
     149                                        result = p.getContentType();
     150                        } catch (IOException ioe) {
     151                                log(ioe);
     152                        } catch (ServletException se) {
     153                                log(se);
     154                        } catch (IllegalStateException ise) {
     155                                log(ise);
    153156                        }
    154157                }
     
    163166        {
    164167                String result = defaultValue;
    165                 if( multiPartRequest != null ) {
     168                if (isMultiPartRequest) {
    166169                        String str = cache.get(name);
    167170                        if( str != null ) {
    168171                                result = str;
    169                         }
    170                         else {
    171                                 String[] partNames = multiPartRequest.getPartNames();
    172                                 for( int i = 0; i < partNames.length; i++ )
    173                                         if( partNames[i].compareToIgnoreCase( name ) == 0 ) {
    174                                                 str = multiPartRequest.getString( partNames[i] );
    175                                                 if( str != null ) {
    176                                                         result = str;
    177                                                         cache.put( name, result );
    178                                                         break;
    179                                                 }
     172                        } else {
     173                                InputStream in = null;
     174                                try {
     175                                        Part p = httpRequest.getPart(name);
     176                                        if (p != null) {
     177                                                long len = p.getSize();
     178                                                if (len > MAX_STRING_SIZE)
     179                                                        throw new IOException("String too big: " + len);
     180                                                in = p.getInputStream();
     181                                                byte[] data = new byte[(int) len];
     182                                                DataHelper.read(in, data);
     183                                                String enc = httpRequest.getCharacterEncoding();
     184                                                if (enc == null)
     185                                                        enc = "UTF-8";
     186                                                result = new String(data, enc);
     187                                                cache.put( name, result );
    180188                                        }
    181                         }
    182                 }
    183                 else {
     189                                } catch (IOException ioe) {
     190                                        log(ioe);
     191                                } catch (ServletException se) {
     192                                        log(se);
     193                                } catch (IllegalStateException ise) {
     194                                        log(ise);
     195                                } finally {
     196                                        if (in != null) try { in.close(); } catch (IOException ioe) {}
     197                                }
     198                        }
     199                } else {
    184200                        String str = httpRequest.getParameter( name );
    185201                        if( str != null )
     
    192208        {
    193209                String result = null;
    194                 if( multiPartRequest != null ) {
    195                         String str = multiPartRequest.getFilename( partName );
    196                         if( str != null )
    197                                 result = str;
     210                if (isMultiPartRequest) {
     211                        try {
     212                                Part p = httpRequest.getPart(partName);
     213                                if (p != null)
     214                                        result = p.getSubmittedFileName();
     215                        } catch (IOException ioe) {
     216                                log(ioe);
     217                        } catch (ServletException se) {
     218                                log(se);
     219                        } catch (IllegalStateException ise) {
     220                                log(ise);
     221                        }
    198222                }
    199223                return result;
     
    203227        {
    204228                InputStream result = null;
    205                 if( multiPartRequest != null ) {
    206                         result = multiPartRequest.getInputStream( partName );
    207                 }
    208                 return result;
    209         }
    210 
     229                if (isMultiPartRequest) {
     230                        try {
     231                                Part p = httpRequest.getPart(partName);
     232                                if (p != null)
     233                                        result = p.getInputStream();
     234                        } catch (IOException ioe) {
     235                                log(ioe);
     236                        } catch (ServletException se) {
     237                                log(se);
     238                        } catch (IllegalStateException ise) {
     239                                log(ise);
     240                        }
     241                }
     242                return result;
     243        }
     244
     245        /** @since 0.9.33 */
     246        private static void log(Exception e) {
     247                Log log = I2PAppContext.getGlobalContext().logManager().getLog(RequestWrapper.class);
     248                log.error("Multipart form error", e);
     249        }
    211250}
Note: See TracChangeset for help on using the changeset viewer.