----- Original Message -----
From: "Endre Stølsvik" <[EMAIL PROTECTED]>
To: "Remy Maucherat" <[EMAIL PROTECTED]>; "Tomcat Users List"
<[EMAIL PROTECTED]>
Sent: Tuesday, November 13, 2001 5:01 PM
Subject: Re: [TC4] Sending redirect fails if OutputStream isn't closed ..


> On Mon, 12 Nov 2001, Remy Maucherat wrote:
>
> | > I'm using this program called "loadsim" to get a simulation of a bunch
of
> | > users using my webapp. This is a java program utilizing the
> | > java.net.HttpConnection to simulate the clients, built using large
parts
> | > of a apache loadsimulation system, right?
>
> Make that "java.net.HttpURLConnection" (as the client).
>
> | > Why is that? Why do I have to get the outputstream, and then just
close it
> | > to get the sendRedirect away? Why isn't the stream closed on exit of
the
> | > doGet/Post method? Or whatever?
> |
> | The default servlet doesn't use the output stream at all, and appears to
> | behave correctly (verified using a telnet session). This looks like a
> | problem with the HTTP client you're using.
>
> I also mentioned this in the first post (Mozilla behaves properly), but
> why does it then work when I get and close the output stream as described?
>
> Here's the code from "loadsim" that does the sampling, just if you don't
> have much other to do today! (It's not that long, actually)..
>
> It seems to close both its output to the server, and the input from the
> server..
>   Extra-info: that page which sends the redirects is just a "poster-page";
> this is where the browser does GETs with parameters and POSTs: it just
> takes all the parameters from the browser, and then sends a "blank"
> redirect to the browser. This fools the (most) browsers to not store this
> as a separate history event, and you don't get that reposting stuff on
> "back" and "reload" going.
>
> --------------------------
>
>     /**
>      * Send the link to the webserver using the <code>VirtualUser</code>'s
>      * <code>CookieManager</code>.
>      *
>      * @param  cookieManager  The <code>VirtualUser</code>'s
> <code>CookieManager</code>.
>      * @param  log            The log file to log information/errors to.
>      *
>      * @return The <code>SampleResult</code> object.
>      *
>      * @exception IOException if an error occurs reading from or writing
> to the
>      *            webserver.
>      */
>     public SampleResult sample(CookieManager cookieManager, ILog log)
> throws IOException {
>         long then;
>         URL url = null;
>         HttpURLConnection connection = null;
>         BufferedInputStream input = null;
>         SampleResult sample = null;
>         byte [] buf = null;
>         int bytesread = 0;
>         ByteArrayOutputStream outbuf = null;
>
>         // Init the sample result
>
>         sample = new SampleResult();
>         sample.setLabel(id_);
>
>         // Create the HTTP connection
>         then = System.currentTimeMillis();
>
>         url = new URL(linkStr_);
>         connection = (HttpURLConnection) url.openConnection();
>         connection.setUseCaches(false);
>         connection.setDoInput(true);
>         connection.setInstanceFollowRedirects(false);   //  ***
> [EMAIL PROTECTED]: if followredirects is true we miss out on the cookies
> set by the first page!
>
>         // Setup cookies
>
>         if (cookieManager != null) {
>             String cookieHeader =
> cookieManager.getCookieHeaderForURL(url);
>             if (cookieHeader != null) {
>                 connection.setRequestProperty("Cookie", cookieHeader);
>             }
>         }
>
>         if (formDataStr_ == null) {
>             connection.connect();
>             sample.setTTOpen(System.currentTimeMillis() - then);
>             log.log(ILog.INFORMATION, "' url = " + linkStr_);
>         } else {
>             try {
>                 DataOutputStream output = null;
>
>                 connection.setRequestProperty("Content-Type",
> "application/x-www-form-urlencoded");
>                 connection.setDoOutput(true);
>                 connection.setRequestMethod("POST");
>                 connection.connect();
>                 sample.setTTOpen(System.currentTimeMillis() - then);
>
>                 output = new
> DataOutputStream(connection.getOutputStream());
>                 output.writeBytes(formDataStr_);
>                 output.flush();
>                 output.close();
>                 log.log(ILog.INFORMATION, "' url = " + linkStr_ + " POST =
> " + formDataStr_ + " (" +
>                         formDataStr_.length() + ")");
>             } catch (Exception e) {
>                 log.log(ILog.ERROR, "Caught exception: " + e.getMessage()
> + " ignoring sample");
>                 sample.setTTLB(-1);
>                 sample.setTTFB(-1);
>                 sample.setSize(-1);
>                 sample.setLastPage(null);
>                 return sample;
>             }
>         }
>
>         // this is where 'then = currentTime' used to be.
>         sample.setTTReq(System.currentTimeMillis() - then);
>
>         // Check for cookies coming back
>
>         try {
>             if (cookieManager != null) {
>
>                 // check for Set-Cookie headers from server (index 0 is
> the
>                 // HTTP repsonse code), which does not use "header: value"
> format
>
>                 for (int i = 1;; i++) {
>                     try {
>                         if
> (connection.getHeaderFieldKey(i).equals("Set-Cookie")) {
>
> cookieManager.addCookieFromHeader(connection.getHeaderField(i), url);
>                         }
>                     } catch (NullPointerException e) {
>                         break;
>                     }
>                 }
>             }
>
>             // Read the HTML from the webserver
>
>             input = new BufferedInputStream(connection.getInputStream());
>             buf = new byte[BUFF_SIZE];
>             bytesread = input.read(buf);
>             sample.setTTFB(System.currentTimeMillis() - then);
>             outbuf = new ByteArrayOutputStream();
>             while (bytesread != -1) {
>                 outbuf.write(buf, 0, bytesread);
>                 bytesread = input.read(buf);
>             }
>             input.close();
>             sample.setTTLB(System.currentTimeMillis() - then);
>             sample.setSize(outbuf.size());
>             if (connection.getContentType() != null) {
>                 sample.setContentType(connection.getContentType());
>                 if
> (connection.getContentType().toLowerCase().startsWith("text/html")) {
>                     sample.setLastPage(outbuf.toString());
>                 } else {
>                     sample.setLastPage(null);
>                 }
>             }
>         } catch (Exception e) {
>             log.log(ILog.ERROR, "Caught exception: " + e.getMessage() + "
> ignoring sample");
>             sample.setTTLB(-1);
>             sample.setTTFB(-1);
>             sample.setSize(-1);
>             sample.setLastPage(null);
>             return sample;
>         } finally {
>             if (input != null) {
>                 input.close();
>             }
>         }
>
>         if (sample.getLastPage() != null && expectTitle_ != null) {
>             String receivedTitle = getTitle(buf.toString());
>
>             if (!expectTitle_.trim().equals(receivedTitle.trim())) {
>                 log.log(ILog.ERROR, "' Expected title: '" +
>                         expectTitle_ + "' got '" + receivedTitle + "'");
>             }
>         }
>
>         return sample;
>     }
>
> --------------------------
>
>
> --
> Mvh,
> Endre
>
>
>
> --
> To unsubscribe:   <mailto:[EMAIL PROTECTED]>
> For additional commands: <mailto:[EMAIL PROTECTED]>
> Troubles with the list: <mailto:[EMAIL PROTECTED]>
>
>


--
To unsubscribe:   <mailto:[EMAIL PROTECTED]>
For additional commands: <mailto:[EMAIL PROTECTED]>
Troubles with the list: <mailto:[EMAIL PROTECTED]>

Reply via email to