diff --git a/pom.xml b/pom.xml index 468b306d8..bc3c97500 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.tonikelope MegaBasterd - 6.66 + 6.67 jar diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java index 418524fb8..2f3d1aa03 100644 --- a/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java +++ b/src/main/java/com/tonikelope/megabasterd/ChunkDownloader.java @@ -23,6 +23,7 @@ import java.util.logging.Logger; public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { public static final double SLOW_PROXY_PERC = 0.3; + public static final int READ_TIMEOUT_RETRY = 3; private static final Logger LOG = Logger.getLogger(ChunkDownloader.class.getName()); private final boolean FORCE_SMART_PROXY = false; //True for debugging SmartProxy private final int _id; @@ -112,7 +113,7 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { int http_error = 0, http_status = -1, conta_error = 0; - boolean timeout = false, chunk_error = false, slow_proxy = false, turbo_mode = false; + boolean chunk_error = false, slow_proxy = false, turbo_mode = false; String worker_url = null; @@ -234,8 +235,6 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { chunk_error = true; - timeout = false; - slow_proxy = false; File tmp_chunk_file = null, chunk_file = null; @@ -270,27 +269,44 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { int reads = 0; - while (!_exit && !_download.isStopped() && !_download.getChunkmanager().isExit() && chunk_reads < chunk_size && (reads = is.read(buffer, 0, Math.min((int) (chunk_size - chunk_reads), buffer.length))) != -1) { + if (!_exit && !_download.isStopped() && !_download.getChunkmanager().isExit()) { - tmp_chunk_file_os.write(buffer, 0, reads); + int retry_timeout = 0; - chunk_reads += reads; + do { - _download.getPartialProgress().add((long) reads); + try { - _download.getProgress_meter().secureNotify(); + if ((reads = is.read(buffer, 0, Math.min((int) (chunk_size - chunk_reads), buffer.length))) != -1) { - if (_download.isPaused() && !_download.isStopped()) { + tmp_chunk_file_os.write(buffer, 0, reads); - _download.pause_worker(); + chunk_reads += reads; - pause_init_time = System.currentTimeMillis(); + _download.getPartialProgress().add((long) reads); - secureWait(); + _download.getProgress_meter().secureNotify(); - paused += System.currentTimeMillis() - pause_init_time; + if (_download.isPaused() && !_download.isStopped()) { - } + _download.pause_worker(); + + pause_init_time = System.currentTimeMillis(); + + secureWait(); + + paused += System.currentTimeMillis() - pause_init_time; + + } + + } + + } catch (SocketTimeoutException timeout_exception) { + LOG.log(Level.WARNING, timeout_exception.getMessage()); + retry_timeout++; + } + + } while (!_exit && !_download.isStopped() && !_download.getChunkmanager().isExit() && chunk_reads < chunk_size && reads != -1 && retry_timeout <= READ_TIMEOUT_RETRY); } @@ -362,10 +378,6 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { } catch (IOException ex) { - if (ex instanceof SocketTimeoutException) { - timeout = true; - } - LOG.log(Level.SEVERE, ex.getMessage()); } finally { @@ -385,7 +397,7 @@ public class ChunkDownloader implements Runnable, SecureSingleThreadNotifiable { _download.getProgress_meter().secureNotify(); } - if (!_exit && !_download.isStopped() && !timeout && (http_error != 509 || _current_smart_proxy != null) && http_error != 403 && http_error != 503) { + if (!_exit && !_download.isStopped() && (http_error != 509 || _current_smart_proxy != null) && http_error != 403 && http_error != 503) { _error_wait = true; diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkDownloaderMono.java b/src/main/java/com/tonikelope/megabasterd/ChunkDownloaderMono.java index a6fb55ea2..47cab2ae0 100644 --- a/src/main/java/com/tonikelope/megabasterd/ChunkDownloaderMono.java +++ b/src/main/java/com/tonikelope/megabasterd/ChunkDownloaderMono.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.SocketTimeoutException; import java.net.URL; import java.util.logging.Level; import java.util.logging.Logger; @@ -22,6 +23,8 @@ public class ChunkDownloaderMono extends ChunkDownloader { private static final Logger LOG = Logger.getLogger(ChunkDownloaderMono.class.getName()); + public static final int READ_TIMEOUT_RETRY = 3; + public ChunkDownloaderMono(Download download) { super(1, download); } @@ -124,27 +127,38 @@ public class ChunkDownloaderMono extends ChunkDownloader { if (!isExit() && !getDownload().isStopped() && cis != null) { - int reads = 0; + int reads = 0, retry_timeout = 0; - while (!getDownload().isStopped() && chunk_reads < chunk_size && (reads = cis.read(buffer, 0, Math.min((int) (chunk_size - chunk_reads), buffer.length))) != -1) { + do { - getDownload().getOutput_stream().write(buffer, 0, reads); + try { - chunk_reads += reads; + if ((reads = cis.read(buffer, 0, Math.min((int) (chunk_size - chunk_reads), buffer.length))) != -1) { - getDownload().getPartialProgress().add((long) reads); + getDownload().getOutput_stream().write(buffer, 0, reads); - getDownload().getProgress_meter().secureNotify(); + chunk_reads += reads; - if (getDownload().isPaused() && !getDownload().isStopped()) { + getDownload().getPartialProgress().add((long) reads); - getDownload().pause_worker_mono(); + getDownload().getProgress_meter().secureNotify(); - secureWait(); + if (getDownload().isPaused() && !getDownload().isStopped()) { + getDownload().pause_worker_mono(); + + secureWait(); + + } + + } + } catch (SocketTimeoutException timeout_exception) { + LOG.log(Level.WARNING, timeout_exception.getMessage()); + + retry_timeout++; } - } + } while (!getDownload().isStopped() && chunk_reads < chunk_size && reads != -1 && retry_timeout <= READ_TIMEOUT_RETRY); if (chunk_reads == chunk_size) { diff --git a/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java b/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java index 89ecf2305..c79a048e5 100644 --- a/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java +++ b/src/main/java/com/tonikelope/megabasterd/ChunkUploader.java @@ -10,6 +10,7 @@ import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.SocketTimeoutException; import java.net.URL; import java.nio.channels.Channels; import java.util.logging.Level; @@ -23,6 +24,7 @@ import javax.crypto.CipherInputStream; public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { public static final int MAX_CHUNK_ERROR = 100; + public static final int READ_TIMEOUT_RETRY = 3; private static final Logger LOG = Logger.getLogger(ChunkUploader.class.getName()); private final int _id; private final Upload _upload; @@ -214,17 +216,28 @@ public class ChunkUploader implements Runnable, SecureSingleThreadNotifiable { if (chunk_offset + chunk_size == _upload.getFile_size()) { LOG.log(Level.INFO, "{0} Worker {1} {2} waiting for completion handler...", new Object[]{Thread.currentThread().getName(), _id, _upload.getFile_name()}); - String httpresponse; + String httpresponse = null; try (InputStream is = con.getInputStream(); ByteArrayOutputStream byte_res = new ByteArrayOutputStream()) { - while ((reads = is.read(buffer)) != -1) { + int retry_timeout = 0; - byte_res.write(buffer, 0, reads); + do { + try { + + if ((reads = is.read(buffer)) != -1) { + byte_res.write(buffer, 0, reads); + } + } catch (SocketTimeoutException timeout_exception) { + LOG.log(Level.WARNING, timeout_exception.getMessage()); + retry_timeout++; + } + + } while (reads != -1 && retry_timeout <= READ_TIMEOUT_RETRY); + + if (retry_timeout <= READ_TIMEOUT_RETRY) { + httpresponse = new String(byte_res.toByteArray(), "UTF-8"); } - - httpresponse = new String(byte_res.toByteArray(), "UTF-8"); - } if (httpresponse.length() > 0) { diff --git a/src/main/java/com/tonikelope/megabasterd/MainPanel.java b/src/main/java/com/tonikelope/megabasterd/MainPanel.java index 2182319aa..78856f366 100644 --- a/src/main/java/com/tonikelope/megabasterd/MainPanel.java +++ b/src/main/java/com/tonikelope/megabasterd/MainPanel.java @@ -53,7 +53,7 @@ import javax.swing.UIManager; */ public final class MainPanel { - public static final String VERSION = "6.66"; + public static final String VERSION = "6.67"; public static final int THROTTLE_SLICE_SIZE = 16 * 1024; public static final int DEFAULT_BYTE_BUFFER_SIZE = 16 * 1024; public static final int STREAMER_PORT = 1337; diff --git a/src/main/java/com/tonikelope/megabasterd/Transference.java b/src/main/java/com/tonikelope/megabasterd/Transference.java index 20b2b5687..13127235a 100644 --- a/src/main/java/com/tonikelope/megabasterd/Transference.java +++ b/src/main/java/com/tonikelope/megabasterd/Transference.java @@ -10,9 +10,9 @@ public interface Transference { int MIN_WORKERS = 1; int MAX_WORKERS = 20; - int HTTP_CONNECT_TIMEOUT = 15000; + int HTTP_CONNECT_TIMEOUT = 10000; int HTTP_PROXY_CONNECT_TIMEOUT = 15000; - int HTTP_READ_TIMEOUT = 15000; + int HTTP_READ_TIMEOUT = 10000; int HTTP_PROXY_READ_TIMEOUT = 15000; int MAX_SIM_TRANSFERENCES = 20; int SIM_TRANSFERENCES_DEFAULT = 4; diff --git a/src/main/java/com/tonikelope/megabasterd/Upload.java b/src/main/java/com/tonikelope/megabasterd/Upload.java index af45e7259..3ee222840 100644 --- a/src/main/java/com/tonikelope/megabasterd/Upload.java +++ b/src/main/java/com/tonikelope/megabasterd/Upload.java @@ -26,7 +26,7 @@ import javax.swing.JComponent; */ public class Upload implements Transference, Runnable, SecureSingleThreadNotifiable { - public static final int HTTP_READ_TIMEOUT = 30000; + public static final int HTTP_READ_TIMEOUT = 60000; public static final int WORKERS_DEFAULT = 6; public static final int CHUNK_SIZE_MULTI = 1; //Otra cosa da errores al reanudar una subida (investigar) private static final Logger LOG = Logger.getLogger(Upload.class.getName()); diff --git a/src/main/resources/images/mbasterd_screen.png b/src/main/resources/images/mbasterd_screen.png index 8f30237d7..2698a4a03 100644 Binary files a/src/main/resources/images/mbasterd_screen.png and b/src/main/resources/images/mbasterd_screen.png differ