Unless your client is very conforming to the rules (ie. Content-Length is
is correct wrt to available bytes) you could be waiting for a while for the
stream of data to come across or until your socket read statement timeout

int length = req.getContentLength();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
int count = 0
int total = 0;
byte[] buf = new byte[8192];  // not sure which OS u have but if u are on Windows, 
                               // use 8192 for the default OS block size
InputStream is  = req.getInputStream();
while (  (count = is.read(buf) ) != -1)
{ 
   total += count;
   baos.write(buf,0,count);
}

if (total != length)
{
   // handle this case as u see fit.
}

last note: bytearray is prob. better than reader/char array unless
you don't intend to handle non-character data.



> >  int length = req.getContentLength();
> >  char [] charArr = new char[length];
> >  int readResult = 0;
> >  int sum = 0;
> >  do {
> >    sum += readResult;
> >    length -= readResult;
> >    readResult = reader.read(charArr, sum, length);
> >  } while (readResult < length);

> 
> 
> Howdy,
> Seems like a very decent fix.  Thanks for posting it so 
> others can have
> a future reference solution ;)
> 
> I wonder if there's a java.nio solution that will perform better...
> 
> Yoav Shapira
> Millennium ChemInformatics
> 
> 
> >-----Original Message-----
> >From: Stewart, Daniel J [mailto:[EMAIL PROTECTED]
> >Sent: Thursday, October 02, 2003 12:34 PM
> >To: Tomcat Users List
> >Subject: RE: Tomcat sucks at receiving large messages
> >
> >Since I will be occasionally receiving messages in the 
> 10Mbyte range, I
> >can't read in a line at a time - it takes too long.
> >
> >The bug in the code below is because BufferedReader.read() will not
> >necessarily return the whole buffer.  So I replace the line
> >  reader.read(charArr);
> >With this:
> >  int length = req.getContentLength();
> >  char [] charArr = new char[length];
> >  int readResult = 0;
> >  int sum = 0;
> >  do {
> >    sum += readResult;
> >    length -= readResult;
> >    readResult = reader.read(charArr, sum, length);
> >  } while (readResult < length);
> >
> >
> >Thanks for your help.  Any other critiques on the use of the standard
> >library are welcome.
> >
> >Dan
> >-----Original Message-----
> >From: Shapira, Yoav [mailto:[EMAIL PROTECTED]
> >Sent: Tuesday, September 30, 2003 11:30 AM
> >To: Tomcat Users List
> >Subject: RE: Tomcat sucks at receiving large messages
> >
> >
> >
> >Howdy,
> >
> >>public void service(HttpServletRequest req, 
> HttpServletResponse res) {
> >>  BufferedReader reader = req.getReader();
> >>  try {
> >>    char [] charArr = new char[req.getContentLength()];
> >>    reader.read(charArr);
> >>    String str = new String(charArr);
> >>
> >>    try {
> >>      File f = new File("servlet.out");
> >>      PrintWriter out = new PrintWriter(new FileWriter(f));
> >>      out.print(str);
> >>      out.flush();
> >>      out.close();
> >>    } catch(IOException err { System.err.println(err.toString()); }
> >>
> >>  } catch(IOException err) { System.err.println(err.toString()); } }
> >
> >What happens if you ditch the req.getContentLength() approach (there
> are
> >times when it will be -1 anyways), and do something like:
> BufferedReader
> >reader = req.getReader(); StringBuffer contents = new StringBuffer();
> >String line = null; while((line = reader.readLine()) != null) {
> >  contents.append(line);
> >}
> >
> >System.out.println(contents);
> >
> >(Later we'll worry about the writing -- first make sure 
> you're reading
> >the entire contents).
> >
> >Yoav Shapira
> >
> >
> >
> >This e-mail, including any attachments, is a confidential business
> >communication, and may contain information that is confidential,
> >proprietary and/or privileged.  This e-mail is intended only for the
> >individual(s) to whom it is addressed, and may not be saved, copied,
> >printed, disclosed or used by anyone else.  If you are not the(an)
> >intended recipient, please immediately delete this e-mail from your
> >computer system and notify the sender.  Thank you.
> >
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 
> 
> This e-mail, including any attachments, is a confidential 
> business communication, and may contain information that is 
> confidential, proprietary and/or privileged.  This e-mail is 
> intended only for the individual(s) to whom it is addressed, 
> and may not be saved, copied, printed, disclosed or used by 
> anyone else.  If you are not the(an) intended recipient, 
> please immediately delete this e-mail from your computer 
> system and notify the sender.  Thank you.
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to