mirror of
https://github.com/TrianguloY/UrlChecker.git
synced 2024-09-19 11:52:14 +02:00
don't pre-generate urls without queries/paths to avoid quadratic computation
This commit is contained in:
parent
d51653af0d
commit
a322a1f801
@ -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);
|
||||
|
||||
var builder = uri.buildUpon();
|
||||
builder.path(null);
|
||||
for (int newI = 0; newI < pathSegments.size(); newI++) {
|
||||
if (newI != i) builder.appendPath(pathSegments.get(newI));
|
||||
}
|
||||
addPart("/", pathSegment, paths, builder);
|
||||
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 != removeI) builder.appendPath(pathSegments.get(newI));
|
||||
}
|
||||
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++) {
|
||||
// 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);
|
||||
}
|
||||
int removeI = i;
|
||||
// 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user