tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jim JXR <jim...@yahoo.com>
Subject Binary data POSTed to Tomcat 4.1+JK2+IIS 5+Win2KSvr corrupted
Date Thu, 07 Aug 2003 10:56:00 GMT
Hi, list:

I'm running a web application hosted in Tomcat 4.1,
with IIS redirector enabled. There has been no problem
with jsp browsing so far, but I have a serious problem
when posting binary data to a servlet in this
environment. Basically, a random 36byte sequence is
inserted near 56k in the data stream, which corrupts
the data received from POST. I have setup a test
environment to reproduce the problem as follows:

((Test Environment))
Win2000 Server SP4
IIS 5.0.2195.6700
J2SDK 1.4.1_02
Tomcat 4.1.27
iis_redirector.dll 2.0.2 and 2.0.1

((jk2.properties))
No setting, all comments, same as the one from the
Tomcat installation

((workers2.properties))
[logger.file:0]
# level: EMERG or ERROR or INFO or DEBUG
level=DEBUG
file=${serverRoot}/logs/jk2.log

[shm:]
info=Scoreboard. Required for reconfiguration and
status with multiprocess servers
file=${serverRoot}/logs/jk2.shm
size=1048576
debug=5

# Define the communication channel 
[channel.socket:localhost:8009]
info=Ajp13 forwarding over socket
tomcatId=localhost:8009
debug=5

# Map the Tomcat examples webapp to the Web server uri
space
[uri:/examples/*]
info=Map the whole webapp
debug=5

((examples context web.xml))
...
    <servlet>
        <servlet-name>BinaryPostTest</servlet-name>
       
<servlet-class>test.BinaryPostServlet</servlet-class>
    </servlet>
...
    <servlet-mapping>
        <servlet-name>BinaryPostTest</servlet-name>
        <url-pattern>/posttest</url-pattern>
    </servlet-mapping>

((test.BinaryPostServlet))
package test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class BinaryPostServlet
extends HttpServlet
{
	protected void doGet(HttpServletRequest request,
HttpServletResponse response)
		throws ServletException, IOException
	{
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>" + "Binary post test servlet" +
"</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("Please post data to this servlet, with
entity header 'File-Name'");
		out.println("</body>");
		out.println("</html>");				
	}

	protected void doPost(HttpServletRequest request,
HttpServletResponse response)
		throws ServletException, IOException
	{
		String fileName = request.getHeader("File-Name");
		if(fileName == null)
			fileName = "file" + System.currentTimeMillis() +
".dat";
		fileName = "C:/temp/" + fileName;
		FileOutputStream fout = new
FileOutputStream(fileName, false);
		InputStream in = request.getInputStream();
		byte[] buffer = new byte[1024];
		int read = in.read(buffer, 0, buffer.length);
		while(read != -1)
		{
			fout.write(buffer, 0, read);
			read = in.read(buffer, 0, buffer.length);
		}
		fout.close();
		in.close();
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<title>" + "Binary post test servlet" +
"</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("File saved to " + fileName);
		out.println("</body>");
		out.println("</html>");			
	}
}

((Java application who does the POST))
package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.HttpURLConnection;

public class BinaryPostTester
{
	public static void main(String[] args)
	{
		try
		{
			if(args.length != 2)
			{
				System.out.println("Usage: java
test.BinaryPostTester FilePathName URL");
				return;
			}
			File file = new File(args[0]);
			URL url = new URL(args[1]);
			HttpURLConnection conn =
(HttpURLConnection)url.openConnection();
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setRequestProperty("File-Name",
file.getName());
			conn.setRequestProperty("Content-Type",
"application/octet-stream");
			conn.setRequestProperty("Content-Length",
String.valueOf(file.length()));
			conn.setRequestMethod("POST");
			conn.connect();
			System.out.println("Connected to " + url);
			OutputStream out = conn.getOutputStream();
			FileInputStream fin = new FileInputStream(file);
			byte[] buffer = new byte[1024];
			int read = fin.read(buffer, 0, buffer.length);
			while(read != -1)
			{
				out.write(buffer, 0, read);
				read = fin.read(buffer, 0, buffer.length);
			}
			out.close();
			fin.close();
			System.out.println("Response Code is: " +
conn.getResponseCode());
			System.out.println("Response is: " +
conn.getResponseMessage());
			conn.disconnect();
		}
		catch(Throwable t)
		{
			t.printStackTrace();
		}
	}
}

((File to POST))
server/lib/tomcat-util.jar from the Tomcat 4.1.27
installation

((Test Procedure))
1. Setup iis_redirector.dll per JK2 documentation
2. Compile the servlet and the tester
3. Install the servlet to the examples context
4. Test "http://servername:8080/examples/posttest" to
make sure the servlet is installed properly
5. Test "http://servername:80/examples/posttest" to
make sure IIS redirector is working
6. Run tester with file tomcat-util.jar and url
"http://servername:80/examples/posttest", the servlet
should receive the data and write them to a file under
C:/Temp directory in the server
7. Compare the original file with the file uploaded to
the server, in my case, the uploaded file has a 36byte
sequence inserted at 56940, which makes the two files
different.

((Logs))
I probably messed up the JK2's log configuration,
since no log entry is written to the jk2.log, but in
my production environment (Win2000 Server SP2, IIS
5.0.2195.6670, J2SDK 1.4.1_01, Tomcat 4.1.18,
iis_redirector.dll 2.0.2) I was able to get the logs
working. Here's the entries concerning the upload
process:
[Thu Aug 07 15:59:50 2003] (debug ) [jk_isapi_plugin.c
(473)]  HttpExtensionProc started
[Thu Aug 07 15:59:50 2003] (debug ) [jk_isapi_plugin.c
(482)]  HttpExtensionProc got a worker for name
ajp13:localhost:8009
[Thu Aug 07 15:59:50 2003] (debug ) [jk_isapi_plugin.c
(497)]  HttpExtensionProc: new rpool
[Thu Aug 07 15:59:50 2003] ( info ) [jk_endpoint.c
(95)]  workerEnv.init() create slot epStat.0
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 6 getChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 4 sendHeaders
[Thu Aug 07 15:59:50 2003] (debug )
[jk_handler_response.c (155)]  handler.response()
Header[0] [Content-Type] = [text/html]
[Thu Aug 07 15:59:50 2003] (debug )
[jk_handler_response.c (155)]  handler.response()
Header[1] [Content-Length] = [128]
[Thu Aug 07 15:59:50 2003] (debug )
[jk_handler_response.c (172)]  handler.response():
status=200 headers=2
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(93)]  Into jk_ws_service_t::head
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 3 sendChunk
[Thu Aug 07 15:59:50 2003] (debug ) [jk_service_iis.c
(227)]  Into jk_ws_service_t::write
[Thu Aug 07 15:59:50 2003] (debug ) [jk_workerEnv.c
(430)]  workerEnv.dispatch() Calling 5 endResponse
[Thu Aug 07 15:59:50 2003] (debug ) [jk_isapi_plugin.c
(515)]  HttpExtensionProc service() returned OK

This is the first upload I did after IIS restart, if I
try a second upload, I usually get this error in the
log:
[Thu Aug 07 15:50:53 2003] (debug ) [jk_isapi_plugin.c
(473)]  HttpExtensionProc started
[Thu Aug 07 15:50:53 2003] (debug ) [jk_isapi_plugin.c
(482)]  HttpExtensionProc got a worker for name
ajp13:localhost:8009
[Thu Aug 07 15:50:53 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:52:08 2003] (error ) [jk_worker_ajp13.c
(389)]  ajp13.service() Error sending initial post -1
0 0
[Thu Aug 07 15:50:53 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
[Thu Aug 07 15:50:53 2003] (debug ) [jk_service_iis.c
(168)]  Into jk_ws_service_t::read
......
The file still got uploaded, and is corrupted as
before.

OK that's all the information I have right now, before
I finish this super long message, I should mention
that I have searched the list for similar problems,
and found a very similar problem is reported by Joakim
Strom on 2002-12-02 in the post "Large files corrupted
-- possible bug in isapi_redirector2.dll?", however no
one replied to his message.

Jim

__________________________________
Do you Yahoo!?
Yahoo! SiteBuilder - Free, easy-to-use web site design software
http://sitebuilder.yahoo.com

Mime
View raw message