Files
vfp_roaauto/COMUN/utile/chatbot/url_decoding_test.js

164 lines
6.3 KiB
JavaScript

// URL Parameter Decoding Test Script
// Tests the problematic URL with %B character and various decoding methods
console.log("=== URL Parameter Decoding Test ===\n");
// The problematic URL from the user's request
const problematicUrl = "https://www.romfast.ro/chatbot_maria.html?message=F:%20Header%20(1)%20sectiune%20Company%20(1)%20sectiune%20BankAccount%20(1)%20eroare%20structura:%20grupul%20%27%BankAccount_choice0%27%20ar%20fi%20trebuit%20sa%20apara%20de%20minimum%201%20ori,%20dar%20apare%20efectiv%20de%200%20ori";
console.log("Problematic URL:");
console.log(problematicUrl);
console.log();
// Extract the query string
const urlObj = new URL(problematicUrl);
const queryString = urlObj.search;
const messageParam = queryString.match(/message=([^&]*)/)?.[1] || '';
console.log("Extracted message parameter (raw):");
console.log(messageParam);
console.log();
// Test Method 1: URLSearchParams (this should fail with the %B issue)
console.log("=== Test 1: URLSearchParams method ===");
try {
const searchParams = new URLSearchParams(queryString);
const decodedMessage1 = searchParams.get('message');
console.log("✅ SUCCESS with URLSearchParams:");
console.log(decodedMessage1);
} catch (error) {
console.log("❌ FAILED with URLSearchParams:");
console.log("Error:", error.message);
}
console.log();
// Test Method 2: decodeURIComponent (this should also fail)
console.log("=== Test 2: decodeURIComponent method ===");
try {
const decodedMessage2 = decodeURIComponent(messageParam);
console.log("✅ SUCCESS with decodeURIComponent:");
console.log(decodedMessage2);
} catch (error) {
console.log("❌ FAILED with decodeURIComponent:");
console.log("Error:", error.message);
}
console.log();
// Test Method 3: Manual decoding with character replacement (current fallback method)
console.log("=== Test 3: Manual decoding with replacement ===");
try {
let manualDecoded = messageParam
.replace(/\+/g, ' ')
.replace(/%20/g, ' ')
.replace(/%27/g, "'")
.replace(/%28/g, "(")
.replace(/%29/g, ")")
.replace(/%3A/g, ":")
.replace(/%2C/g, ",")
.replace(/%([\dA-Fa-f])/g, '$1') // This line is problematic - replaces %B with B
.replace(/%/g, ''); // Removes remaining %
console.log("✅ SUCCESS with manual decoding:");
console.log(manualDecoded);
console.log("⚠️ NOTE: This method corrupts %B sequences!");
} catch (error) {
console.log("❌ FAILED with manual decoding:");
console.log("Error:", error.message);
}
console.log();
// Test Method 4: Improved manual decoding (recommended fix)
console.log("=== Test 4: Improved manual decoding (RECOMMENDED) ===");
try {
// First, handle known safe replacements
let improvedDecoded = messageParam
.replace(/\+/g, ' ')
.replace(/%20/g, ' ')
.replace(/%27/g, "'")
.replace(/%28/g, "(")
.replace(/%29/g, ")")
.replace(/%3A/g, ":")
.replace(/%2C/g, ",");
// Then handle invalid sequences by removing them entirely or replacing with safe characters
// %B is not a valid URL encoding (should be %0B for vertical tab or something else)
improvedDecoded = improvedDecoded
.replace(/%[^0-9A-Fa-f]/g, '') // Remove invalid % sequences that don't have valid hex
.replace(/%[0-9A-Fa-f]$/g, '') // Remove incomplete % sequences at end
.replace(/%([0-9A-Fa-f])(?![0-9A-Fa-f])/g, '$1'); // Convert single hex digit sequences
console.log("✅ SUCCESS with improved manual decoding:");
console.log(improvedDecoded);
} catch (error) {
console.log("❌ FAILED with improved manual decoding:");
console.log("Error:", error.message);
}
console.log();
// Test Method 5: Safe decoding with chunk processing
console.log("=== Test 5: Safe chunk-by-chunk decoding ===");
try {
function safeDecodeURIComponent(str) {
// Split by % and process each chunk
const chunks = str.split('%');
let result = chunks[0]; // First chunk is never encoded
for (let i = 1; i < chunks.length; i++) {
const chunk = chunks[i];
if (chunk.length >= 2) {
const hexCode = chunk.substring(0, 2);
const rest = chunk.substring(2);
// Check if it's a valid hex code
if (/^[0-9A-Fa-f]{2}$/.test(hexCode)) {
try {
result += decodeURIComponent('%' + hexCode) + rest;
} catch (e) {
// If decoding fails, keep the original
result += '%' + chunk;
}
} else {
// Invalid hex code, keep as is
result += '%' + chunk;
}
} else {
// Incomplete code, keep as is
result += '%' + chunk;
}
}
return result;
}
const safeDecoded = safeDecodeURIComponent(messageParam);
console.log("✅ SUCCESS with safe chunk decoding:");
console.log(safeDecoded);
} catch (error) {
console.log("❌ FAILED with safe chunk decoding:");
console.log("Error:", error.message);
}
console.log();
// Analysis of the %B issue
console.log("=== Analysis of the %B issue ===");
console.log("The sequence '%B' in the URL is problematic because:");
console.log("1. It's not a valid URL encoding (missing second hex digit)");
console.log("2. URLSearchParams and decodeURIComponent expect %XX format");
console.log("3. %B should probably be %0B (vertical tab) or %42 (letter B) or escaped as %25B");
console.log();
// Show where the issue occurs in the original message
const problemIndex = messageParam.indexOf('%B');
if (problemIndex !== -1) {
console.log("The %B sequence appears at position:", problemIndex);
console.log("Context around %B:");
const start = Math.max(0, problemIndex - 20);
const end = Math.min(messageParam.length, problemIndex + 20);
console.log("...", messageParam.substring(start, end), "...");
console.log(" ", " ".repeat(problemIndex - start) + "^^^ HERE");
}
console.log();
console.log("=== Recommended Solution ===");
console.log("Update the getUrlParameter function in chatbot_maria.html to use Method 5 (Safe chunk-by-chunk decoding)");
console.log("This will handle invalid URL encoding sequences gracefully without throwing errors.");