1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QFORMDATABUILDER_H
6#define QFORMDATABUILDER_H
7
8#include <QtNetwork/qtnetworkglobal.h>
9#include <QtNetwork/qhttpheaders.h>
10#include <QtNetwork/qhttpmultipart.h>
11
12#include <QtCore/qbytearray.h>
13#include <QtCore/qflags.h>
14#include <QtCore/qiodevice.h>
15#include <QtCore/qstring.h>
16
17#include <memory>
18#include <variant>
19
20#ifndef Q_OS_WASM
21QT_REQUIRE_CONFIG(http);
22#endif
23
24QT_BEGIN_NAMESPACE
25
26class QHttpPartPrivate;
27class QHttpMultiPart;
28class QDebug;
29
30class QFormDataBuilderPrivate;
31class QFormDataPartBuilderPrivate;
32
33class QFormDataPartBuilder
34{
35 QFormDataPartBuilder(QFormDataBuilderPrivate *qfdb, qsizetype idx) : d(qfdb), m_index(idx) {}
36public:
37 void swap(QFormDataPartBuilder &other) noexcept
38 {
39 qt_ptr_swap(lhs&: d, rhs&: other.d);
40 std::swap(a&: m_index, b&: other.m_index);
41 }
42
43 QFormDataPartBuilder() = default;
44 // Rule of zero applies
45
46 Q_WEAK_OVERLOAD QFormDataPartBuilder setBody(const QByteArray &data,
47 QAnyStringView fileName = {},
48 QAnyStringView mimeType = {})
49 { return setBodyHelper(data, fileName, mimeType); }
50
51 Q_NETWORK_EXPORT QFormDataPartBuilder setBody(QByteArrayView data,
52 QAnyStringView fileName = {},
53 QAnyStringView mimeType = {});
54 Q_NETWORK_EXPORT QFormDataPartBuilder setBodyDevice(QIODevice *body,
55 QAnyStringView fileName = {},
56 QAnyStringView mimeType = {});
57 Q_NETWORK_EXPORT QFormDataPartBuilder setHeaders(const QHttpHeaders &headers);
58private:
59 Q_NETWORK_EXPORT QFormDataPartBuilder setBodyHelper(const QByteArray &data,
60 QAnyStringView fileName,
61 QAnyStringView mimeType);
62
63 QFormDataPartBuilderPrivate* d_func();
64 const QFormDataPartBuilderPrivate* d_func() const;
65
66 QFormDataBuilderPrivate *d;
67 size_t m_index;
68
69 friend class QFormDataBuilder;
70};
71
72Q_DECLARE_SHARED(QFormDataPartBuilder)
73
74class QFormDataBuilder
75{
76public:
77 enum class Option {
78 Default = 0x00,
79 OmitRfc8187EncodedFilename = 0x01,
80 UseRfc7578PercentEncodedFilename = 0x02,
81 PreferLatin1EncodedFilename = 0x04,
82
83 StrictRfc7578 = OmitRfc8187EncodedFilename | UseRfc7578PercentEncodedFilename,
84 };
85 Q_DECLARE_FLAGS(Options, Option)
86
87 Q_NETWORK_EXPORT QFormDataBuilder();
88
89 QFormDataBuilder(QFormDataBuilder &&other) noexcept : d_ptr(std::exchange(obj&: other.d_ptr, new_val: nullptr)) {}
90
91 QT_MOVE_ASSIGNMENT_OPERATOR_IMPL_VIA_PURE_SWAP(QFormDataBuilder)
92 void swap(QFormDataBuilder &other) noexcept
93 {
94 qt_ptr_swap(lhs&: d_ptr, rhs&: other.d_ptr);
95 }
96
97 Q_NETWORK_EXPORT ~QFormDataBuilder();
98 Q_NETWORK_EXPORT QFormDataPartBuilder part(QAnyStringView name);
99 Q_NETWORK_EXPORT std::unique_ptr<QHttpMultiPart> buildMultiPart(Options options = {});
100private:
101 QFormDataBuilderPrivate *d_ptr;
102
103 Q_DECLARE_PRIVATE(QFormDataBuilder)
104 Q_DISABLE_COPY(QFormDataBuilder)
105};
106Q_DECLARE_OPERATORS_FOR_FLAGS(QFormDataBuilder::Options)
107
108Q_DECLARE_SHARED(QFormDataBuilder)
109
110QT_END_NAMESPACE
111
112#endif // QFORMDATABUILDER_H
113

source code of qtbase/src/network/access/qformdatabuilder.h