Check completed download size against Content-Length header.
If the number of bytes received is less than the reported content length (e.g. a network timeout), mark the download with the "error" status instead of "complete". Content-Length should be reliable if reported at all, so this should be a valid approach. Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
parent
bd8e35cb81
commit
aed5163a83
|
@ -245,9 +245,18 @@ public class Download {
|
||||||
fos = fileOutputStream;
|
fos = fileOutputStream;
|
||||||
status = Status.DOWNLOADING;
|
status = Status.DOWNLOADING;
|
||||||
updateReadSoFar();
|
updateReadSoFar();
|
||||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
long bytesRead = fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||||
if (status == Status.DOWNLOADING) { // not interrupted
|
if (status == Status.DOWNLOADING) { // not interrupted
|
||||||
// TODO: if connection is lost before a download finishes, it's still marked as "complete"
|
// check if the entire file was received
|
||||||
|
if (bytesRead < contentLength) {
|
||||||
|
status = Status.ERROR;
|
||||||
|
Log.warn(String.format("Download '%s' failed: %d bytes expected, %d bytes received.", url.toString(), contentLength, bytesRead));
|
||||||
|
if (listener != null)
|
||||||
|
listener.error();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mark download as complete
|
||||||
status = Status.COMPLETE;
|
status = Status.COMPLETE;
|
||||||
rbc.close();
|
rbc.close();
|
||||||
fos.close();
|
fos.close();
|
||||||
|
@ -320,7 +329,7 @@ public class Download {
|
||||||
public long readSoFar() {
|
public long readSoFar() {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case COMPLETE:
|
case COMPLETE:
|
||||||
return contentLength;
|
return (rbc != null) ? rbc.getReadSoFar() : contentLength;
|
||||||
case DOWNLOADING:
|
case DOWNLOADING:
|
||||||
if (rbc != null)
|
if (rbc != null)
|
||||||
return rbc.getReadSoFar();
|
return rbc.getReadSoFar();
|
||||||
|
|
|
@ -174,9 +174,7 @@ public class MengSkyServer extends DownloadServer {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DownloadNode node = new DownloadNode(id, date, title, titleUnicode, artist, artistUnicode, creator);
|
nodeList.add(new DownloadNode(id, date, title, titleUnicode, artist, artistUnicode, creator));
|
||||||
System.out.println(node);
|
|
||||||
nodeList.add(node);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nodes = nodeList.toArray(new DownloadNode[nodeList.size()]);
|
nodes = nodeList.toArray(new DownloadNode[nodeList.size()]);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user