35class QFormDataPartBuilderPrivate
38 explicit QFormDataPartBuilderPrivate(QAnyStringView name);
39 QHttpPart build(QFormDataBuilder::Options options);
42 QByteArray m_mimeType;
43 QString m_originalBodyName;
44 QHttpHeaders m_httpHeaders;
45 std::variant<QIODevice*, QByteArray> m_body;
69 for (qsizetype i = 0, end = src.size(); i != end; ++i) {
70 const auto c = src[i];
71 if (c == u'"' || c == u'\\') {
72 const auto chunk = src.sliced(last, i - last);
73 dst += QUtf8::convertFromUnicode(chunk);
78 dst += QUtf8::convertFromUnicode(src.sliced(last));
265QHttpPart QFormDataPartBuilderPrivate::build(QFormDataBuilder::Options options)
269 using Opt = QFormDataBuilder::Option;
271 QByteArray headerValue;
273 headerValue +=
"form-data; name=\"";
274 escapeNameAndAppend(headerValue, m_name);
277 if (!m_originalBodyName.isNull()) {
279 enum class Encoding { ASCII, Latin1, Utf8 } encoding = Encoding::ASCII;
280 for (QChar c : std::as_const(m_originalBodyName)) {
282 encoding = Encoding::Utf8;
284 }
else if (c > u'\x7f') {
285 encoding = Encoding::Latin1;
289 if ((options & Opt::PreferLatin1EncodedFilename) && encoding != Encoding::Utf8)
290 enc = m_originalBodyName.toLatin1();
292 enc = m_originalBodyName.toUtf8();
294 headerValue +=
"; filename=\"";
295 if (options & Opt::UseRfc7578PercentEncodedFilename)
296 headerValue += enc.toPercentEncoding();
298 escapeNameAndAppend(headerValue, enc);
300 if (encoding != Encoding::ASCII && !(options & Opt::OmitRfc8187EncodedFilename)) {
306 if ((options & Opt::PreferLatin1EncodedFilename) && encoding == Encoding::Latin1)
307 headerValue +=
"; filename*=ISO-8859-1''";
309 headerValue +=
"; filename*=UTF-8''";
310 headerValue += enc.toPercentEncoding();
314#if QT_CONFIG(mimetype)
315 if (m_mimeType.isEmpty()) {
318 convertInto(m_mimeType, std::visit([&](
auto &arg) {
319 return db.mimeTypeForFileNameAndData(m_originalBodyName, arg);
324 for (qsizetype i = 0; i < m_httpHeaders.size(); i++) {
325 httpPart.setRawHeader(QByteArrayView(m_httpHeaders.nameAt(i)).toByteArray(),
326 m_httpHeaders.valueAt(i).toByteArray());
329 if (!m_mimeType.isEmpty())
330 httpPart.setHeader(QNetworkRequest::ContentTypeHeader, m_mimeType);
332 httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, std::move(headerValue));
334 if (
auto d = std::get_if<QIODevice*>(&m_body))
335 httpPart.setBodyDevice(*d);
336 else if (
auto b = std::get_if<QByteArray>(&m_body))
337 httpPart.setBody(*b);