Handle protocol relative URLs correctly when downloading episodes and images
fixes #568
This commit is contained in:
parent
72d1bce283
commit
bde86e018a
|
@ -73,4 +73,32 @@ public class URLCheckerTest extends AndroidTestCase {
|
|||
final String out = URLChecker.prepareURL(in);
|
||||
assertEquals("https://example.com", out);
|
||||
}
|
||||
|
||||
public void testProtocolRelativeUrlIsAbsolute() throws Exception {
|
||||
final String in = "https://example.com";
|
||||
final String inBase = "http://examplebase.com";
|
||||
final String out = URLChecker.prepareURL(in, inBase);
|
||||
assertEquals(in, out);
|
||||
}
|
||||
|
||||
public void testProtocolRelativeUrlIsRelativeHttps() throws Exception {
|
||||
final String in = "//example.com";
|
||||
final String inBase = "https://examplebase.com";
|
||||
final String out = URLChecker.prepareURL(in, inBase);
|
||||
assertEquals("https://example.com", out);
|
||||
|
||||
}
|
||||
|
||||
public void testProtocolRelativeUrlIsHttpsWithAPSubscribeProtocol() throws Exception {
|
||||
final String in = "//example.com";
|
||||
final String inBase = "antennapod-subscribe://https://examplebase.com";
|
||||
final String out = URLChecker.prepareURL(in, inBase);
|
||||
assertEquals("https://example.com", out);
|
||||
}
|
||||
|
||||
public void testProtocolRelativeUrlBaseUrlNull() throws Exception {
|
||||
final String in = "example.com";
|
||||
final String out = URLChecker.prepareURL(in, null);
|
||||
assertEquals("http://example.com", out);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -90,7 +90,7 @@ public class DownloadRequester {
|
|||
return true;
|
||||
}
|
||||
|
||||
private void download(Context context, FeedFile item, File dest,
|
||||
private void download(Context context, FeedFile item, FeedFile container, File dest,
|
||||
boolean overwriteIfExists, String username, String password, boolean deleteOnFailure, Bundle arguments) {
|
||||
if (!isDownloadingFile(item)) {
|
||||
if (!isFilenameAvailable(dest.toString()) || (deleteOnFailure && dest.exists())) {
|
||||
|
@ -129,7 +129,8 @@ public class DownloadRequester {
|
|||
if (BuildConfig.DEBUG)
|
||||
Log.d(TAG,
|
||||
"Requesting download of url " + item.getDownload_url());
|
||||
item.setDownload_url(URLChecker.prepareURL(item.getDownload_url()));
|
||||
String baseUrl = (container != null) ? container.getDownload_url() : null;
|
||||
item.setDownload_url(URLChecker.prepareURL(item.getDownload_url(), baseUrl));
|
||||
|
||||
DownloadRequest request = new DownloadRequest(dest.toString(),
|
||||
URLChecker.prepareURL(item.getDownload_url()), item.getHumanReadableIdentifier(),
|
||||
|
@ -171,7 +172,7 @@ public class DownloadRequester {
|
|||
args.putInt(REQUEST_ARG_PAGE_NR, feed.getPageNr());
|
||||
args.putBoolean(REQUEST_ARG_LOAD_ALL_PAGES, loadAllPages);
|
||||
|
||||
download(context, feed, new File(getFeedfilePath(context),
|
||||
download(context, feed, null, new File(getFeedfilePath(context),
|
||||
getFeedfileName(feed)), true, username, password, true, args);
|
||||
}
|
||||
}
|
||||
|
@ -183,7 +184,8 @@ public class DownloadRequester {
|
|||
public synchronized void downloadImage(Context context, FeedImage image)
|
||||
throws DownloadRequestException {
|
||||
if (feedFileValid(image)) {
|
||||
download(context, image, new File(getImagefilePath(context),
|
||||
FeedFile container = (image.getOwner() instanceof FeedFile) ? (FeedFile) image.getOwner() : null;
|
||||
download(context, image, container, new File(getImagefilePath(context),
|
||||
getImagefileName(image)), false, null, null, false, null);
|
||||
}
|
||||
}
|
||||
|
@ -209,7 +211,7 @@ public class DownloadRequester {
|
|||
dest = new File(getMediafilePath(context, feedmedia),
|
||||
getMediafilename(feedmedia));
|
||||
}
|
||||
download(context, feedmedia,
|
||||
download(context, feedmedia, feed,
|
||||
dest, false, username, password, false, null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package de.danoeh.antennapod.core.util;
|
||||
|
||||
import android.net.Uri;
|
||||
import android.util.Log;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
@ -51,4 +52,28 @@ public final class URLChecker {
|
|||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if URL is valid and modifies it if necessary.
|
||||
* This method also handles protocol relative URLs.
|
||||
*
|
||||
* @param url The url which is going to be prepared
|
||||
* @param base The url against which the (possibly relative) url is applied. If this is null,
|
||||
* the result of prepareURL(url) is returned instead.
|
||||
* @return The prepared url
|
||||
*/
|
||||
public static String prepareURL(String url, String base) {
|
||||
if (base == null) {
|
||||
return prepareURL(url);
|
||||
}
|
||||
url = StringUtils.trim(url);
|
||||
base = prepareURL(base);
|
||||
Uri urlUri = Uri.parse(url);
|
||||
Uri baseUri = Uri.parse(base);
|
||||
if (urlUri.isRelative() && baseUri.isAbsolute()) {
|
||||
return urlUri.buildUpon().scheme(baseUri.getScheme()).build().toString();
|
||||
} else {
|
||||
return prepareURL(url);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue