0
0
mirror of https://github.com/TrianguloY/UrlChecker.git synced 2024-09-19 20:02:16 +02:00

Fix query parser

Fixes #264
This commit is contained in:
TrianguloY 2023-08-05 13:34:09 +02:00
parent e69c855925
commit 9ef77acc6a

View File

@ -1,7 +1,7 @@
package com.trianguloy.urlchecker.modules.list; package com.trianguloy.urlchecker.modules.list;
import android.net.Uri; import android.net.Uri;
import android.util.Pair; import android.net.UrlQuerySanitizer;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -20,9 +20,7 @@ import com.trianguloy.urlchecker.utilities.Inflater;
import com.trianguloy.urlchecker.utilities.JavaUtils; import com.trianguloy.urlchecker.utilities.JavaUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* This module shows all parts of the url decoded * This module shows all parts of the url decoded
@ -76,6 +74,10 @@ class UriPartsDialog extends AModuleDialog {
// parse // parse
var uri = Uri.parse(urlData.url); var uri = Uri.parse(urlData.url);
var urlQuerySanitizer = new UrlQuerySanitizer();
// the default parseUrl doesn't remove the fragment
urlQuerySanitizer.setAllowUnregisteredParamaters(true);
urlQuerySanitizer.parseQuery(uri.getQuery());
// domain elements // domain elements
if (uri.getAuthority() != null || uri.getScheme() != null) { if (uri.getAuthority() != null || uri.getScheme() != null) {
@ -102,19 +104,19 @@ class UriPartsDialog extends AModuleDialog {
} }
} }
// queries // query parameters
var queryParts = getQueryParts(uri); var parameters = urlQuerySanitizer.getParameterList();
if (queryParts.size() > 0) { if (parameters.size() > 0) {
var queries = addGroup("Queries", queryParts.size(), uri.buildUpon().query(null)); var queries = addGroup("Parameters", parameters.size(), uri.buildUpon().query(null));
for (var queryPart : queryParts) { for (var i = 0; i < parameters.size(); i++) {
// generate same url but without this parameter
var builder = uri.buildUpon(); var builder = uri.buildUpon();
builder.query(null); builder.query(null);
for (var newQuerypart : queryParts) { for (var j = 0; j < parameters.size(); j++) {
if (!Objects.equals(newQuerypart, queryPart)) if (i != j) builder.appendQueryParameter(parameters.get(j).mParameter, parameters.get(j).mValue);
builder.appendQueryParameter(newQuerypart.first, newQuerypart.second);
} }
addPart(queryPart.first, queryPart.second, queries, builder); // append the parameter
addPart(parameters.get(i).mParameter, parameters.get(i).mValue, queries, builder);
} }
} }
@ -192,24 +194,6 @@ class UriPartsDialog extends AModuleDialog {
} }
} }
/**
* Gets the queries, in order (except for same-name ones)
*/
private static List<Pair<String, String>> getQueryParts(Uri uri) {
try {
var queries = new ArrayList<Pair<String, String>>();
for (var name : uri.getQueryParameterNames()) {
for (var value : uri.getQueryParameters(name)) {
if (name.isEmpty() && value.isEmpty()) continue; // skip fully empty entries
queries.add(Pair.create(name, value));
}
}
return queries;
} catch (UnsupportedOperationException e) {
return Collections.emptyList();
}
}
/** /**
* OnLongClickListener to copy a part (textview text) to the clipboard * OnLongClickListener to copy a part (textview text) to the clipboard
*/ */