Unsubscribe redirect

master
M66B 4 weeks ago
parent 7f242cd674
commit 6886049c1f

@ -21,7 +21,6 @@ package eu.faircode.email;
import android.app.Dialog; import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -34,9 +33,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import java.io.IOException; import java.net.HttpURLConnection;
import java.io.InputStream;
import java.net.URL; import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
@ -87,38 +87,58 @@ public class FragmentDialogUnsubscribe extends FragmentDialogBase {
protected String onExecute(Context context, Bundle args) throws Throwable { protected String onExecute(Context context, Bundle args) throws Throwable {
final String uri = args.getString("uri"); final String uri = args.getString("uri");
final String request = "List-Unsubscribe=One-Click"; final String request = "List-Unsubscribe=One-Click";
Log.i("Unsubscribe request=" + request + " uri=" + uri);
// https://datatracker.ietf.org/doc/html/rfc8058 // https://datatracker.ietf.org/doc/html/rfc8058
int redirects = 0;
URL url = new URL(uri); URL url = new URL(uri);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); do {
connection.setRequestMethod("POST"); Log.i("Unsubscribe request=" + request + " uri=" + uri);
connection.setDoInput(true);
connection.setDoOutput(true); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setReadTimeout(UNSUBSCRIBE_TIMEOUT); connection.setRequestMethod("POST");
connection.setConnectTimeout(UNSUBSCRIBE_TIMEOUT); connection.setDoInput(true);
connection.setInstanceFollowRedirects(true); connection.setDoOutput(true);
ConnectionHelper.setUserAgent(context, connection); connection.setReadTimeout(UNSUBSCRIBE_TIMEOUT);
connection.setRequestProperty("Content-Length", Integer.toString(request.length())); connection.setConnectTimeout(UNSUBSCRIBE_TIMEOUT);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setInstanceFollowRedirects(true);
connection.connect(); ConnectionHelper.setUserAgent(context, connection);
connection.setRequestProperty("Content-Length", Integer.toString(request.length()));
try { connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.getOutputStream().write(request.getBytes()); connection.connect();
int status = connection.getResponseCode(); try {
if (status >= 300) { connection.getOutputStream().write(request.getBytes());
String error = status + ": " + connection.getResponseMessage();
Log.i("Unsubscribe error=" + error); int status = connection.getResponseCode();
throw new IllegalArgumentException(error); if (status == HttpURLConnection.HTTP_MOVED_PERM ||
} else status == HttpURLConnection.HTTP_MOVED_TEMP ||
Log.i("Unsubscribe status=" + status); status == HttpURLConnection.HTTP_SEE_OTHER ||
status == 307 /* Temporary redirect */ ||
return Helper.readStream(connection.getInputStream()); status == 308 /* Permanent redirect */) {
} finally { String header = connection.getHeaderField("Location");
connection.disconnect(); if (header != null) {
} String location = URLDecoder.decode(header, StandardCharsets.UTF_8.name());
Log.i("Unsubscribe redirect=" + location);
url = new URL(url, location);
continue;
}
}
if (status >= 300) {
String error = status + ": " + connection.getResponseMessage();
Log.i("Unsubscribe error=" + error);
throw new IllegalArgumentException(error);
} else
Log.i("Unsubscribe status=" + status);
return Helper.readStream(connection.getInputStream());
} finally {
connection.disconnect();
}
} while (++redirects <= ConnectionHelper.MAX_REDIRECTS);
return null;
} }
@Override @Override

Loading…
Cancel
Save