Hi,

I run into 2 small bugs - the diff solves the problem for me,
maybe for others :-)

First, on some VMs the SocketRR will hung for a very long time.
That's because even if close() is called on the socket, the
read() will remain blocked. Adding a soTimeout and 
checking for done solves this.

The other - with some servers, if available() returns 
0 we read a single byte, and then send it. Then we'll
send a second packet with the rest of the request.
That will confuse at least apache  (who would see
OST instead of POST - still trying to figure out why ). 
I see no reason to read a single byte - we'll block
anyway. 

Costin




Index: src/org/apache/axis/utils/tcpmon.java
===================================================================
RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/utils/tcpmon.java,v
retrieving revision 1.26
diff -u -r1.26 tcpmon.java
--- src/org/apache/axis/utils/tcpmon.java       19 Feb 2002 12:55:39 -0000      1.26
+++ src/org/apache/axis/utils/tcpmon.java       27 Feb 2002 00:36:13 -0000
@@ -443,19 +443,41 @@
                 int         reqSaved = 0 ;
 
                 int   thisIndent, nextIndent=0 ;
-
+                inSocket.setSoTimeout(10 );
+                outSocket.setSoTimeout(10 );
+                
                 for ( ;; ) {
+                    if( done ) break;
                     len = in.available();
-                    if ( len == 0 ) len = 1 ;
+                    // Used to be 1, but if we block it doesn't matter 
+                    // however 1 will break with some servers, including apache
+                    if ( len == 0 ) len = 4096 ;
                     if ( saved+len > 4096 ) len = 4096-saved ;
-                    len = in.read(buffer,saved,len);
+                    int len1=0;
+                    while( len1==0 ) {
+                        try {
+                            len1 = in.read(buffer,saved,len);
+                        } catch( java.io.InterruptedIOException ex ) {
+                            //System.out.println("Interrupted exception reading" + 
+this +
+                            //                   " " + done);
+                            len1=0;
+                            if( done ) return;
+                        }
+                    }
+                    // System.out.println("XXX Read result: " + this + " "  +len1 + " 
+" + out);
+                    len=len1;
                     if ( len == -1 ) break ;
 
+                    //System.out.println("Read: " + " "  + saved + " " +
+                    //                 len + " "  + new String( buffer, saved, 20 ));
+                    
                     // No matter how we may (or may not) format it, send it
                     // on unformatted - we don't want to mess with how its
                     // sent to the other side, just how its displayed
-                    if ( out != null ) 
+                    if ( out != null ) {
                       out.write( buffer, saved, len );
+                      //System.out.println("Write: " + len );
+                    }
                 
                     if ( tmodel != null && reqSaved < 50 ) {
                         String old = (String) tmodel.getValueAt( tableIndex, 
@@ -515,18 +537,21 @@
                     else {
                         textArea.append( new String( buffer, 0, len ) );
                     }
+                    System.out.println("Sleep 3");
                     this.sleep(3);  // Let other threads have a chance to run
                 }
                 this.sleep(3);  // Let other threads have a chance to run
                 // halt();
                 done = true ;
+                //System.out.println("Done reading " + this);
             }
             catch( Exception e ) {
-                // e.printStackTrace();
+                e.printStackTrace();
             }
         }
-        public void halt() {
+        public  void halt() {
             try {
+                //System.out.println("Closing " +this + " " + inSocket + " " + 
+outSocket );
                 if ( inSocket != null )  inSocket.close();
                 if ( outSocket != null ) outSocket.close();
                 inSocket  = null ;
@@ -535,8 +560,8 @@
                 if ( out != null ) out.close();
                 in = null ;
                 out = null ;
-            }
-            catch( Exception e ) {
+                done=true;
+            } catch( Exception e ) {
                 e.printStackTrace();
             }
         }
@@ -741,6 +766,7 @@
                 // while( !rr2.isDone() ) {
                     Thread.sleep( 10 );
                 }
+                //  System.out.println("Done ");
                 rr1.halt();
                 rr2.halt();
 

Reply via email to