Make qDecodeDataUrl return bool.
Change-Id: I23b9fed39af7bea6c171b35e10bd72c424bd903e Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>bb10
parent
4c1469f7da
commit
231369eb04
|
|
@ -51,51 +51,49 @@ QT_BEGIN_NAMESPACE
|
|||
Decode a data: URL into its mimetype and payload. Returns a null string if
|
||||
the URL could not be decoded.
|
||||
*/
|
||||
Q_CORE_EXPORT QPair<QString, QByteArray> qDecodeDataUrl(const QUrl &uri)
|
||||
Q_CORE_EXPORT bool qDecodeDataUrl(const QUrl &uri, QString &mimeType, QByteArray &payload)
|
||||
{
|
||||
QString mimeType;
|
||||
QByteArray payload;
|
||||
if (uri.scheme() != QLatin1String("data") || !uri.host().isEmpty())
|
||||
return false;
|
||||
|
||||
if (uri.scheme() == QLatin1String("data") && uri.host().isEmpty()) {
|
||||
mimeType = QLatin1String("text/plain;charset=US-ASCII");
|
||||
mimeType = QLatin1String("text/plain;charset=US-ASCII");
|
||||
|
||||
// the following would have been the correct thing, but
|
||||
// reality often differs from the specification. People have
|
||||
// data: URIs with ? and #
|
||||
//QByteArray data = QByteArray::fromPercentEncoding(uri.encodedPath());
|
||||
QByteArray data = QByteArray::fromPercentEncoding(uri.toEncoded());
|
||||
// the following would have been the correct thing, but
|
||||
// reality often differs from the specification. People have
|
||||
// data: URIs with ? and #
|
||||
//QByteArray data = QByteArray::fromPercentEncoding(uri.encodedPath());
|
||||
QByteArray data = QByteArray::fromPercentEncoding(uri.toEncoded());
|
||||
|
||||
// remove the data: scheme
|
||||
data.remove(0, 5);
|
||||
// remove the data: scheme
|
||||
data.remove(0, 5);
|
||||
|
||||
// parse it:
|
||||
int pos = data.indexOf(',');
|
||||
if (pos != -1) {
|
||||
payload = data.mid(pos + 1);
|
||||
data.truncate(pos);
|
||||
data = data.trimmed();
|
||||
|
||||
// find out if the payload is encoded in Base64
|
||||
if (data.endsWith(";base64")) {
|
||||
payload = QByteArray::fromBase64(payload);
|
||||
data.chop(7);
|
||||
}
|
||||
|
||||
if (data.toLower().startsWith("charset")) {
|
||||
int i = 7; // strlen("charset")
|
||||
while (data.at(i) == ' ')
|
||||
++i;
|
||||
if (data.at(i) == '=')
|
||||
data.prepend("text/plain;");
|
||||
}
|
||||
|
||||
if (!data.isEmpty())
|
||||
mimeType = QLatin1String(data.trimmed());
|
||||
// parse it:
|
||||
int pos = data.indexOf(',');
|
||||
if (pos != -1) {
|
||||
payload = data.mid(pos + 1);
|
||||
data.truncate(pos);
|
||||
data = data.trimmed();
|
||||
|
||||
// find out if the payload is encoded in Base64
|
||||
if (data.endsWith(";base64")) {
|
||||
payload = QByteArray::fromBase64(payload);
|
||||
data.chop(7);
|
||||
}
|
||||
|
||||
if (data.toLower().startsWith("charset")) {
|
||||
int i = 7; // strlen("charset")
|
||||
while (data.at(i) == ' ')
|
||||
++i;
|
||||
if (data.at(i) == '=')
|
||||
data.prepend("text/plain;");
|
||||
}
|
||||
|
||||
if (!data.isEmpty())
|
||||
mimeType = QLatin1String(data.trimmed());
|
||||
|
||||
}
|
||||
|
||||
return QPair<QString,QByteArray>(mimeType,payload);
|
||||
return true;
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@
|
|||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
Q_CORE_EXPORT QPair<QString, QByteArray> qDecodeDataUrl(const QUrl &url);
|
||||
Q_CORE_EXPORT bool qDecodeDataUrl(const QUrl &url, QString &mimeType, QByteArray &payload);
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
|
|
|
|||
|
|
@ -1925,8 +1925,12 @@ QVariant QTextDocument::loadResource(int type, const QUrl &name)
|
|||
#endif
|
||||
|
||||
// handle data: URLs
|
||||
if (r.isNull() && name.scheme().compare(QLatin1String("data"), Qt::CaseInsensitive) == 0)
|
||||
r = qDecodeDataUrl(name).second;
|
||||
if (r.isNull() && name.scheme().compare(QLatin1String("data"), Qt::CaseInsensitive) == 0) {
|
||||
QString mimetype;
|
||||
QByteArray payload;
|
||||
if (qDecodeDataUrl(name, mimetype, payload))
|
||||
r = payload;
|
||||
}
|
||||
|
||||
// if resource was not loaded try to load it here
|
||||
if (!doc && r.isNull() && name.isRelative()) {
|
||||
|
|
|
|||
|
|
@ -70,19 +70,16 @@ QNetworkReplyDataImpl::QNetworkReplyDataImpl(QObject *parent, const QNetworkRequ
|
|||
QNetworkReply::open(QIODevice::ReadOnly);
|
||||
|
||||
QUrl url = req.url();
|
||||
|
||||
// FIXME qDecodeDataUrl should instead be rewritten to have the QByteArray
|
||||
// and the mime type as an output parameter and return a bool instead
|
||||
d->decodeDataUrlResult = qDecodeDataUrl(url);
|
||||
|
||||
if (! d->decodeDataUrlResult.first.isNull()) {
|
||||
QString &mimeType = d->decodeDataUrlResult.first;
|
||||
qint64 size = d->decodeDataUrlResult.second.size();
|
||||
QString mimeType;
|
||||
QByteArray payload;
|
||||
if (qDecodeDataUrl(url, mimeType, payload)) {
|
||||
QString &mimeType = mimeType;
|
||||
qint64 size = payload.size();
|
||||
setHeader(QNetworkRequest::ContentTypeHeader, mimeType);
|
||||
setHeader(QNetworkRequest::ContentLengthHeader, size);
|
||||
QMetaObject::invokeMethod(this, "metaDataChanged", Qt::QueuedConnection);
|
||||
|
||||
d->decodedData.setBuffer(&d->decodeDataUrlResult.second);
|
||||
d->decodedData.setBuffer(&payload);
|
||||
d->decodedData.open(QIODevice::ReadOnly);
|
||||
|
||||
QMetaObject::invokeMethod(this, "downloadProgress", Qt::QueuedConnection,
|
||||
|
|
|
|||
|
|
@ -87,7 +87,6 @@ public:
|
|||
QNetworkReplyDataImplPrivate();
|
||||
~QNetworkReplyDataImplPrivate();
|
||||
|
||||
QPair<QString, QByteArray> decodeDataUrlResult;
|
||||
QBuffer decodedData;
|
||||
|
||||
Q_DECLARE_PUBLIC(QNetworkReplyDataImpl)
|
||||
|
|
|
|||
Loading…
Reference in New Issue