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

don't pre-generate urls without queries/paths to avoid quadratic computation

This commit is contained in:
TrianguloY 2024-07-15 13:26:23 +02:00
parent d51653af0d
commit a322a1f801
2 changed files with 37 additions and 41 deletions

View File

@ -18,13 +18,12 @@ import com.trianguloy.urlchecker.url.UrlData;
import com.trianguloy.urlchecker.utilities.methods.AndroidUtils; import com.trianguloy.urlchecker.utilities.methods.AndroidUtils;
import com.trianguloy.urlchecker.utilities.methods.Inflater; import com.trianguloy.urlchecker.utilities.methods.Inflater;
import com.trianguloy.urlchecker.utilities.methods.JavaUtils; import com.trianguloy.urlchecker.utilities.methods.JavaUtils;
import com.trianguloy.urlchecker.utilities.methods.JavaUtils.Supplier;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /** This module shows all parts of the url decoded */
* This module shows all parts of the url decoded
*/
public class UriPartsModule extends AModuleData { public class UriPartsModule extends AModuleData {
@Override @Override
@ -81,7 +80,7 @@ class UriPartsDialog extends AModuleDialog {
urlQuerySanitizer.setUnregisteredParameterValueSanitizer(v -> v); urlQuerySanitizer.setUnregisteredParameterValueSanitizer(v -> v);
urlQuerySanitizer.parseQuery(uri.getQuery() urlQuerySanitizer.parseQuery(uri.getQuery()
// this will fix issues with the parser decoding twice // this will fix issues with the parser decoding twice
.replace("%","%25")); .replace("%", "%25"));
} }
// domain elements // domain elements
@ -98,14 +97,17 @@ class UriPartsDialog extends AModuleDialog {
if (!pathSegments.isEmpty()) { if (!pathSegments.isEmpty()) {
var paths = addGroup("Paths", pathSegments.size(), uri.buildUpon().path(null)); var paths = addGroup("Paths", pathSegments.size(), uri.buildUpon().path(null));
for (var i = 0; i < pathSegments.size(); i++) { for (var i = 0; i < pathSegments.size(); i++) {
var pathSegment = pathSegments.get(i); int removeI = i;
// append the path
var builder = uri.buildUpon(); addPart("/", pathSegments.get(i), paths, () -> {
builder.path(null); // generate the same url without this path
for (int newI = 0; newI < pathSegments.size(); newI++) { var builder = uri.buildUpon();
if (newI != i) builder.appendPath(pathSegments.get(newI)); builder.path(null);
} for (int newI = 0; newI < pathSegments.size(); newI++) {
addPart("/", pathSegment, paths, builder); if (newI != removeI) builder.appendPath(pathSegments.get(newI));
}
return builder.build().toString();
});
} }
} }
@ -114,14 +116,17 @@ class UriPartsDialog extends AModuleDialog {
if (!parameters.isEmpty()) { if (!parameters.isEmpty()) {
var queries = addGroup("Parameters", parameters.size(), uri.buildUpon().query(null)); var queries = addGroup("Parameters", parameters.size(), uri.buildUpon().query(null));
for (var i = 0; i < parameters.size(); i++) { for (var i = 0; i < parameters.size(); i++) {
// generate same url but without this parameter int removeI = i;
var builder = uri.buildUpon();
builder.query(null);
for (var j = 0; j < parameters.size(); j++) {
if (i != j) builder.appendQueryParameter(parameters.get(j).mParameter, parameters.get(j).mValue);
}
// append the parameter // append the parameter
addPart(parameters.get(i).mParameter, parameters.get(i).mValue, queries, builder); addPart(parameters.get(i).mParameter, parameters.get(i).mValue, queries, () -> {
// generate same url but without this parameter
var builder = uri.buildUpon();
builder.query(null);
for (var newI = 0; newI < parameters.size(); newI++) {
if (newI != removeI) builder.appendQueryParameter(parameters.get(newI).mParameter, parameters.get(newI).mValue);
}
return builder.build().toString();
});
} }
} }
@ -134,9 +139,7 @@ class UriPartsDialog extends AModuleDialog {
setVisibility(box.getChildCount() > 0); setVisibility(box.getChildCount() > 0);
} }
/** /** Adds a collapsible group */
* Adds a collapsible group
*/
private LinearLayout addGroup(String name, int size, Uri.Builder onDelete) { private LinearLayout addGroup(String name, int size, Uri.Builder onDelete) {
var title = Inflater.inflate(R.layout.uri_part, box); var title = Inflater.inflate(R.layout.uri_part, box);
title.findViewById(R.id.key).setVisibility(View.GONE); title.findViewById(R.id.key).setVisibility(View.GONE);
@ -163,10 +166,8 @@ class UriPartsDialog extends AModuleDialog {
return group; return group;
} }
/** /** Adds a part */
* Adds a part private void addPart(String name, String value, LinearLayout container, Supplier<String> onDelete) {
*/
private void addPart(String name, String value, LinearLayout container, Uri.Builder onDelete) {
if (value == null) return; if (value == null) return;
// create row // create row
var part = Inflater.inflate(R.layout.uri_part, container); var part = Inflater.inflate(R.layout.uri_part, container);
@ -186,20 +187,13 @@ class UriPartsDialog extends AModuleDialog {
// configure delete // configure delete
var delete_view = part.<Button>findViewById(R.id.delete); var delete_view = part.<Button>findViewById(R.id.delete);
if (onDelete != null) { if (onDelete != null) {
try { delete_view.setOnClickListener(v -> setUrl(onDelete.get()));
var newUrl = onDelete.build().toString();
delete_view.setOnClickListener(v -> setUrl(newUrl));
} catch (UnsupportedOperationException ignored) {
delete_view.setVisibility(View.GONE);
}
} else { } else {
delete_view.setVisibility(View.GONE); delete_view.setVisibility(View.GONE);
} }
} }
/** /** OnLongClickListener to copy a part (textview text) to the clipboard */
* OnLongClickListener to copy a part (textview text) to the clipboard
*/
private final View.OnLongClickListener longTapToCopy = v -> { private final View.OnLongClickListener longTapToCopy = v -> {
AndroidUtils.copyToClipboard(getActivity(), R.string.mParts_copy, ((TextView) v).getText().toString()); AndroidUtils.copyToClipboard(getActivity(), R.string.mParts_copy, ((TextView) v).getText().toString());
return true; return true;

View File

@ -108,17 +108,19 @@ public interface JavaUtils {
else list.add(element); else list.add(element);
} }
/** /** java.util.function.Consumer requires api 24 */
* java.util.function.Consumer requires api 24
*/
@FunctionalInterface @FunctionalInterface
interface Consumer<T> { interface Consumer<T> {
void accept(T t); void accept(T t);
} }
/** /** java.util.function.Supplier requires api 24 */
* java.util.function.Function requires api 24 @FunctionalInterface
*/ interface Supplier<T> {
T get();
}
/** java.util.function.Function requires api 24 */
@FunctionalInterface @FunctionalInterface
interface Function<T, R> { interface Function<T, R> {
R apply(T t); R apply(T t);