From 8e87ae08fbf4dbee638c1fb506bc973f879bbe36 Mon Sep 17 00:00:00 2001
From: jrandom <jrandom>
Date: Fri, 30 Dec 2005 20:57:53 +0000
Subject: [PATCH] 2005-12-30  jrandom     * Small streaming lib bugfixes for
 the modified timeouts     * Minor Syndie/Sucker RSS html fix     * Small
 synchronization fix in I2PSnark (thanks fsm!)

---
 .../java/src/org/klomp/snark/PeerState.java    |  4 +++-
 .../client/streaming/I2PSocketOptionsImpl.java |  2 +-
 .../net/i2p/client/streaming/Connection.java   | 18 ++++++++++--------
 .../client/streaming/ConnectionOptions.java    |  1 +
 .../client/streaming/MessageInputStream.java   | 18 +++++++++++-------
 .../client/streaming/MessageOutputStream.java  |  7 ++++++-
 .../src/net/i2p/client/streaming/Packet.java   |  3 ++-
 .../syndie/java/src/net/i2p/syndie/Sucker.java |  4 +++-
 history.txt                                    |  7 ++++++-
 .../java/src/net/i2p/router/RouterVersion.java |  4 ++--
 .../transport/udp/InboundMessageState.java     |  4 ++--
 11 files changed, 47 insertions(+), 25 deletions(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
index 6820999e79..29c66bba6b 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
@@ -401,7 +401,9 @@ class PeerState
     // Are there outstanding requests that have to be resend?
     if (resend)
       {
-        out.sendRequests(outstandingRequests);
+        synchronized (this) {
+            out.sendRequests(outstandingRequests);
+        }
         resend = false;
       }
 
diff --git a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java
index bd4efb28b7..eb58b68715 100644
--- a/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java
+++ b/apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java
@@ -13,7 +13,7 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
     private int _maxBufferSize;
     
     public static final int DEFAULT_BUFFER_SIZE = 1024*64;
-    public static final int DEFAULT_WRITE_TIMEOUT = 60*1000;
+    public static final int DEFAULT_WRITE_TIMEOUT = -1;
     public static final int DEFAULT_CONNECT_TIMEOUT = 60*1000;
     
     public I2PSocketOptionsImpl() {
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
index 74b52900c2..469a115e3a 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
@@ -123,8 +123,8 @@ public class Connection {
         _context.statManager().createRateStat("stream.con.windowSizeAtCongestion", "How large was our send window when we send a dup?", "Stream", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
         _context.statManager().createRateStat("stream.chokeSizeBegin", "How many messages were outstanding when we started to choke?", "Stream", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
         _context.statManager().createRateStat("stream.chokeSizeEnd", "How many messages were outstanding when we stopped being choked?", "Stream", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("New connection created with options: " + _options);
+        if (_log.shouldLog(Log.INFO))
+            _log.info("New connection created with options: " + _options);
     }
     
     public long getNextOutboundPacketNum() { 
@@ -164,11 +164,13 @@ public class Connection {
                 started = true;
                 if ( (_outboundPackets.size() >= _options.getWindowSize()) || (_activeResends > 0) ||
                      (_lastSendId - _highestAckedThrough > _options.getWindowSize()) ) {
-                    if (writeExpire > 0) {
+                    if (timeoutMs > 0) {
                         if (timeLeft <= 0) {
-                            _log.error("Outbound window is full of " + _outboundPackets.size() 
-                                       + " with " + _activeResends + " active resends"
-                                       + " and we've waited too long (" + writeExpire + "ms)");
+                            if (_log.shouldLog(Log.INFO))
+                                _log.info("Outbound window is full of " + _outboundPackets.size() 
+                                          + " with " + _activeResends + " active resends"
+                                          + " and we've waited too long (" + (0-(timeLeft - timeoutMs)) + "ms): " 
+                                          + toString());
                             return false;
                         }
                         if (_log.shouldLog(Log.DEBUG))
@@ -387,8 +389,8 @@ public class Connection {
                     _ackedPackets++;
                     if (p.getNumSends() > 1) {
                         _activeResends--;
-                        if (_log.shouldLog(Log.INFO))
-                            _log.info("Active resend of " + p + " successful, # active left: " + _activeResends);
+                        if (_log.shouldLog(Log.DEBUG))
+                            _log.debug("Active resend of " + p + " successful, # active left: " + _activeResends);
                     }
                 }
             }
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
index e7cf733540..1df36bc3b2 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
@@ -355,6 +355,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
         buf.append(" cwin=").append(_windowSize);
         buf.append(" maxResends=").append(_maxResends);
         buf.append(" writeTimeout=").append(getWriteTimeout());
+        buf.append(" readTimeout=").append(getReadTimeout());
         buf.append(" inactivityTimeout=").append(_inactivityTimeout);
         buf.append(" inboundBuffer=").append(_inboundBufferSize);
         buf.append(" maxWindowSize=").append(_maxWindowSize);
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
index c894f98e34..df7abbcc29 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
@@ -158,7 +158,11 @@ public class MessageInputStream extends InputStream {
      * but if it is 0, do not block at all)
      */
     public int getReadTimeout() { return _readTimeout; }
-    public void setReadTimeout(int timeout) { _readTimeout = timeout; }
+    public void setReadTimeout(int timeout) {
+        if (_log.shouldLog(Log.INFO))
+            _log.info("Changing read timeout from " + _readTimeout + " to " + timeout);
+        _readTimeout = timeout; 
+    }
     
     public void closeReceived() {
         synchronized (_dataLock) {
@@ -302,8 +306,8 @@ public class MessageInputStream extends InputStream {
                                 throwAnyError();
                             } else { // readTimeout == 0
                                 // noop, don't block
-                                if (_log.shouldLog(Log.INFO))
-                                    _log.info("read(...," + offset+", " + length+ ")[" + i 
+                                if (_log.shouldLog(Log.DEBUG))
+                                    _log.debug("read(...," + offset+", " + length+ ")[" + i 
                                                + ") with nonblocking setup: " + toString());
                                 return i;
                             }
@@ -320,8 +324,8 @@ public class MessageInputStream extends InputStream {
                     // we looped a few times then got data, so this pass doesnt count
                     i--;
                 } else if (_readyDataBlocks.size() <= 0) {
-                    if (_log.shouldLog(Log.INFO))
-                        _log.info("read(...," + offset+", " + length+ ")[" + i 
+                    if (_log.shouldLog(Log.DEBUG))
+                        _log.debug("read(...," + offset+", " + length+ ")[" + i 
                                    + "] no more ready blocks, returning");
                     return i;
                 } else {
@@ -351,7 +355,7 @@ public class MessageInputStream extends InputStream {
         }  // synchronized (_dataLock)
         
         if (_log.shouldLog(Log.DEBUG))
-            _log.info("read(...," + offset+", " + length+ ") read fully total read: " +_readTotal);
+            _log.debug("read(...," + offset+", " + length+ ") read fully total read: " +_readTotal);
 
         return length;
     }
@@ -370,7 +374,7 @@ public class MessageInputStream extends InputStream {
             }
         }
         if (_log.shouldLog(Log.DEBUG))
-            _log.info("available(): " + numBytes + " " + toString());
+            _log.debug("available(): " + numBytes + " " + toString());
         
         return numBytes;
     }
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java
index 453733a2b3..16b0a0734f 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java
@@ -68,7 +68,12 @@ public class MessageOutputStream extends OutputStream {
             _log.debug("MessageOutputStream created");
     }
     
-    public void setWriteTimeout(int ms) { _writeTimeout = ms; }
+    public void setWriteTimeout(int ms) { 
+        if (_log.shouldLog(Log.INFO))
+            _log.info("Changing write timeout from " + _writeTimeout + " to " + ms);
+
+        _writeTimeout = ms; 
+    }
     public int getWriteTimeout() { return _writeTimeout; }
     public void setBufferSize(int size) { _nextBufferSize = size; }
     
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Packet.java b/apps/streaming/java/src/net/i2p/client/streaming/Packet.java
index da81000818..593863564f 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/Packet.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/Packet.java
@@ -516,7 +516,8 @@ public class Packet {
         boolean ok = ctx.dsa().verifySignature(_optionSignature, buffer, 0, size, from.getSigningPublicKey());
         if (!ok) {
             Log l = ctx.logManager().getLog(Packet.class);
-            l.error("Signature failed on " + toString(), new Exception("moo"));
+            if (l.shouldLog(Log.WARN))
+                l.warn("Signature failed on " + toString(), new Exception("moo"));
             if (false) {
                 l.error(Base64.encode(buffer, 0, size));
                 l.error("Signature: " + Base64.encode(_optionSignature.getData()));
diff --git a/apps/syndie/java/src/net/i2p/syndie/Sucker.java b/apps/syndie/java/src/net/i2p/syndie/Sucker.java
index d66b4f20b1..b11ba31b0b 100644
--- a/apps/syndie/java/src/net/i2p/syndie/Sucker.java
+++ b/apps/syndie/java/src/net/i2p/syndie/Sucker.java
@@ -581,8 +581,10 @@ public class Sucker {
             
             a=htmlTagLowerCase.indexOf("href=\"")+6;
             b=a+1;
-            while(htmlTagLowerCase.charAt(b)!='\"')
+            while ( (b < htmlTagLowerCase.length()) && (htmlTagLowerCase.charAt(b)!='\"') )
                 b++;
+            if (b >= htmlTagLowerCase.length())
+                return null; // abort the b0rked tag
             String link=htmlTag.substring(a,b);
             if(link.indexOf("http")<0)
                 link=baseUrl+"/"+link;
diff --git a/history.txt b/history.txt
index 98541049dd..74aa22c2c0 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,9 @@
-$Id: history.txt,v 1.372 2005/12/29 08:07:22 jrandom Exp $
+$Id: history.txt,v 1.373 2005/12/30 13:16:46 jrandom Exp $
+
+2005-12-30  jrandom
+    * Small streaming lib bugfixes for the modified timeouts
+    * Minor Syndie/Sucker RSS html fix
+    * Small synchronization fix in I2PSnark (thanks fsm!)
 
 2005-12-30  jrandom
     * Replaced the bundled linux jcpuid (written in C++) with scintilla's
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 6447723c19..a316f02630 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
  *
  */
 public class RouterVersion {
-    public final static String ID = "$Revision: 1.319 $ $Date: 2005/12/27 08:20:54 $";
+    public final static String ID = "$Revision: 1.320 $ $Date: 2005/12/29 08:07:24 $";
     public final static String VERSION = "0.6.1.8";
-    public final static long BUILD = 3;
+    public final static long BUILD = 4;
     public static void main(String args[]) {
         System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
         System.out.println("Router ID: " + RouterVersion.ID);
diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
index 31f6e94e68..be8d03cd0d 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
@@ -53,7 +53,7 @@ public class InboundMessageState {
     public boolean receiveFragment(UDPPacketReader.DataReader data, int dataFragment) {
         int fragmentNum = data.readMessageFragmentNum(dataFragment);
         if ( (fragmentNum < 0) || (fragmentNum > _fragments.length)) {
-            _log.error("Invalid fragment " + fragmentNum + "/" + _fragments.length);
+            _log.warn("Invalid fragment " + fragmentNum + "/" + _fragments.length);
             return false;
         }
         if (_fragments[fragmentNum] == null) {
@@ -73,7 +73,7 @@ public class InboundMessageState {
                                + ", isLast=" + isLast
                                + ", data=" + Base64.encode(message.getData(), 0, size));
             } catch (ArrayIndexOutOfBoundsException aioobe) {
-                _log.error("Corrupt SSU fragment " + fragmentNum, aioobe);
+                _log.warn("Corrupt SSU fragment " + fragmentNum, aioobe);
                 return false;
             }
         } else {
-- 
GitLab