From 3e397a65d29de99c6bbb2e78a0ccc2ca10b3e6fc Mon Sep 17 00:00:00 2001 From: Geert Bevin Date: Sat, 31 Dec 2022 13:14:23 -0500 Subject: [PATCH 1/2] Prevent string allocation when not passing in any allowed characters. --- .../java/com/uwyn/urlencoder/UrlEncoder.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java b/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java index d751011..080af04 100644 --- a/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java +++ b/lib/src/main/java/com/uwyn/urlencoder/UrlEncoder.java @@ -126,6 +126,20 @@ public final class UrlEncoder { return out.toString(); } + /** + * Transforms a provided String object into a new string, + * containing only valid URL characters in the UTF-8 encoding. + * + * @param source The string that has to be transformed into a valid URL + * string. + * @return The encoded String object. + * @see #decode(String) + * @since 1.0 + */ + public static String encode(String source) { + return encode(source, (String)null); + } + /** * Transforms a provided String object into a new string, * containing only valid URL characters in the UTF-8 encoding. @@ -162,7 +176,7 @@ public final class UrlEncoder { var i = 0; while(i < source.length()) { ch = source.charAt(i); - if (isUnreservedUriChar(ch) || allow.indexOf(ch) != -1) { + if (isUnreservedUriChar(ch) || (allow != null && allow.indexOf(ch) != -1)) { if (out != null) { out.append(ch); } From 10e793fc39a582e12a61aed4fa2ca1151c9634e5 Mon Sep 17 00:00:00 2001 From: Geert Bevin Date: Sat, 31 Dec 2022 14:25:56 -0500 Subject: [PATCH 2/2] README tweaks --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4506f2d..d72c1c9 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,16 @@ A simple library to encode/decode URL parameters. This library was extracted from the [RIFE2 Web Application Framework](https://rife2.com). A Kotlin version can also be found at [https://github.com/ethauvin/urlencoder](https://github.com/ethauvin/urlencoder). -For decades, we've been using [java.net.URLEncoder](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/URLEncoder.html) +For decades, we've been using `[java.net.URLEncoder](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/URLEncoder.html) because of its improper naming. It is actually intended to encode HTML form -parameters, not URLs. +parameters, not URLs, causing the wrong escape sequences to be used. + +Additionally, java.net.URLEncoder allocates memory even when no encoding is +necessary, significantly impacting performance. This library has a negligible +performance impact when the string that is passed in doesn't need to be encoded. Android's [Uri.encode](https://developer.android.com/reference/android/net/Uri#encode(java.lang.String,%20java.lang.String)) -also addresses this issue. +also addresses these issues. ## Examples (TL;DR)