You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Sandy McPherson <al...@webmind.nl> on 2000/12/07 15:54:47 UTC

Re: multipart requests and file uploads problems on the Apache connection

Sandy McPherson wrote:

Looks like the Ajp13 is screwing up! The stuff works properly when I set the servlet protocol to Ajp12


> Hi
>
> I am running Tomcat 3.2 and Apache 1.3.12.
>
> I get some funny behaviour when uploading a file through the
> apache/tomcat connection. It looks like the input stream is broken.
>
> The output from Tomcat looks like
>
> Using classpath:
> /usr/local/tomcat/lib/ant.jar:/usr/local/tomcat/lib/jasper.jar:/usr/local/tomcat/lib/servlet.jar:/usr/local/tomcat/lib/test:/usr/local/tomcat/lib/webserver.jar:/usr/java/jdk/lib/tools.jar:/usr/java/jsse/lib/jcert.jar:/usr/java/jsse/lib/jsse.jar:/usr/java/jsse/lib/jnet.jar:/usr/java/jaxp/jaxp.jar:/usr/java/jaxp/parser.jar:/usr/java/jdk/bin
>
> Starting tomcat. Check logs/tomcat.log for error messages
>
> >>>>>> upload GIF using http://localhost:8080/spqr/servlet/LogoUpload
>
> LogoUpload.service: begin
> LogoUpload.service: reading file
> LogoUpload.service: reading new block len = 5283,5283
> LogoUpload.service: reading file completed
> LogoUpload.service: file is GIF
> LogoUpload.service: looking for footer
> LogoUpload.service: found footer
> LogoUpload.service: end
>
> >>>>>> upload GIF using http://localhost/spqr/servlet/LogoUpload i.e.
> over
>
> LogoUpload.service: begin
> LogoUpload.service: reading file
> Y
> LogoUpload.service: reading new block len = 340,340
> Y
> LogoUpload.service: reading new block len = 0,340
> Y
> LogoUpload.service: reading new block len = 0,340
> Y
> ...
> LogoUpload.service: reading new block len = 0,340
> Y
>
> in an infinite loop!
>
> My code  (attached) does not print the Y anywhere that I can see!
>
> The Apache httpd.conf file is out of the box with the mod_jk.conf.spqr
> (attached) file included right at
> the end.
>
> Do I have to configure anything in Apache to get it to pass the
> multi-part request without mangling it?
> Thanks
> Sandy
>
>   ------------------------------------------------------------------------
> package com.mapquest.spqr.db;
>
> import java.io.*;
> import java.net.*;
> import java.util.*;
>
> import javax.servlet.*;
> import javax.servlet.http.*;
>
> import com.oroinc.text.perl.*;
>
> public class LogoUpload extends HttpServlet
> {
>    public static final int maxFileSize=65535;
>    String[] getFileTypes( )
>    {
>           return new String[] {".gif",".jpg", ".jpeg" };
>    }
>    public void service( HttpServletRequest _req, HttpServletResponse _res )
>           throws ServletException, IOException
>    {
>           System.out.println( "LogoUpload.service: begin" );
>           Client client = (Client)_req.getSession( ).getAttribute( "client" );
>           if ( client == null )
>           {
>                  throw new ServletException( "No bean called \"client\" in session" );
>           }
>           String user=client.getUser( );
>           //
>           // Input and Output streams
>           //
>           InputStream is = _req.getInputStream();
>           //
>           // Temporary ByteArray.The initial size is set to 8164.
>           // A large initial size improves performance.
>           //
>           ByteArrayOutputStream bos = new ByteArrayOutputStream(8164);
>
>           //
>           // The files total length,including header and footer
>           //
>           int TotLen=0;
>           int HeaderLen=0;
>           int FooterLen=0;
>
>           //
>           // byte array for read
>           //
>           byte[] b = new byte[8164];
>           int len=0;
>
>           //
>           // Read the InputStream and store it in 'bos'.
>           //
>           System.out.println( "LogoUpload.service: reading file" );
>           try
>           {
>                  while( ((len = is.read(b,0,8164)) != -1) && TotLen <= maxFileSize )
>                  {
>                         bos.write(b,0,len);
>
>                         TotLen += len;
>                         System.out.println( "LogoUpload.service: reading new block len = "+len + "," +TotLen );
>                  }
>                  is.close();
>                  System.out.println( "LogoUpload.service: reading file completed" );
>           }
>           catch(IOException e)
>           {
>                  System.out.println( "LogoUpload.service: upload failed" );
>                  throw new ServletException( "File upload failed", e );
>           }
>
>           if ( TotLen > maxFileSize )
>           {
>                  System.out.println( "LogoUpload.service: file too big" );
>                  getServletContext( )
>                         .getRequestDispatcher("/"+client.getDefaultLanguage( )+"/logo-big.jsp")
>                         .forward( _req, _res );
>                  return;
>           }
>
>           String fileExtension = null;
>           try
>           {
>                  String GIFRegex = "/Content-Type: image/gif\r\n\r\n/";
>                  String PJPEGRegex = "/Content-Type: image/pjpeg\r\n\r\n/";
>                  String JPEGRegex = "/Content-Type: image/jpeg\r\n\r\n/";
>                  String JPGRegex = "/Content-Type: image/jpg\r\n\r\n/";
>                  String FooterRegex = "/(\r\n\\-+\\w+\\-+\r\n)/";
>                  //
>                  // Create a Perl5Util instance.
>                  //
>                  Perl5Util Matcher = new Perl5Util();
>                  //
>                  // check that the file is a GIF or a JPEG and find the end of the header
>                  //
>                  String header = bos.toString().substring(0,(TotLen<1024?TotLen:1024));
>                  if( Matcher.match(GIFRegex, header) )
>                  {
>                         HeaderLen = Matcher.endOffset(0);
>                         fileExtension=".gif";
>                         System.out.println( "LogoUpload.service: file is GIF" );
>                  }
>                  else if( Matcher.match(PJPEGRegex, header) )
>                  {
>                         HeaderLen = Matcher.endOffset(0);
>                         fileExtension=".jpg";
>                         System.out.println( "LogoUpload.service: file is PJPEG" );
>                  }
>                  else if( Matcher.match(JPEGRegex, header) )
>                  {
>                         HeaderLen = Matcher.endOffset(0);
>                         fileExtension=".jpg";
>                         System.out.println( "LogoUpload.service: file is PJPEG" );
>                  }
>                  else if( Matcher.match(JPGRegex, header) )
>                  {
>                         HeaderLen = Matcher.endOffset(0);
>                         fileExtension=".jpg";
>                         System.out.println( "LogoUpload.service: file is JPG" );
>                  }
>                  else
>                  {
>                         System.out.println( "LogoUpload.service: file is wrong type" );
>                         getServletContext( )
>                            .getRequestDispatcher("/"+client.getDefaultLanguage( )+"/logo-type.jsp")
>                            .forward( _req, _res );
>                         return;
>                  }
>
>                  //
>                  // Now get the footer.
>                  // It looks something like this '\n-----------------------------465418cd611274--\n'
>                  //
>                  String Last100 = bos.toString().substring(TotLen - 100<0 ?0 :TotLen - 100 );
>
>                  System.out.println( "LogoUpload.service: looking for footer" );
>                  if( Matcher.match(FooterRegex, Last100) )
>                  {
>                         FooterLen = Matcher.group(1).length();
>                         System.out.println( "LogoUpload.service: found footer" );
>                  }
>                  else
>                  {
>                         throw new ServletException( "Could not find end of Image Footer" );
>                  }
>           }
>           catch(java.lang.Exception e)
>           {
>                  throw new ServletException( "File upload failed", e );
>           }
>
>           //Write the file to the Servers 'uploads' directory
>           try
>           {
>                  String filename = getServletContext( )
>                                                           .getRealPath( "/clients/logos/"+user );
>
>                  //
>                  // delete any potentially existing files
>                  //
>                  try
>                  {
>                         new File( filename+".gif").delete( );
>                  }
>                  catch( Throwable ex )
>                  {
>                  }
>                  try
>                  {
>                         new File( filename+".jpg").delete( );
>                  }
>                  catch( Throwable ex )
>                  {
>                  }
>
>                  filename+=fileExtension;
>                  FileOutputStream fos =  new FileOutputStream(filename);
>
>                  fos.write( bos.toByteArray(),HeaderLen, TotLen-HeaderLen-FooterLen);
>
>                  client.setLogoURL( "/spqr/clients/logos/"+user+fileExtension );
>
>                  fos.close();
>           }
>           catch(IOException e)
>           {
>                  System.out.println( "LogoUpload.service: exception" );
>                  throw new ServletException( "User = " +user+ "Writing logo failed " +bos.toString( ), e );
>           }
>
>           getServletContext( )
>                  .getRequestDispatcher("/"+client.getDefaultLanguage( )+"/logo-ok.jsp")
>                  .forward( _req, _res );
>
>           System.out.println( "LogoUpload.service: end" );
>    }
>
>    boolean isJPEG( byte[] content )
>    {
>           if ( content[0] != 0377 )
>                  return false;
>           if ( content[1] != 0330 )
>                  return false;
>           if ( content[2] != 0377 )
>                  return false;
>           if ( content[3] != 0340 )
>                  return false;
>           if ( content[6] != 'J' )
>                  return false;
>           if ( content[7] != 'F' )
>                  return false;
>           if ( content[8] != 'I' )
>                  return false;
>           if ( content[9] != 'F' )
>                  return false;
>           return true;
>    }
>    boolean isGIF( byte[] content )
>    {
>           if ( content[0] != 'G' )
>                  return false;
>           if ( content[1] != 'I' )
>                  return false;
>           if ( content[2] != 'F' )
>                  return false;
>           if ( content[3] != '8' )
>                  return false;
>           if ( content[4] != '9' )
>                  return false;
>
>           return true;
>    }
> }
>
>   ------------------------------------------------------------------------
> ###################################################################
> # Auto generated configuration. Dated: Wed Dec 06 10:05:24 CET 2000
> ###################################################################
>
> #
> # The following line instructs Apache to load the jk module
> #
> LoadModule jk_module libexec/mod_jk.so
>
> JkWorkersFile /usr/local/apache-group/dist/tomcat/conf/workers.properties
> JkLogFile /usr/local/apache-group/dist/tomcat/logs/mod_jk.log
>
> #
> # Log level to be used by mod_jk
> #
> JkLogLevel error
>
> ###################################################################
> #                     SSL configuration                           #
> #
> # By default mod_jk is configured to collect SSL information from
> # the apache environment and send it to the Tomcat workers. The
> # problem is that there are many SSL solutions for Apache and as
> # a result the environment variable names may change.
> #
> # The following (commented out) JK related SSL configureation
> # can be used to customize mod_jk's SSL behaviour.
> #
> # Should mod_jk send SSL information to Tomact (default is On)
> # JkExtractSSL Off
> #
> # What is the indicator for SSL (default is HTTPS)
> # JkHTTPSIndicator HTTPS
> #
> # What is the indicator for SSL session (default is SSL_SESSION_ID)
> # JkSESSIONIndicator SSL_SESSION_ID
> #
> # What is the indicator for client SSL cipher suit (default is SSL_CIPHER)
> # JkCIPHERIndicator SSL_CIPHER
> #
> # What is the indicator for the client SSL certificated (default is SSL_CLIENT_CERT)
> # JkCERTSIndicator SSL_CLIENT_CERT
> #
> #                                                                 #
> ###################################################################
>
> #
> # Root context mounts for Tomcat
> #
> JkMount /*.jsp ajp13
> JkMount /servlet/* ajp13
>
> #########################################################
> # Auto configuration for the /examples context starts.
> #########################################################
>
> #
> # The following line makes apache aware of the location of the /examples context
> #
> Alias /examples "/usr/local/apache-group/dist/tomcat/webapps/examples"
> <Directory "/usr/local/apache-group/dist/tomcat/webapps/examples">
>     Options Indexes FollowSymLinks
> </Directory>
>
> #
> # The following line mounts all JSP files and the /servlet/ uri to tomcat
> #
> JkMount /examples/servlet/* ajp13
> JkMount /examples/*.jsp ajp13
>
> #
> # The following line prohibits users from directly accessing WEB-INF
> #
> <Location "/examples/WEB-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #
> # The following line prohibits users from directly accessing META-INF
> #
> <Location "/examples/META-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #######################################################
> # Auto configuration for the /examples context ends.
> #######################################################
>
> #########################################################
> # Auto configuration for the /spqr context starts.
> #########################################################
>
> #
> # The following line makes apache aware of the location of the /spqr context
> #
> Alias /spqr "/usr/local/tomcat/webapps/spqr"
> <Directory "/usr/local/tomcat/webapps/spqr">
>     Options Indexes FollowSymLinks
>     DirectoryIndex index.jsp EN/index.jsp
> </Directory>
>
> #
> # The following line mounts all JSP files and the /servlet/ uri to tomcat
> #
> JkMount /spqr/servlet/* ajp13
> JkMount /spqr/*.jsp ajp13
>
> #
> # The following line prohibits users from directly accessing WEB-INF
> #
> <Location "/spqr/WEB-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #
> # The following line prohibits users from directly accessing META-INF
> #
> <Location "/spqr/META-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #######################################################
> # Auto configuration for the /spqr context ends.
> #######################################################
>
> #########################################################
> # Auto configuration for the /admin context starts.
> #########################################################
>
> #
> # The following line makes apache aware of the location of the /admin context
> #
> Alias /admin "/usr/local/apache-group/dist/tomcat/webapps/admin"
> <Directory "/usr/local/apache-group/dist/tomcat/webapps/admin">
>     Options Indexes FollowSymLinks
> </Directory>
>
> #
> # The following line mounts all JSP files and the /servlet/ uri to tomcat
> #
> JkMount /admin/servlet/* ajp13
> JkMount /admin/*.jsp ajp13
>
> #
> # The following line prohibits users from directly accessing WEB-INF
> #
> <Location "/admin/WEB-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #
> # The following line prohibits users from directly accessing META-INF
> #
> <Location "/admin/META-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #######################################################
> # Auto configuration for the /admin context ends.
> #######################################################
>
> #########################################################
> # Auto configuration for the /test context starts.
> #########################################################
>
> #
> # The following line makes apache aware of the location of the /test context
> #
> Alias /test "/usr/local/apache-group/dist/tomcat/webapps/test"
> <Directory "/usr/local/apache-group/dist/tomcat/webapps/test">
>     Options Indexes FollowSymLinks
> </Directory>
>
> #
> # The following line mounts all JSP files and the /servlet/ uri to tomcat
> #
> JkMount /test/servlet/* ajp13
> JkMount /test/*.jsp ajp13
>
> #
> # The following line prohibits users from directly accessing WEB-INF
> #
> <Location "/test/WEB-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #
> # The following line prohibits users from directly accessing META-INF
> #
> <Location "/test/META-INF/">
>     AllowOverride None
>     deny from all
> </Location>
>
> #######################################################
> # Auto configuration for the /test context ends.
> #######################################################

RE: multipart requests and file uploads problems on the Apache connection

Posted by David Rees <dr...@ebetinc.com>.
Yes, this is a known bug in Ajp13.  It looks like a fix is under development
and should be available in the next release.  Until then, use Ajp12.

-Dave

> Sandy McPherson wrote:
>
> Looks like the Ajp13 is screwing up! The stuff works properly
> when I set the servlet protocol to Ajp12
>
> > Hi
> >
> > I am running Tomcat 3.2 and Apache 1.3.12.
> >
> > I get some funny behaviour when uploading a file through the
> > apache/tomcat connection. It looks like the input stream is broken.
> >
> > The output from Tomcat looks like
> >
> > Using classpath:
> >
> /usr/local/tomcat/lib/ant.jar:/usr/local/tomcat/lib/jasper.jar:/us
> r/local/tomcat/lib/servlet.jar:/usr/local/tomcat/lib/test:/usr/loc
> al/tomcat/lib/webserver.jar:/usr/java/jdk/lib/tools.jar:/usr/java/
> jsse/lib/jcert.jar:/usr/java/jsse/lib/jsse.jar:/usr/java/jsse/lib/
> jnet.jar:/usr/java/jaxp/jaxp.jar:/usr/java/jaxp/parser.jar:/usr/ja
> va/jdk/bin
> >
> > Starting tomcat. Check logs/tomcat.log for error messages
> >
> > >>>>>> upload GIF using http://localhost:8080/spqr/servlet/LogoUpload
> >
> > LogoUpload.service: begin
> > LogoUpload.service: reading file
> > LogoUpload.service: reading new block len = 5283,5283
> > LogoUpload.service: reading file completed
> > LogoUpload.service: file is GIF
> > LogoUpload.service: looking for footer
> > LogoUpload.service: found footer
> > LogoUpload.service: end
> >