diff options
author | Paul Ortyl <ortylp@ortyl.org> | 2013-03-10 20:13:58 +0100 |
---|---|---|
committer | Paul Ortyl <ortylp@ortyl.org> | 2013-03-10 20:13:58 +0100 |
commit | 0d8bdf6d23843874d0f61ebbca6acc9ffdd3ae13 (patch) | |
tree | 3afebcea5ab014723bc4724b5973b80b84114ec1 /src/de/danoeh/antennapod/service/download/APRedirectHandler.java | |
parent | ec1992f36c5bf1916ebaed8196705b2324486388 (diff) | |
download | AntennaPod-0d8bdf6d23843874d0f61ebbca6acc9ffdd3ae13.zip |
fix regression (issue #96): fix broken URLs in redirection instead of failing
Diffstat (limited to 'src/de/danoeh/antennapod/service/download/APRedirectHandler.java')
-rw-r--r-- | src/de/danoeh/antennapod/service/download/APRedirectHandler.java | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/de/danoeh/antennapod/service/download/APRedirectHandler.java b/src/de/danoeh/antennapod/service/download/APRedirectHandler.java new file mode 100644 index 000000000..9416ef9d7 --- /dev/null +++ b/src/de/danoeh/antennapod/service/download/APRedirectHandler.java @@ -0,0 +1,55 @@ +package de.danoeh.antennapod.service.download; + +import java.net.URI; + +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.apache.http.impl.client.DefaultRedirectHandler; +import org.apache.http.protocol.HttpContext; + +import de.danoeh.antennapod.AppConfig; +import android.util.Log; + +public class APRedirectHandler extends DefaultRedirectHandler { + // Identifier for logger + private static final String TAG = "APRedirectHandler"; + // Header field, which has to be potentially fixed + private static final String LOC = "Location"; + // Regular expressions for character strings, which should not appear in URLs + private static final String CHi[] = { "\\{", "\\}", "\\|", "\\\\", "\\^", "~", "\\[", "\\]", "\\`"}; + private static final String CHo[] = { "%7B", "%7D", "%7C", "%5C", "%5E", "%7E", "%5B", "%5D", "%60"}; + + /** + * Workaround for broken URLs in redirection. + * Proper solution involves LaxRedirectStrategy() which is not available in + * current API yet. + */ + @Override + public URI getLocationURI(HttpResponse response, HttpContext context) + throws org.apache.http.ProtocolException { + + Header h[] = response.getHeaders(LOC); + if (h.length>0) { + String s = h[0].getValue(); + + // Fix broken URL + for(int i=0; i<CHi.length;i++) + s = s.replaceAll(CHi[i], CHo[i]); + + // If anything had to be fixed, then replace the header + if (!s.equals(h[0].getValue())) + { + if (AppConfig.DEBUG) + Log.d(TAG, "Original URL: " + h[0].getValue()); + + response.setHeader(LOC, s); + + if (AppConfig.DEBUG) + Log.d(TAG, "Fixed URL: " + s); + } + } + + // call DefaultRedirectHandler with fixed URL + return super.getLocationURI(response, context); + } +} |