diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index 6a1c4230aa0ae3f56cd551c54b41aa0278504ccf..73a5bf4e8c202ce08a9fa607cf2c824a05611ba3 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -11,6 +11,7 @@ import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.io.OutputStream;
 import java.net.ConnectException;
+import java.net.InetSocketAddress;
 import java.net.MalformedURLException;
 import java.net.Socket;
 import java.net.UnknownHostException;
@@ -82,9 +83,9 @@ public class EepGet {
     protected boolean _transferFailed;
     protected boolean _headersRead;
     protected boolean _aborted;
-    private long _fetchHeaderTimeout;
+    protected int _fetchHeaderTimeout;
     private long _fetchEndTime;
-    protected long _fetchInactivityTimeout;
+    protected int _fetchInactivityTimeout;
     protected int _redirects;
     protected String _redirectLocation;
     protected boolean _isGzippedResponse;
@@ -96,8 +97,8 @@ public class EepGet {
 
     /** this will be replaced by the HTTP Proxy if we are using it */
     protected static final String USER_AGENT = "Wget/1.11.4";
-    protected static final long CONNECT_TIMEOUT = 45*1000;
-    protected static final long INACTIVITY_TIMEOUT = 60*1000;
+    protected static final int CONNECT_TIMEOUT = 45*1000;
+    protected static final int INACTIVITY_TIMEOUT = 60*1000;
     /** maximum times to try without getting any data at all, even if numRetries is higher @since 0.7.14 */
     protected static final int MAX_COMPLETE_FAILS = 5;
 
@@ -577,9 +578,9 @@ public class EepGet {
      * @param inactivityTimeout <= 0 for default 60 sec
      */
     public boolean fetch(long fetchHeaderTimeout, long totalTimeout, long inactivityTimeout) {
-        _fetchHeaderTimeout = fetchHeaderTimeout;
+        _fetchHeaderTimeout = (int) Math.min(fetchHeaderTimeout, Integer.MAX_VALUE);
         _fetchEndTime = (totalTimeout > 0 ? System.currentTimeMillis() + totalTimeout : -1);
-        _fetchInactivityTimeout = inactivityTimeout;
+        _fetchInactivityTimeout = (int) Math.min(inactivityTimeout, Integer.MAX_VALUE);
         _keepFetching = true;
 
         if (_log.shouldLog(Log.DEBUG))
@@ -677,6 +678,10 @@ public class EepGet {
             else
                 timeout.setInactivityTimeout(INACTIVITY_TIMEOUT);
         }
+        if (_fetchInactivityTimeout > 0)
+            _proxy.setSoTimeout(_fetchInactivityTimeout);
+        else
+            _proxy.setSoTimeout(INACTIVITY_TIMEOUT);
         
         if (_redirectLocation != null) {
             // we also are here after a 407
@@ -911,6 +916,7 @@ public class EepGet {
             case 408: // req timeout
             case 409: // bad addr helper
             case 414: // URI too long
+            case 429: // too many requests
             case 431: // headers too long
             case 503: // no outproxy
                 _transferFailed = true;
@@ -1193,7 +1199,13 @@ public class EepGet {
                     int port = url.getPort();
                     if (port == -1)
                         port = 80;
-                    _proxy = new Socket(host, port);
+                    if (_fetchHeaderTimeout > 0) {
+                        _proxy = new Socket();
+                        _proxy.setSoTimeout(_fetchHeaderTimeout);
+                        _proxy.connect(new InetSocketAddress(host, port), _fetchHeaderTimeout);
+                    } else {
+                        _proxy = new Socket(host, port);
+                    }
                 } else {
                     throw new MalformedURLException("URL is not supported:" + _actualURL);
                 }
diff --git a/core/java/src/net/i2p/util/SSLEepGet.java b/core/java/src/net/i2p/util/SSLEepGet.java
index 4cf5400898685afd38675a43c3207aa485a7c909..6c50026c469028bca821f594dd49215517cd2fca 100644
--- a/core/java/src/net/i2p/util/SSLEepGet.java
+++ b/core/java/src/net/i2p/util/SSLEepGet.java
@@ -44,6 +44,7 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
+import java.net.InetSocketAddress;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.security.KeyStore;
@@ -409,6 +410,10 @@ public class SSLEepGet extends EepGet {
             else
                 timeout.setInactivityTimeout(60*1000);
         }        
+        if (_fetchInactivityTimeout > 0)
+            _proxy.setSoTimeout(_fetchInactivityTimeout);
+        else
+            _proxy.setSoTimeout(INACTIVITY_TIMEOUT);
 
         if (_redirectLocation != null) {
             throw new IOException("Server redirect to " + _redirectLocation + " not allowed");
@@ -550,9 +555,15 @@ public class SSLEepGet extends EepGet {
                 if (port == -1)
                     port = 443;
                 if (_sslContext != null)
-                    _proxy = _sslContext.getSocketFactory().createSocket(host, port);
+                    _proxy = _sslContext.getSocketFactory().createSocket();
                 else
-                    _proxy = SSLSocketFactory.getDefault().createSocket(host, port);
+                    _proxy = SSLSocketFactory.getDefault().createSocket();
+                if (_fetchHeaderTimeout > 0) {
+                    _proxy.setSoTimeout(_fetchHeaderTimeout);
+                    _proxy.connect(new InetSocketAddress(host, port), _fetchHeaderTimeout);
+                } else {
+                    _proxy.connect(new InetSocketAddress(host, port));
+                }
                 SSLSocket socket = (SSLSocket) _proxy;
                 I2PSSLSocketFactory.setProtocolsAndCiphers(socket);
             } else {