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:
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.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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user