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.
#######################################################











begin:vcard 
n:McPherson;Sandy
tel;cell:+31 6 224 70517
tel;fax:+31 527 68 74 80
tel;work:+31 527 68 70 10
x-mozilla-html:TRUE
org:Allset Consultancy BV.
version:2.1
email;internet:[EMAIL PROTECTED]
title:Senior Consultant
adr;quoted-printable:;;Robbenplaat 18=0D=0A;Urk;;8321PA;Netherlands
x-mozilla-cpt:;32288
fn:Sandy McPherson
end:vcard

Reply via email to