Hi

Having created a Servlet, I want to be sure, that the content written to
the HTTP-response is flushed all the way through the TCP connection
carrying the HTTP-request and -response.

In case the TCP connection to the HTTP-client has been closed - e.g. if
the client has timed out - I would like to see some form of IOException
within my servlet, when the Servlet ends up performing a
HttpServletResponse.flushBuffer() (or
HttpServletResponse.getOutputStream().flush()).

The below fragment of Servlet-code writes a line of text, sleeps 10
seconds and then writes another line of text. When initiating a request
from IE and aborting the request after about five seconds, the
Servlet-code ends up catching an IOException - in Tomcat it becomes a
ClientAbortException wrapping a SocketException with the text
"Connection reset by peer: socket write error". This makes my Servlet
aware of the connection to the client being cut.

When initiating a request from some Java code by using HttpURLConnection
with a read-timeout of five seconds, I see the same type of reaction
within the Servlet if and only if I do no end up doing a proper cleanup
containing a call to HttpURLConnection.getInputStream().close(). If the
call to close() is not made, the Servlet catches a IOException. But if
the call to close() is made, the Servlet does *not* detect the
HTTP-client cutting or closing the connection; no IOException is seen
within the Servlet. Why is this?

If I instead of IE use FireFox and initate a request and abort this
request after about five seconds, the Servlet also does not detect the
stream carrying the HTTP-reponse being cut or closed. Why is this?

(As far as I can tell from the net, both FireFox and Opera closes the
TCP connection in a proper way.)

If e.g. the FireFox browser correctly closes the TCP/IP connection, the
Servlet-container must somehow detect this. But why does this not imply
an IOException being generated within the Servlet, when the Servlet
performs explicit flushing?

Surely, a cut or closed TCP connection can not be ignored by Tomcat?

     ?

Regards
  Morten Sabroe Mortensen


     -----
 public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
    throws
      IOException,
      ServletException
  {
    try
    {
      response.setStatus(HttpServletResponse.SC_OK);

      response.setContentType("text/plain");
      response.setCharacterEncoding("UTF-8");

      Writer w=response.getWriter();

      w.write("Hello, this is the servlet speaking!");
      w.write("\n");
      w.flush();

      Thread.sleep(10*1000);

      w.write("Goodbye.");
      w.write("\n");
      w.flush();

      response.flushBuffer();

      System.out.println(":> response.isCommitted():
"+response.isCommitted());
    }
    catch (IOException ex)
    {
      System.out.println(":> *** VUUPS! ***");

      ex.printStackTrace(System.out);

      IOException exception=new IOException();
      exception.initCause(ex);
      throw exception;
    }
    catch (Throwable ex)
    {
      ex.printStackTrace(System.out);

      throw new RuntimeException(ex);
    }
  }
     -----


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to