mirror of
https://github.com/GravitLauncher/Launcher
synced 2024-11-15 03:31:15 +03:00
Fix filedownloader. (#28)
This commit is contained in:
parent
e133fc06cb
commit
fccd793168
1 changed files with 118 additions and 49 deletions
|
@ -6,69 +6,138 @@
|
|||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.security.cert.Certificate;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
|
||||
import ru.gravit.utils.helper.IOHelper;
|
||||
import ru.gravit.utils.helper.LogHelper;
|
||||
|
||||
public class Downloader implements Runnable {
|
||||
public static final int INTERVAL = 300;
|
||||
|
||||
public AtomicInteger writed = new AtomicInteger(0);
|
||||
private final File file;
|
||||
private final URL url;
|
||||
public final AtomicBoolean interrupt = new AtomicBoolean(false);
|
||||
public final AtomicBoolean interrupted = new AtomicBoolean(false);
|
||||
private final int skip;
|
||||
|
||||
@FunctionalInterface
|
||||
public static interface Handler {
|
||||
public void check(Certificate[] certs) throws IOException;
|
||||
}
|
||||
|
||||
public static final int INTERVAL = 300;
|
||||
|
||||
private final File file;
|
||||
private final URL url;
|
||||
public AtomicInteger writed = new AtomicInteger(0);
|
||||
public final AtomicBoolean interrupt = new AtomicBoolean(false);
|
||||
public final AtomicBoolean interrupted = new AtomicBoolean(false);
|
||||
public AtomicReference<Throwable> ex = new AtomicReference<>(null);
|
||||
|
||||
private final int skip;
|
||||
private final Handler handler;
|
||||
|
||||
public Downloader(URL url, File file) {
|
||||
this.file = file;
|
||||
this.url = url;
|
||||
this.skip = 0;
|
||||
}
|
||||
this.url = url;
|
||||
this.skip = 0;
|
||||
this.handler = null;
|
||||
}
|
||||
|
||||
public Downloader(URL url, File file, int skip) {
|
||||
this.file = file;
|
||||
this.url = url;
|
||||
this.skip = skip;
|
||||
}
|
||||
|
||||
public File getFile() {
|
||||
return file;
|
||||
}
|
||||
this.url = url;
|
||||
this.skip = skip;
|
||||
this.handler = null;
|
||||
}
|
||||
|
||||
public void downloadFile() throws IOException {
|
||||
if (!(url.getProtocol().equalsIgnoreCase("http") || url.getProtocol().equalsIgnoreCase("https"))) throw new IOException("Invalid protocol.");
|
||||
HttpURLConnection connect = (HttpURLConnection) (url).openConnection();
|
||||
connect.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); // for stupid servers
|
||||
connect.setInstanceFollowRedirects(true);
|
||||
if (!(connect.getResponseCode() >= 200 && connect.getResponseCode() < 300)) throw new IOException(String.format("Invalid response of http server %d.", connect.getResponseCode()));
|
||||
try (BufferedInputStream in = new BufferedInputStream(connect.getInputStream(), IOHelper.BUFFER_SIZE); FileOutputStream fout = new FileOutputStream(file, skip != 0)) {
|
||||
final byte data[] = new byte[IOHelper.BUFFER_SIZE];
|
||||
int count = -1;
|
||||
long timestamp = System.currentTimeMillis();
|
||||
int writed_local = 0;
|
||||
in.skip(skip);
|
||||
while ((count = in.read(data)) != -1) {
|
||||
fout.write(data, 0, count);
|
||||
writed_local += count;
|
||||
if (System.currentTimeMillis() - timestamp > INTERVAL) {
|
||||
writed.set(writed_local);
|
||||
LogHelper.debug("Downloaded %d", writed_local);
|
||||
if (interrupt.get()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
LogHelper.debug("Downloaded %d", writed_local);
|
||||
writed.set(writed_local);
|
||||
}
|
||||
interrupted.set(true);
|
||||
}
|
||||
public Downloader(URL url, File file, Handler handler) {
|
||||
this.file = file;
|
||||
this.url = url;
|
||||
this.skip = 0;
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
public Downloader(URL url, File file, int skip, Handler handler) {
|
||||
this.file = file;
|
||||
this.url = url;
|
||||
this.skip = skip;
|
||||
this.handler = handler;
|
||||
}
|
||||
|
||||
public File getFile() {
|
||||
return file;
|
||||
}
|
||||
|
||||
public Handler getHandler() {
|
||||
return handler;
|
||||
}
|
||||
|
||||
public void downloadFile() throws IOException {
|
||||
if (!(url.getProtocol().equalsIgnoreCase("http") || url.getProtocol().equalsIgnoreCase("https")))
|
||||
throw new IOException("Invalid protocol.");
|
||||
interrupted.set(false);
|
||||
if (url.getProtocol().equalsIgnoreCase("http")) {
|
||||
HttpURLConnection connect = (HttpURLConnection) (url).openConnection();
|
||||
connect.setRequestProperty("User-Agent",
|
||||
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); // for
|
||||
// stupid
|
||||
// servers
|
||||
connect.setInstanceFollowRedirects(true);
|
||||
if (!(connect.getResponseCode() >= 200 && connect.getResponseCode() < 300))
|
||||
throw new IOException(String.format("Invalid response of http server %d.", connect.getResponseCode()));
|
||||
try (BufferedInputStream in = new BufferedInputStream(connect.getInputStream(), IOHelper.BUFFER_SIZE);
|
||||
FileOutputStream fout = new FileOutputStream(file, skip != 0)) {
|
||||
final byte data[] = new byte[IOHelper.BUFFER_SIZE];
|
||||
int count = -1;
|
||||
long timestamp = System.currentTimeMillis();
|
||||
int writed_local = 0;
|
||||
in.skip(skip);
|
||||
while ((count = in.read(data)) != -1) {
|
||||
fout.write(data, 0, count);
|
||||
writed_local += count;
|
||||
if (System.currentTimeMillis() - timestamp > INTERVAL) {
|
||||
writed.set(writed_local);
|
||||
LogHelper.debug("Downloaded %d", writed_local);
|
||||
if (interrupt.get()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
LogHelper.debug("Downloaded %d", writed_local);
|
||||
writed.set(writed_local);
|
||||
}
|
||||
} else {
|
||||
HttpsURLConnection connect = (HttpsURLConnection) (url).openConnection();
|
||||
connect.setRequestProperty("User-Agent",
|
||||
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11"); // for
|
||||
// stupid
|
||||
// servers
|
||||
connect.setInstanceFollowRedirects(true);
|
||||
if (handler != null)
|
||||
handler.check(connect.getServerCertificates());
|
||||
if (!(connect.getResponseCode() >= 200 && connect.getResponseCode() < 300))
|
||||
throw new IOException(String.format("Invalid response of http server %d.", connect.getResponseCode()));
|
||||
try (BufferedInputStream in = new BufferedInputStream(connect.getInputStream(), IOHelper.BUFFER_SIZE);
|
||||
FileOutputStream fout = new FileOutputStream(file, skip != 0)) {
|
||||
final byte data[] = new byte[IOHelper.BUFFER_SIZE];
|
||||
int count = -1;
|
||||
long timestamp = System.currentTimeMillis();
|
||||
int writed_local = 0;
|
||||
in.skip(skip);
|
||||
while ((count = in.read(data)) != -1) {
|
||||
fout.write(data, 0, count);
|
||||
writed_local += count;
|
||||
if (System.currentTimeMillis() - timestamp > INTERVAL) {
|
||||
writed.set(writed_local);
|
||||
LogHelper.debug("Downloaded %d", writed_local);
|
||||
if (interrupt.get()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
LogHelper.debug("Downloaded %d", writed_local);
|
||||
writed.set(writed_local);
|
||||
}
|
||||
}
|
||||
interrupted.set(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
|
@ -77,6 +146,6 @@ public void run() {
|
|||
} catch (Throwable ex) {
|
||||
this.ex.set(ex);
|
||||
LogHelper.error(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue