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

View File

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