summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/network/access/qformdatabuilder.cpp67
-rw-r--r--src/network/access/qformdatabuilder.h3
-rw-r--r--tests/auto/network/access/qformdatabuilder/tst_qformdatabuilder.cpp1
3 files changed, 8 insertions, 63 deletions
diff --git a/src/network/access/qformdatabuilder.cpp b/src/network/access/qformdatabuilder.cpp
index 8f467e2c576..3111c6e4ce8 100644
--- a/src/network/access/qformdatabuilder.cpp
+++ b/src/network/access/qformdatabuilder.cpp
@@ -65,47 +65,11 @@ QFormDataPartBuilder::QFormDataPartBuilder(QLatin1StringView name, PrivateConstr
QFormDataPartBuilder::~QFormDataPartBuilder()
= default;
-static QByteArray buildFileName(QLatin1StringView view)
-{
- QByteArray fileName;
- fileName += "; filename";
- QByteArrayView encoding = "=";
-
- for (uchar c : view) {
- if (c > 127) {
- encoding = "*=ISO-8859-1''";
- break;
- }
- }
- fileName += encoding;
- fileName += QByteArray::fromRawData(view.data(), view.size()).toPercentEncoding();
- return fileName;
-}
-
-static QByteArray buildFileName(QUtf8StringView view)
+static auto encodeFileName(QStringView view)
{
- QByteArrayView bv = view;
- QByteArray fileName;
- fileName += "; filename";
- QByteArrayView encoding = "=";
+ struct R { QByteArrayView encoding; QByteArray encoded; };
- for (uchar c : bv) {
- if (c > 127) {
- encoding = "*=UTF-8''";
- break;
- }
- }
-
- fileName += encoding;
- fileName += QByteArray::fromRawData(bv.data(), bv.size()).toPercentEncoding();
- return fileName;
-}
-
-static QByteArray buildFileName(QStringView view)
-{
- QByteArray fileName;
- fileName += "; filename";
QByteArrayView encoding = "=";
bool needsUtf8 = false;
@@ -119,24 +83,12 @@ static QByteArray buildFileName(QStringView view)
}
}
- fileName += encoding;
-
- if (needsUtf8)
- fileName += view.toUtf8().toPercentEncoding();
- else
- fileName += view.toLatin1().toPercentEncoding();
-
- return fileName;
+ return R{encoding, needsUtf8 ? view.toUtf8() : view.toLatin1()};
}
QFormDataPartBuilder &QFormDataPartBuilder::setBodyHelper(const QByteArray &data,
QAnyStringView fileName)
{
- if (fileName.isEmpty())
- m_bodyName = QByteArray();
- else
- m_bodyName = fileName.visit([&](auto name) { return buildFileName(name); });
-
m_originalBodyName = fileName.toString();
m_body = data;
return *this;
@@ -181,11 +133,6 @@ QFormDataPartBuilder &QFormDataPartBuilder::setBody(QByteArrayView data,
QFormDataPartBuilder &QFormDataPartBuilder::setBodyDevice(QIODevice *body, QAnyStringView fileName)
{
- if (fileName.isEmpty())
- m_bodyName = QByteArray();
- else
- m_bodyName = fileName.visit([&](auto name) { return buildFileName(name); });
-
m_originalBodyName = fileName.toString();
m_body = body;
return *this;
@@ -216,8 +163,11 @@ QHttpPart QFormDataPartBuilder::build()
{
QHttpPart httpPart;
- if (!m_bodyName.isEmpty())
- m_headerValue += m_bodyName; // RFC 5987 Section 3.2.1
+ if (!m_originalBodyName.isNull()) {
+ const auto enc = encodeFileName(m_originalBodyName);
+ m_headerValue += "; filename" + enc.encoding
+ + enc.encoded.toPercentEncoding(); // RFC 5987 Section 3.2.1
+ }
#if QT_CONFIG(mimetype)
QMimeDatabase db;
@@ -234,7 +184,6 @@ QHttpPart QFormDataPartBuilder::build()
#endif
httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, m_headerValue);
-
if (auto d = std::get_if<QIODevice*>(&m_body))
httpPart.setBodyDevice(*d);
else if (auto b = std::get_if<QByteArray>(&m_body))
diff --git a/src/network/access/qformdatabuilder.h b/src/network/access/qformdatabuilder.h
index 1bbf9066cd7..b3db2727720 100644
--- a/src/network/access/qformdatabuilder.h
+++ b/src/network/access/qformdatabuilder.h
@@ -36,7 +36,6 @@ public:
QFormDataPartBuilder(QFormDataPartBuilder &&other) noexcept
: m_headerValue(std::move(other.m_headerValue)),
- m_bodyName(std::move(other.m_bodyName)),
m_originalBodyName(std::move(other.m_originalBodyName)),
m_httpHeaders(std::move(other.m_httpHeaders)),
m_body(std::move(other.m_body)),
@@ -49,7 +48,6 @@ public:
void swap(QFormDataPartBuilder &other) noexcept
{
m_headerValue.swap(other.m_headerValue);
- m_bodyName.swap(other.m_bodyName);
m_originalBodyName.swap(other.m_originalBodyName);
m_httpHeaders.swap(other.m_httpHeaders);
m_body.swap(other.m_body);
@@ -75,7 +73,6 @@ private:
Q_NETWORK_EXPORT QHttpPart build();
QByteArray m_headerValue;
- QByteArray m_bodyName;
QString m_originalBodyName;
QHttpHeaders m_httpHeaders;
std::variant<QIODevice*, QByteArray> m_body;
diff --git a/tests/auto/network/access/qformdatabuilder/tst_qformdatabuilder.cpp b/tests/auto/network/access/qformdatabuilder/tst_qformdatabuilder.cpp
index 70d9b4b1bdc..ad40c79bf98 100644
--- a/tests/auto/network/access/qformdatabuilder/tst_qformdatabuilder.cpp
+++ b/tests/auto/network/access/qformdatabuilder/tst_qformdatabuilder.cpp
@@ -195,7 +195,6 @@ void tst_QFormDataBuilder::picksUtf8EncodingOnlyIfL1OrAsciiDontSuffice()
}
QVERIFY(msg.contains(expected_content_type_data));
- QEXPECT_FAIL("u8-latin", "will be fixed in subsequent patch", Continue);
QVERIFY(msg.contains(expected_content_disposition_data));
}