From a8c82ad27b74e929311536227dee0909ebc27ee1 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 9 Feb 2024 03:36:04 +0100 Subject: [PATCH] feat(Sync for Reddit): Add `Fix /s/ links` patch --- .../syncforreddit/FixSLinksPatch.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 app/src/main/java/app/revanced/integrations/syncforreddit/FixSLinksPatch.java diff --git a/app/src/main/java/app/revanced/integrations/syncforreddit/FixSLinksPatch.java b/app/src/main/java/app/revanced/integrations/syncforreddit/FixSLinksPatch.java new file mode 100644 index 00000000..a3c04ad6 --- /dev/null +++ b/app/src/main/java/app/revanced/integrations/syncforreddit/FixSLinksPatch.java @@ -0,0 +1,42 @@ +package app.revanced.integrations.syncforreddit; + +import android.os.StrictMode; +import app.revanced.integrations.shared.Logger; + +import java.net.HttpURLConnection; +import java.net.URL; + +public final class FixSLinksPatch { + public static String resolveSLink(String link) { + if (link.matches(".*reddit\\.com/r/[^/]+/s/[^/]+")) { + Logger.printInfo(() -> "Resolving " + link); + try { + URL url = new URL(link); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setInstanceFollowRedirects(false); + connection.setRequestMethod("HEAD"); + + // Disable strict mode in order to allow network access on the main thread. + // This is not ideal, but it's the easiest solution for now. + final var currentPolicy = StrictMode.getThreadPolicy(); + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy); + + connection.connect(); + String location = connection.getHeaderField("location"); + connection.disconnect(); + + // Restore the original strict mode policy. + StrictMode.setThreadPolicy(currentPolicy); + + Logger.printInfo(() -> "Resolved " + link + " -> " + location); + + return location; + } catch (Exception e) { + Logger.printException(() -> "Failed to resolve " + link, e); + } + } + + return link; + } +}