34class QFormDataPartBuilderPrivate
37 explicit QFormDataPartBuilderPrivate(QAnyStringView name);
38 QHttpPart build(QFormDataBuilder::Options options);
41 QByteArray m_mimeType;
42 QString m_originalBodyName;
43 QHttpHeaders m_httpHeaders;
44 std::variant<QIODevice*, QByteArray> m_body;
68 for (qsizetype i = 0, end = src.size(); i != end; ++i) {
69 const auto c = src[i];
70 if (c == u'"' || c == u'\\') {
71 const auto chunk = src.sliced(last, i - last);
72 dst += QUtf8::convertFromUnicode(chunk);
77 dst += QUtf8::convertFromUnicode(src.sliced(last));
264QHttpPart QFormDataPartBuilderPrivate::build(QFormDataBuilder::Options options)
268 using Opt = QFormDataBuilder::Option;
270 QByteArray headerValue;
272 headerValue +=
"form-data; name=\"";
273 escapeNameAndAppend(headerValue, m_name);
276 if (!m_originalBodyName.isNull()) {
278 enum class Encoding { ASCII, Latin1, Utf8 } encoding = Encoding::ASCII;
279 for (QChar c : std::as_const(m_originalBodyName)) {
281 encoding = Encoding::Utf8;
283 }
else if (c > u'\x7f') {
284 encoding = Encoding::Latin1;
288 if ((options & Opt::PreferLatin1EncodedFilename) && encoding != Encoding::Utf8)
289 enc = m_originalBodyName.toLatin1();
291 enc = m_originalBodyName.toUtf8();
293 headerValue +=
"; filename=\"";
294 if (options & Opt::UseRfc7578PercentEncodedFilename)
295 headerValue += enc.toPercentEncoding();
297 escapeNameAndAppend(headerValue, enc);
299 if (encoding != Encoding::ASCII && !(options & Opt::OmitRfc8187EncodedFilename)) {
305 if ((options & Opt::PreferLatin1EncodedFilename) && encoding == Encoding::Latin1)
306 headerValue +=
"; filename*=ISO-8859-1''";
308 headerValue +=
"; filename*=UTF-8''";
309 headerValue += enc.toPercentEncoding();
313#if QT_CONFIG(mimetype)
314 if (m_mimeType.isEmpty()) {
317 convertInto(m_mimeType, std::visit([&](
auto &arg) {
318 return db.mimeTypeForFileNameAndData(m_originalBodyName, arg);
323 for (qsizetype i = 0; i < m_httpHeaders.size(); i++) {
324 httpPart.setRawHeader(QByteArrayView(m_httpHeaders.nameAt(i)).toByteArray(),
325 m_httpHeaders.valueAt(i).toByteArray());
328 if (!m_mimeType.isEmpty())
329 httpPart.setHeader(QNetworkRequest::ContentTypeHeader, m_mimeType);
331 httpPart.setHeader(QNetworkRequest::ContentDispositionHeader, std::move(headerValue));
333 if (
auto d = std::get_if<QIODevice*>(&m_body))
334 httpPart.setBodyDevice(*d);
335 else if (
auto b = std::get_if<QByteArray>(&m_body))
336 httpPart.setBody(*b);