From 0b9cd4d7ed68f55a8af4f7b05b9ac509c73df1a9 Mon Sep 17 00:00:00 2001 From: Patrick Rathmann Date: Sun, 27 Jul 2025 09:25:41 +0200 Subject: [PATCH 1/4] fix: use more robust number parsing for JSON literals --- .../plugin/util/HttpRequestHandler.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java index b47d57cf1..1d4a993fc 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java @@ -320,7 +320,23 @@ public static Object parseJSON(String input) throws JSONException { // a string enclosed in " " is a json value, return the string without the quotes return input.trim().substring(1, input.trim().length() - 1); } else if (input.trim().matches("^-?\\d+$")) { - return Integer.parseInt(input.trim()); + // parsing logic for a number literal taken from JSONTokener.readLiteral() + int base = 10; + String number = input.trim(); + if (number.startsWith("0x") || number.startsWith("0X")) { + number = number.substring(2); + base = 16; + } else if (number.startsWith("0") && number.length() > 1) { + number = number.substring(1); + base = 8; + } + + long longValue = Long.parseLong(number, base); + if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) { + return (int) longValue; + } else { + return longValue; + } } else if (input.trim().matches("^-?\\d+(\\.\\d+)?$")) { return Double.parseDouble(input.trim()); } else { From dab38a78ccdb3ce7b2540c18b5799f169d01c70a Mon Sep 17 00:00:00 2001 From: Patrick Rathmann Date: Mon, 28 Jul 2025 10:54:37 +0200 Subject: [PATCH 2/4] fix(android): use JSONTokener for literal parsing --- .../plugin/util/HttpRequestHandler.java | 55 +++++-------------- 1 file changed, 14 insertions(+), 41 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java index 1d4a993fc..b780b131c 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java @@ -302,52 +302,25 @@ public static JSObject buildResponseHeaders(CapacitorHttpUrlConnection connectio /** * Returns a JSObject or a JSArray based on a string-ified input * @param input String-ified JSON that needs parsing - * @return A JSObject or JSArray - * @throws JSONException thrown if the JSON is malformed + * @return A JSObject, JSArray or literal */ - public static Object parseJSON(String input) throws JSONException { - JSONObject json = new JSONObject(); + public static Object parseJSON(String input) { try { - if ("null".equals(input.trim())) { - return JSONObject.NULL; - } else if ("true".equals(input.trim())) { - return true; - } else if ("false".equals(input.trim())) { - return false; - } else if (input.trim().length() <= 0) { - return ""; - } else if (input.trim().matches("^\".*\"$")) { - // a string enclosed in " " is a json value, return the string without the quotes - return input.trim().substring(1, input.trim().length() - 1); - } else if (input.trim().matches("^-?\\d+$")) { - // parsing logic for a number literal taken from JSONTokener.readLiteral() - int base = 10; - String number = input.trim(); - if (number.startsWith("0x") || number.startsWith("0X")) { - number = number.substring(2); - base = 16; - } else if (number.startsWith("0") && number.length() > 1) { - number = number.substring(1); - base = 8; - } - - long longValue = Long.parseLong(number, base); - if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) { - return (int) longValue; - } else { - return longValue; - } - } else if (input.trim().matches("^-?\\d+(\\.\\d+)?$")) { - return Double.parseDouble(input.trim()); - } else { + // try to parse input as an object + return new JSObject(input); + } catch (JSONException e) { + try { + // fall through to try to parse it as an array + return new JSArray(input); + } catch (JSONException e2) { try { - return new JSObject(input); - } catch (JSONException e) { - return new JSArray(input); + // the value is probably a literal, so we can try to have the JSONTokener parse it for us + return new JSONTokener(input).nextValue(); + } catch (JSONException e3) { + // if nothing could be parsed, return the input as is + return input; } } - } catch (JSONException e) { - return input; } } From 16fa70aefc04e5deee8a65f3c06a5cf7fd78d17d Mon Sep 17 00:00:00 2001 From: Patrick Rathmann Date: Mon, 28 Jul 2025 13:02:05 +0200 Subject: [PATCH 3/4] fix: linter fix by prettier --write --- .../java/com/getcapacitor/plugin/util/HttpRequestHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java index b780b131c..335c7d8b2 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java @@ -317,8 +317,8 @@ public static Object parseJSON(String input) { // the value is probably a literal, so we can try to have the JSONTokener parse it for us return new JSONTokener(input).nextValue(); } catch (JSONException e3) { - // if nothing could be parsed, return the input as is - return input; + // if nothing could be parsed, return the input as is + return input; } } } From 7b601a70388325d05b6d042b2d10c69506135f7e Mon Sep 17 00:00:00 2001 From: Patrick Rathmann Date: Mon, 28 Jul 2025 13:09:48 +0200 Subject: [PATCH 4/4] fix: missing import --- .../java/com/getcapacitor/plugin/util/HttpRequestHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java index 335c7d8b2..46da6e1a9 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java @@ -26,7 +26,7 @@ import java.util.Map; import org.json.JSONArray; import org.json.JSONException; -import org.json.JSONObject; +import org.json.JSONTokener; public class HttpRequestHandler {