From b94a9801384680c676c184bb4c9a58d42f691c2d Mon Sep 17 00:00:00 2001 From: Sean Owen Date: Thu, 6 Mar 2014 07:48:04 +0000 Subject: [PATCH] Issue #80 : address case where barcode text has a matching escape sequence, and better handle problematic case of URL escape sequences like %f2 matching the %f placeholder --- .../google/zxing/client/android/PreferencesFragment.java | 5 ++++- .../google/zxing/client/android/result/ResultHandler.java | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/android/src/com/google/zxing/client/android/PreferencesFragment.java b/android/src/com/google/zxing/client/android/PreferencesFragment.java index 2d95eba11..95b387bc1 100644 --- a/android/src/com/google/zxing/client/android/PreferencesFragment.java +++ b/android/src/com/google/zxing/client/android/PreferencesFragment.java @@ -109,7 +109,10 @@ public final class PreferencesFragment } // Before validating, remove custom placeholders, which will not // be considered valid parts of the URL in some locations: - valueString = valueString.replaceAll("%[sdf]", ""); + // Blank %d and %s: + valueString = valueString.replaceAll("%[sd]", ""); + // Blank %f but not if followed by digit or a-f as it may be a hex sequence + valueString = valueString.replaceAll("%f(?![0-9a-f])", ""); // Require a scheme otherwise: try { URI uri = new URI(valueString); diff --git a/android/src/com/google/zxing/client/android/result/ResultHandler.java b/android/src/com/google/zxing/client/android/result/ResultHandler.java index ef1a6e94f..07b15688a 100644 --- a/android/src/com/google/zxing/client/android/result/ResultHandler.java +++ b/android/src/com/google/zxing/client/android/result/ResultHandler.java @@ -464,14 +464,18 @@ public abstract class ResultHandler { } catch (UnsupportedEncodingException e) { // can't happen; UTF-8 is always supported. Continue, I guess, without encoding } - String url = customProductSearch.replace("%s", text); + String url = text; if (rawResult != null) { - url = url.replace("%f", rawResult.getBarcodeFormat().toString()); + // Replace %f but only if it doesn't seem to be a hex escape sequence. This remains + // problematic but avoids the more surprising problem of breaking escapes + url = url.replace("%f(?![0-9a-f])", rawResult.getBarcodeFormat().toString()); if (url.contains("%t")) { ParsedResult parsedResultAgain = ResultParser.parseResult(rawResult); url = url.replace("%t", parsedResultAgain.getType().toString()); } } + // Replace %s last as it might contain itself %f or %t + url = customProductSearch.replace("%s", url); return url; }