[blog name="name" bloghash="base64hash" blogtag="tag"]description[/blog] = link to all posts in the blog with the specified tag
[blog name="name" blogtag="tag"]description[/blog] = link to all posts in all blogs with the specified tag
[archive name="name" description="they have good stuff" schema="eep" location="http://syndiemedia.i2p/archive/archive.txt"]foo![/archive] = offer an easy way to sync up with a new Syndie archive
+
[address name="www.i2p" location="Nf3ab-ZFkmI-LyMt7Gjg...vobM57UpqSAAAA" schema="i2p" proto="eep"]official website[/address] = share a pet name reference to the given eepsite (using fields from the addresses page)
SML headers are newline delimited key:value pairs. Example keys are:
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index ff30e0d4a..d73af4b6e 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -148,10 +148,18 @@ public class EepGet {
}
public static String suggestName(String url) {
+ int last = url.lastIndexOf('/');
+ if ((last < 0) || (url.lastIndexOf('#') > last))
+ last = url.lastIndexOf('#');
+ if ((last < 0) || (url.lastIndexOf('?') > last))
+ last = url.lastIndexOf('?');
+ if ((last < 0) || (url.lastIndexOf('=') > last))
+ last = url.lastIndexOf('=');
+
String name = null;
- if (url.lastIndexOf('/') >= 0)
- name = sanitize(url.substring(url.lastIndexOf('/')+1));
- if (name != null)
+ if (last >= 0)
+ name = sanitize(url.substring(last+1));
+ if ( (name != null) && (name.length() > 0) )
return name;
else
return sanitize(url);
diff --git a/history.txt b/history.txt
index 2f029893a..f656732ca 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,11 @@
-$Id: history.txt,v 1.397 2006/02/15 00:33:17 jrandom Exp $
+$Id: history.txt,v 1.398 2006/02/15 08:36:29 jrandom Exp $
+
+2006-02-16 jrandom
+ * Bugfix to the I2PTunnel web config to properly accept i2cp port settings
+ * Initial sucker refactoring to simplify reuse of the html parsing
+ * Beginnings of hooks to push imported rss/atom out to remote syndie
+ archives automatically (though not enabled currently)
+ * Further SSU peer test cleanup
2006-02-15 jrandom
* Add in per-blog RSS feeds to Syndie
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index b69ec7939..dc1d630b9 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.341 $ $Date: 2006/02/15 00:33:33 $";
+ public final static String ID = "$Revision: 1.342 $ $Date: 2006/02/15 08:36:32 $";
public final static String VERSION = "0.6.1.9";
- public final static long BUILD = 26;
+ public final static long BUILD = 27;
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/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
index c869832e1..add0d9c3a 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -27,6 +27,7 @@ public class IntroductionManager {
_outbound = Collections.synchronizedMap(new HashMap(128));
_inbound = new ArrayList(128);
ctx.statManager().createRateStat("udp.receiveRelayIntro", "How often we get a relayed request for us to talk to someone?", "udp", new long[] { 60*1000, 5*60*1000, 10*60*1000 });
+ ctx.statManager().createRateStat("udp.receiveRelayRequest", "How often we receive a request to relay to someone else?", "udp", new long[] { 60*1000, 5*60*1000, 10*60*1000 });
}
public void reset() {
@@ -91,6 +92,7 @@ public class IntroductionManager {
}
public void receiveRelayRequest(RemoteHostId alice, UDPPacketReader reader) {
+ _context.statManager().addRateData("udp.receiveRelayRequest", 1, 0);
if (_context.router().isHidden())
return;
long tag = reader.getRelayRequestReader().readTag();
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
index 8e53ea433..e893b9cd9 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -47,6 +47,8 @@ class PeerTestManager {
_currentTest = null;
_currentTestComplete = false;
_context.statManager().createRateStat("udp.statusKnownCharlie", "How often the bob we pick passes us to a charlie we already have a session with?", "udp", new long[] { 60*1000, 20*60*1000, 60*60*1000 });
+ _context.statManager().createRateStat("udp.receiveTestReply", "How often we get a reply to our peer test?", "udp", new long[] { 60*1000, 20*60*1000, 60*60*1000 });
+ _context.statManager().createRateStat("udp.receiveTest", "How often we get a packet requesting us to participate in a peer test?", "udp", new long[] { 60*1000, 20*60*1000, 60*60*1000 });
}
private static final int RESEND_TIMEOUT = 5*1000;
@@ -146,6 +148,7 @@ class PeerTestManager {
* test
*/
private void receiveTestReply(RemoteHostId from, UDPPacketReader.PeerTestReader testInfo) {
+ _context.statManager().addRateData("udp.receiveTestReply", 1, 0);
PeerTestState test = _currentTest;
if (expired())
return;
@@ -161,7 +164,7 @@ class PeerTestManager {
test.setAlicePort(testInfo.readPort());
if (_log.shouldLog(Log.DEBUG))
- _log.debug("Receive test reply from bob @ " + from.getIP() + " via our " + test.getAlicePort() + "/" + test.getAlicePortFromCharlie());
+ _log.debug("Receive test reply from bob @ " + from + " via our " + test.getAlicePort() + "/" + test.getAlicePortFromCharlie());
if (test.getAlicePortFromCharlie() > 0)
testComplete(false);
} catch (UnknownHostException uhe) {
@@ -177,6 +180,7 @@ class PeerTestManager {
if (_log.shouldLog(Log.WARN))
_log.warn("Bob chose a charlie we already have a session to, cancelling the test and rerunning (bob: "
+ _currentTest + ", charlie: " + from + ")");
+ _currentTestComplete = true;
_context.statManager().addRateData("udp.statusKnownCharlie", 1, 0);
honorStatus(CommSystemFacade.STATUS_UNKNOWN);
return;
@@ -286,6 +290,7 @@ class PeerTestManager {
*
*/
public void receiveTest(RemoteHostId from, UDPPacketReader reader) {
+ _context.statManager().addRateData("udp.receiveTest", 1, 0);
UDPPacketReader.PeerTestReader testInfo = reader.getPeerTestReader();
byte testIP[] = null;
int testPort = testInfo.readPort();
@@ -318,7 +323,7 @@ class PeerTestManager {
// initiated test
} else {
if (_log.shouldLog(Log.DEBUG))
- _log.debug("We are charlie, as te testIP/port is " + testIP + ":" + testPort + " and the state is unknown for " + nonce);
+ _log.debug("We are charlie, as te testIP/port is " + RemoteHostId.toString(testIP) + ":" + testPort + " and the state is unknown for " + nonce);
// we are charlie, since alice never sends us her IP and port, only bob does (and,
// erm, we're not alice, since it isn't our nonce)
receiveFromBobAsCharlie(from, testInfo, nonce, null);
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index 66b0c0784..0236121b1 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -113,7 +113,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
private static final int MAX_CONSECUTIVE_FAILED = 5;
- private static final int TEST_FREQUENCY = 3*60*1000;
+ private static final int TEST_FREQUENCY = 13*60*1000;
public UDPTransport(RouterContext ctx) {
super(ctx);
@@ -973,7 +973,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
buf.append(" pushes: ").append(pushCount);
buf.append(" expired? ").append(expired);
buf.append(" unacked: ").append(msg.getUnackedSize());
- if (!successful) {
+ if ( (p != null) && (!successful) ) {
buf.append(" consec_failed: ").append(p.getConsecutiveFailedSends());
long timeSinceSend = _context.clock().now() - p.getLastSendFullyTime();
buf.append(" lastFullSend: ").append(timeSinceSend);
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
index 6f27e561f..fe2aa9522 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
@@ -68,8 +68,8 @@ public class TunnelParticipant {
ok = _inboundEndpointProcessor.retrievePreprocessedData(msg.getData(), 0, msg.getData().length, recvFrom);
if (!ok) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Failed to dispatch " + msg + ": processor=" + _processor
+ if (_log.shouldLog(Log.WARN))
+ _log.warn("Failed to dispatch " + msg + ": processor=" + _processor
+ " inboundEndpoint=" + _inboundEndpointProcessor);
return;
}
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
index 79683925e..30c68005e 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
@@ -82,8 +82,8 @@ class BuildExecutor implements Runnable {
PooledTunnelCreatorConfig cfg = (PooledTunnelCreatorConfig)expired.get(i);
// note the fact that this tunnel request timed out in the peers' profiles.
// or... not.
- if (_log.shouldLog(Log.ERROR))
- _log.error("Timed out waiting for reply asking for " + cfg);
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Timed out waiting for reply asking for " + cfg);
TunnelPool pool = cfg.getTunnelPool();
if (pool != null)
pool.buildComplete(cfg);
@@ -274,8 +274,8 @@ class BuildExecutor implements Runnable {
}
long expireBefore = _context.clock().now() + 10*60*1000 - BuildRequestor.REQUEST_TIMEOUT;
if (cfg.getExpiration() <= expireBefore) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Build complete for expired tunnel: " + cfg);
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Build complete for expired tunnel: " + cfg);
}
}
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
index 306ea9968..008598a9a 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
@@ -221,8 +221,8 @@ class BuildHandler {
_context.statManager().addRateData("tunnel.buildClientReject", rtt, rtt);
}
} else {
- if (_log.shouldLog(Log.ERROR))
- _log.error(msg.getUniqueId() + ": Tunnel reply could not be decrypted for tunnel " + cfg);
+ if (_log.shouldLog(Log.WARN))
+ _log.warn(msg.getUniqueId() + ": Tunnel reply could not be decrypted for tunnel " + cfg);
}
}
@@ -247,8 +247,8 @@ class BuildHandler {
_context.statManager().addRateData("tunnel.decryptRequestTime", decryptTime, decryptTime);
if (req == null) {
// no records matched, or the decryption failed. bah
- if (_log.shouldLog(Log.ERROR))
- _log.error("The request " + state.msg.getUniqueId() + " could not be decrypted");
+ if (_log.shouldLog(Log.WARN))
+ _log.warn("The request " + state.msg.getUniqueId() + " could not be decrypted");
return;
}
@@ -309,8 +309,8 @@ class BuildHandler {
public String getName() { return "Timeout looking for next peer for tunnel join"; }
public void runJob() {
getContext().statManager().addRateData("tunnel.rejectTimeout", 1, 1);
- if (_log.shouldLog(Log.ERROR))
- _log.error("Request " + _state.msg.getUniqueId()
+ if (_log.shouldLog(Log.WARN))
+ _log.warn("Request " + _state.msg.getUniqueId()
+ " could no be satisfied, as the next peer could not be found: " + _nextPeer.toBase64());
getContext().messageHistory().tunnelRejected(_state.fromHash, new TunnelId(_req.readReceiveTunnelId()), _nextPeer,
"rejected because we couldn't find " + _nextPeer.toBase64() + ": " +