From 9013f0f4d08fa1a29c5d75f41e743a9c85703f7d Mon Sep 17 00:00:00 2001 From: Karthikeyan Periasamy Date: Sat, 12 Mar 2016 22:39:16 +0100 Subject: Added support for URL redirection for the download from ContextMenu Check for URL redirection status from the response and get all download info for the new URL from the location header field. Change-Id: I13aaa674331b0336099306501bdc2d5219349760 CR-Fixed: SWE-6709 --- src/com/android/browser/FetchUrlMimeType.java | 70 +++++++++++++++++++++------ 1 file changed, 55 insertions(+), 15 deletions(-) (limited to 'src/com/android') diff --git a/src/com/android/browser/FetchUrlMimeType.java b/src/com/android/browser/FetchUrlMimeType.java index e5abebbc..e25093f9 100644 --- a/src/com/android/browser/FetchUrlMimeType.java +++ b/src/com/android/browser/FetchUrlMimeType.java @@ -23,6 +23,7 @@ import android.net.http.AndroidHttpClient; import android.text.TextUtils; import android.util.Log; import android.webkit.MimeTypeMap; +import android.webkit.URLUtil; import com.android.browser.reflect.ReflectHelper; @@ -38,6 +39,9 @@ import org.apache.http.conn.params.ConnRouteParams; import org.codeaurora.swe.CookieManager; +import android.widget.Toast; +import com.android.browser.R; + /** * This class is used to pull down the http headers of a given URL so that * we can analyse the mimetype and make any correction needed before we give @@ -62,6 +66,8 @@ class FetchUrlMimeType extends Thread { private boolean mPrivateBrowsing; private long mContentLength; + private String mContentDisposition; + public FetchUrlMimeType(Activity activity, String url, String userAgent, String referer, String auth, boolean privateBrowsing, String filename) { mActivity = activity; @@ -74,8 +80,7 @@ class FetchUrlMimeType extends Thread { mAuth = auth; } - @Override - public void run() { + private String getMimeType(String url) { // User agent is likely to be null, though the AndroidHttpClient // seems ok with that. AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent); @@ -91,17 +96,21 @@ class FetchUrlMimeType extends Thread { } catch (IllegalArgumentException ex) { Log.e(LOGTAG,"Download failed: " + ex); client.close(); - return; + mFilename = null; + mUri = null; + return null; } HttpHead request; try { - URI uriObj = new URI(mUri); + URI uriObj = new URI(url); request = new HttpHead(uriObj.toString()); } catch (URISyntaxException e) { Log.e(LOGTAG,"Encode URI failed: " + e); client.close(); - return; + mFilename = null; + mUri = null; + return null; } String cookies = CookieManager.getInstance().getCookie(mUri, mPrivateBrowsing); @@ -112,7 +121,6 @@ class FetchUrlMimeType extends Thread { HttpResponse response; String filename = mFilename; String mimeType = null; - String contentDisposition = null; String contentLength = null; try { response = client.execute(request); @@ -132,21 +140,59 @@ class FetchUrlMimeType extends Thread { if (contentLengthHeader != null) { contentLength = contentLengthHeader.getValue(); } + + if (contentLength != null) { + mContentLength = Long.parseLong(contentLength); + } else { + mContentLength = 0; + } + Header contentDispositionHeader = response.getFirstHeader("Content-Disposition"); if (contentDispositionHeader != null) { - contentDisposition = contentDispositionHeader.getValue(); + mContentDisposition = contentDispositionHeader.getValue(); } + + mFilename = URLUtil.guessFileName(url, mContentDisposition, mimeType); + mUri = url; + } else if (response.getStatusLine().getStatusCode() == 302) { + return getMimeType(response.getLastHeader("Location").getValue()); } } catch (IllegalArgumentException ex) { if (request != null) request.abort(); + Log.e(LOGTAG, "Download failed: " + ex); + mFilename = null; + mUri = null; } catch (IOException ex) { if (request != null) request.abort(); + Log.e(LOGTAG, "Download failed: " + ex); + mFilename = null; + mUri = null; } finally { client.close(); } + return mimeType; + } + + @Override + public void run() { + String url = mUri; + String mimeType = getMimeType(mUri); + String filename = mFilename; + + if (mUri == null) { + mUri = url; // Restore the intial value + mActivity.runOnUiThread(new Runnable() { + public void run() { + Toast.makeText(mActivity, R.string.cannot_download_generic, + Toast.LENGTH_SHORT).show(); + } + }); + return; + } + if (mimeType != null) { Log.e(LOGTAG, "-----------the mimeType from http header is ------------->" + mimeType); if (mimeType.equalsIgnoreCase("text/plain") || @@ -176,17 +222,11 @@ class FetchUrlMimeType extends Thread { if (newMimeType != null) { mimeType = newMimeType; } - filename = guessFileNameEx(mUri, contentDisposition, mimeType); + filename = guessFileNameEx(mUri, mContentDisposition, mimeType); } - if (contentLength != null) { - mContentLength = Long.parseLong(contentLength); - } else { - mContentLength = 0; - } - - DownloadHandler.startDownloadSettings(mActivity, mUri, mUserAgent, contentDisposition, + DownloadHandler.startDownloadSettings(mActivity, mUri, mUserAgent, mContentDisposition, mimeType, mReferer, mAuth, mPrivateBrowsing, mContentLength, filename); } -- cgit v1.2.3