1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include <QtGrpc/private/qgrpccommonoptions_p.h>
5
6QT_BEGIN_NAMESPACE
7
8#if QT_DEPRECATED_SINCE(6, 13)
9
10QHash<QByteArray, QByteArray>
11QtGrpcPrivate::toHash(const QMultiHash<QByteArray, QByteArray> &multiHash)
12{
13 // Transform a QMultiHash into a QHash by keeping only the first value for each key.
14 // The first value will be the newest one when iterating the multi-hash.
15 QHash<QByteArray, QByteArray> out;
16 out.reserve(size: multiHash.size());
17 for (const auto &[k, v] : multiHash.asKeyValueRange())
18 out.try_emplace(key: k, args: v);
19 return out;
20}
21
22/*!
23//! [metadata]
24 Returns the metadata. If this field is unset, returns empty
25 metadata.
26
27 \include qtgrpc-shared.qdocinc http2-metadata-note
28//! [metadata]
29*/
30const QHash<QByteArray, QByteArray> &QGrpcCommonOptions::metadata() const & noexcept
31{
32 return m_deprecatedMetadata;
33}
34QHash<QByteArray, QByteArray> QGrpcCommonOptions::metadata() &&
35{
36 return std::move(m_deprecatedMetadata);
37}
38
39/*!
40 \internal
41 \class QGrpcCommonOptions
42 \inmodule QtGrpc
43 \brief Shared implementation of QGrpcCallOptions and QGrpcChannelOptions
44 functionality.
45*/
46
47/*!
48//! [set-metadata]
49 Sets the \a metadata and returns a reference to the updated object.
50
51 \include qtgrpc-shared.qdocinc http2-metadata-note
52//! [set-metadata]
53*/
54void QGrpcCommonOptions::setMetadata(const QHash<QByteArray, QByteArray> &md)
55{
56 m_deprecatedMetadata = md;
57 m_metadata = QMultiHash<QByteArray, QByteArray>(md);
58}
59void QGrpcCommonOptions::setMetadata(QHash<QByteArray, QByteArray> &&md)
60{
61 m_deprecatedMetadata = std::move(md);
62 m_metadata = QMultiHash<QByteArray, QByteArray>(m_deprecatedMetadata);
63}
64
65#endif // QT_DEPRECATED_SINCE(6, 13)
66
67/*!
68//! [deadline-timeout]
69 Returns the timeout duration that is used to calculate the deadline for RPCs.
70
71 If this field is unset, returns an empty \c {std::optional}.
72//! [deadline-timeout]
73*/
74std::optional<std::chrono::milliseconds> QGrpcCommonOptions::deadlineTimeout() const noexcept
75{
76 return m_timeout;
77}
78
79/*!
80//! [set-deadline-timeout]
81 Sets the \a timeout and returns a reference to the updated object.
82
83 A deadline sets the limit for how long a client is willing to wait for a
84 response from a server. The actual deadline is computed by adding the \a
85 timeout to the start time of the RPC.
86
87 The deadline applies to the entire lifetime of an RPC, which includes
88 receiving the final QGrpcStatus for a previously started call and can thus
89 be unwanted for (long-lived) streams.
90//! [set-deadline-timeout]
91*/
92void QGrpcCommonOptions::setDeadlineTimeout(std::chrono::milliseconds t)
93{
94 m_timeout = t;
95}
96
97/*!
98//! [metadata-multi]
99 \include qgrpccommonoptions.cpp metadata
100 Multiple values per key are supported.
101
102 \code
103 const auto &md = opts.metadata(QtGrpc::MultiValue);
104 \endcode
105//! [metadata-multi]
106*/
107const QMultiHash<QByteArray, QByteArray> &
108QGrpcCommonOptions::metadata(QtGrpc::MultiValue_t /*tag*/) const & noexcept
109{
110 return m_metadata;
111}
112QMultiHash<QByteArray, QByteArray> QGrpcCommonOptions::metadata(QtGrpc::MultiValue_t /*tag*/) &&
113{
114 return std::move(m_metadata);
115}
116
117/*!
118//! [set-metadata-multi]
119 \include qgrpccommonoptions.cpp set-metadata
120 Multiple values per key are supported.
121//! [set-metadata-multi]
122*/
123void QGrpcCommonOptions::setMetadata(const QMultiHash<QByteArray, QByteArray> &md)
124{
125 m_metadata = md;
126#if QT_DEPRECATED_SINCE(6, 13)
127 m_deprecatedMetadata = QtGrpcPrivate::toHash(multiHash: m_metadata);
128#endif
129}
130
131void QGrpcCommonOptions::setMetadata(QMultiHash<QByteArray, QByteArray> &&md)
132{
133 m_metadata = std::move(md);
134#if QT_DEPRECATED_SINCE(6, 13)
135 m_deprecatedMetadata = QtGrpcPrivate::toHash(multiHash: m_metadata);
136#endif
137}
138
139/*!
140//! [add-metadata]
141 \since 6.10
142
143 Adds \a key and \a value to the \l metadata if the exact pair is not already contained.
144 The same key may appear multiple times with different values.
145
146 \include qtgrpc-shared.qdocinc http2-metadata-note
147
148 \sa {metadata(QtGrpc::MultiValue_t)}{metadata()} {setMetadata(const
149 QMultiHash<QByteArray, QByteArray>&)}{setMetadata()}
150//! [add-metadata]
151*/
152void QGrpcCommonOptions::addMetadata(QByteArray &&key, QByteArray &&value)
153{
154#if QT_DEPRECATED_SINCE(6, 13)
155 m_deprecatedMetadata.insertOrAssign(key, value);
156#endif
157 m_metadata.emplace(key: std::move(key), args: std::move(value));
158}
159
160bool QGrpcCommonOptions::containsMetadata(QByteArrayView key, QByteArrayView value) const
161{
162 const auto &md = metadata(QtGrpc::MultiValue);
163 auto [f, l] = md.equal_range(key);
164 return std::find(first: f, last: l, val: value) != l;
165}
166
167/*!
168//! [filterServerMetadata]
169 \since 6.11
170
171 Returns \c true if protocol-related server metadata is excluded from the
172 result. Returns \c false to include all metadata received from the server.
173
174 If this field is unset, returns an empty \c {std::optional}.
175
176 \sa setFilterServerMetadata()
177//! [filterServerMetadata]
178*/
179std::optional<bool> QGrpcCommonOptions::filterServerMetadata() const noexcept
180{
181 return m_filterServerMetadata;
182}
183
184/*!
185//! [setFilterServerMetadata]
186 \since 6.11
187
188 If \a value is \c true, protocol-related metadata defined by the gRPC
189 transport (such as reserved \c{grpc-} keys) will be excluded. If \a value
190 is \c false, all metadata received from the server will be included.
191
192 \sa filterServerMetadata()
193*/
194void QGrpcCommonOptions::setFilterServerMetadata(bool value)
195{
196 m_filterServerMetadata = value;
197}
198
199QT_END_NAMESPACE
200

source code of qtgrpc/src/grpc/qgrpccommonoptions.cpp