diff --git a/.gitignore b/.gitignore index 9c4de58..80e6131 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ .gradle /local.properties -/.idea/workspace.xml -/.idea/libraries +.idea/ .DS_Store /build /captures +*.iml diff --git a/library/src/main/java/com/aspsine/multithreaddownload/DownloadRequest.java b/library/src/main/java/com/aspsine/multithreaddownload/DownloadRequest.java index ed3e363..0572818 100644 --- a/library/src/main/java/com/aspsine/multithreaddownload/DownloadRequest.java +++ b/library/src/main/java/com/aspsine/multithreaddownload/DownloadRequest.java @@ -9,6 +9,8 @@ public class DownloadRequest { private String mUri; + private String finalUri; + private File mFolder; private CharSequence mName; @@ -32,6 +34,14 @@ public String getUri() { return mUri; } + public String getFinalUri() { + return finalUri; + } + + public void setFinalUri(String finalUri) { + this.finalUri = finalUri; + } + public File getFolder() { return mFolder; } diff --git a/library/src/main/java/com/aspsine/multithreaddownload/architecture/ConnectTask.java b/library/src/main/java/com/aspsine/multithreaddownload/architecture/ConnectTask.java index 85d95e8..5f388ee 100644 --- a/library/src/main/java/com/aspsine/multithreaddownload/architecture/ConnectTask.java +++ b/library/src/main/java/com/aspsine/multithreaddownload/architecture/ConnectTask.java @@ -1,7 +1,6 @@ package com.aspsine.multithreaddownload.architecture; import com.aspsine.multithreaddownload.DownloadException; -import com.aspsine.multithreaddownload.DownloadInfo; /** * Created by Aspsine on 2015/10/29. @@ -11,7 +10,7 @@ public interface ConnectTask extends Runnable { interface OnConnectListener { void onConnecting(); - void onConnected(long time, long length, boolean isAcceptRanges); + void onConnected(long time, long length, boolean isAcceptRanges, String finalUri); void onConnectPaused(); diff --git a/library/src/main/java/com/aspsine/multithreaddownload/core/ConnectTaskImpl.java b/library/src/main/java/com/aspsine/multithreaddownload/core/ConnectTaskImpl.java index d108d70..91ab752 100644 --- a/library/src/main/java/com/aspsine/multithreaddownload/core/ConnectTaskImpl.java +++ b/library/src/main/java/com/aspsine/multithreaddownload/core/ConnectTaskImpl.java @@ -77,11 +77,15 @@ public void run() { } private void executeConnection() throws DownloadException { + executeConnection(mUri, 0); + } + + private void executeConnection(String uri, int redirectCount) throws DownloadException { mStartTime = System.currentTimeMillis(); HttpURLConnection httpConnection = null; final URL url; try { - url = new URL(mUri); + url = new URL(uri); } catch (MalformedURLException e) { throw new DownloadException(DownloadStatus.STATUS_FAILED, "Bad url.", e); } @@ -93,9 +97,20 @@ private void executeConnection() throws DownloadException { httpConnection.setRequestProperty("Range", "bytes=" + 0 + "-"); final int responseCode = httpConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { - parseResponse(httpConnection, false); + parseResponse(httpConnection, false, uri); } else if (responseCode == HttpURLConnection.HTTP_PARTIAL) { - parseResponse(httpConnection, true); + parseResponse(httpConnection, true, uri); + } else if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP) { + String location = httpConnection.getHeaderField("Location"); + if (location == null) { + throw new DownloadException(DownloadStatus.STATUS_FAILED, "response code:" + + HttpURLConnection.HTTP_MOVED_TEMP + ", but Header Location is null"); + } else if (redirectCount > 5) { + throw new DownloadException(DownloadStatus.STATUS_FAILED, "response code:" + + HttpURLConnection.HTTP_MOVED_TEMP + ",but Temporary Redirect is too many, redirectCount is" + redirectCount); + } else { + executeConnection(location, ++redirectCount); + } } else { throw new DownloadException(DownloadStatus.STATUS_FAILED, "UnSupported response code:" + responseCode); } @@ -110,7 +125,7 @@ private void executeConnection() throws DownloadException { } } - private void parseResponse(HttpURLConnection httpConnection, boolean isAcceptRanges) throws DownloadException { + private void parseResponse(HttpURLConnection httpConnection, boolean isAcceptRanges, String finalUri) throws DownloadException { final long length; String contentLength = httpConnection.getHeaderField("Content-Length"); @@ -129,7 +144,7 @@ private void parseResponse(HttpURLConnection httpConnection, boolean isAcceptRan //Successful mStatus = DownloadStatus.STATUS_CONNECTED; final long timeDelta = System.currentTimeMillis() - mStartTime; - mOnConnectListener.onConnected(timeDelta, length, isAcceptRanges); + mOnConnectListener.onConnected(timeDelta, length, isAcceptRanges, finalUri); } private void checkCanceledOrPaused() throws DownloadException { diff --git a/library/src/main/java/com/aspsine/multithreaddownload/core/DownloaderImpl.java b/library/src/main/java/com/aspsine/multithreaddownload/core/DownloaderImpl.java index ed3af93..19942d0 100644 --- a/library/src/main/java/com/aspsine/multithreaddownload/core/DownloaderImpl.java +++ b/library/src/main/java/com/aspsine/multithreaddownload/core/DownloaderImpl.java @@ -115,7 +115,7 @@ public void onConnecting() { } @Override - public void onConnected(long time, long length, boolean isAcceptRanges) { + public void onConnected(long time, long length, boolean isAcceptRanges, String finalUri) { if (mConnectTask.isCanceled()) { // despite connection is finished, the entire downloader is canceled onConnectCanceled(); @@ -125,6 +125,7 @@ public void onConnected(long time, long length, boolean isAcceptRanges) { mDownloadInfo.setAcceptRanges(isAcceptRanges); mDownloadInfo.setLength(length); + mRequest.setFinalUri(finalUri); download(length, isAcceptRanges); } } @@ -258,7 +259,7 @@ private List getMultiThreadInfos(long length) { } else { end = start + average - 1; } - ThreadInfo threadInfo = new ThreadInfo(i, mTag, mRequest.getUri(), start, end, 0); + ThreadInfo threadInfo = new ThreadInfo(i, mTag, mRequest.getFinalUri(), start, end, 0); threadInfos.add(threadInfo); } } @@ -267,7 +268,7 @@ private List getMultiThreadInfos(long length) { //TODO private ThreadInfo getSingleThreadInfo() { - ThreadInfo threadInfo = new ThreadInfo(0, mTag, mRequest.getUri(), 0); + ThreadInfo threadInfo = new ThreadInfo(0, mTag, mRequest.getFinalUri(), 0); return threadInfo; }