41 const qsizetype comma = uri.indexOf(u',');
42 if (!isDataUri(uri) || comma < 0) {
44 *errorMessage = QStringLiteral(
"Malformed data URI");
48 const QStringView header = uri.mid(0, comma);
49 const QStringView payload = uri.mid(comma + 1);
51 if (header.endsWith(QLatin1String(
";base64"), Qt::CaseInsensitive)) {
52 auto result = QByteArray::fromBase64Encoding(payload.toLatin1());
55 *errorMessage = QStringLiteral(
"Invalid base64 payload in data URI");
58 return result.decoded;
65 return QByteArray::fromPercentEncoding(payload.toLatin1());
83 const QString decoded = QUrl::fromPercentEncoding(uri.toUtf8());
84 if (decoded.isEmpty())
86 if (QDir::isAbsolutePath(decoded) || decoded.startsWith(QLatin1String(
":/")))
88 if (baseDir.isEmpty())
89 return QDir::cleanPath(decoded).startsWith(QLatin1String(
"..")) ? QString() : decoded;
91 const QString base = QDir::cleanPath(baseDir);
92 const QString resolved = QDir::cleanPath(base + QLatin1Char(
'/') + decoded);
93 if (resolved != base && !resolved.startsWith(base + QLatin1Char(
'/')))
108 return decodeDataUri(uri, errorMessage);
110 const QString path = resolveFilePath(uri, baseDir);
111 if (path.isEmpty()) {
113 *errorMessage = QStringLiteral(
"Refusing to resolve '%1' outside the asset directory").arg(uri);
118 if (!file.open(QIODevice::ReadOnly)) {
120 *errorMessage = QStringLiteral(
"Failed to open '%1': %2").arg(path, file.errorString());
123 return file.readAll();