mirror of https://github.com/qt/qtgrpc.git
165 lines
4.6 KiB
C++
165 lines
4.6 KiB
C++
// Copyright (C) 2025 The Qt Company Ltd.
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
|
|
|
#include <QtGrpc/private/qgrpccommonoptions_p.h>
|
|
|
|
QT_BEGIN_NAMESPACE
|
|
|
|
#if QT_DEPRECATED_SINCE(6, 13)
|
|
|
|
QHash<QByteArray, QByteArray>
|
|
QtGrpcPrivate::toHash(const QMultiHash<QByteArray, QByteArray> &multiHash)
|
|
{
|
|
// Transform a QMultiHash into a QHash by keeping only the first value for each key.
|
|
// The first value will be the newest one when iterating the multi-hash.
|
|
QHash<QByteArray, QByteArray> out;
|
|
out.reserve(multiHash.size());
|
|
for (const auto &[k, v] : multiHash.asKeyValueRange())
|
|
out.try_emplace(k, v);
|
|
return out;
|
|
}
|
|
|
|
/*!
|
|
//! [metadata]
|
|
Returns the metadata. If this field is unset, returns empty
|
|
metadata.
|
|
//! [metadata]
|
|
*/
|
|
const QHash<QByteArray, QByteArray> &QGrpcCommonOptions::metadata() const & noexcept
|
|
{
|
|
return m_deprecatedMetadata;
|
|
}
|
|
QHash<QByteArray, QByteArray> QGrpcCommonOptions::metadata() &&
|
|
{
|
|
return std::move(m_deprecatedMetadata);
|
|
}
|
|
|
|
/*!
|
|
\internal
|
|
\class QGrpcCommonOptions
|
|
\inmodule QtGrpc
|
|
\brief Shared implementation of QGrpcCallOptions and QGrpcChannelOptions
|
|
functionality.
|
|
*/
|
|
|
|
/*!
|
|
//! [set-metadata]
|
|
Sets the \a metadata and returns a reference to the updated object.
|
|
|
|
When using QGrpcHttp2Channel, the metadata is converted to HTTP/2 headers
|
|
and added to the gRPC request.
|
|
//! [set-metadata]
|
|
*/
|
|
void QGrpcCommonOptions::setMetadata(const QHash<QByteArray, QByteArray> &md)
|
|
{
|
|
m_deprecatedMetadata = md;
|
|
m_metadata = QMultiHash<QByteArray, QByteArray>(md);
|
|
}
|
|
void QGrpcCommonOptions::setMetadata(QHash<QByteArray, QByteArray> &&md)
|
|
{
|
|
m_deprecatedMetadata = std::move(md);
|
|
m_metadata = QMultiHash<QByteArray, QByteArray>(m_deprecatedMetadata);
|
|
}
|
|
|
|
#endif // QT_DEPRECATED_SINCE(6, 13)
|
|
|
|
/*!
|
|
//! [deadline-timeout]
|
|
Returns the timeout duration that is used to calculate the deadline for RPCs.
|
|
|
|
If this field is unset, returns an empty \c {std::optional}.
|
|
//! [deadline-timeout]
|
|
*/
|
|
std::optional<std::chrono::milliseconds> QGrpcCommonOptions::deadlineTimeout() const noexcept
|
|
{
|
|
return m_timeout;
|
|
}
|
|
|
|
/*!
|
|
//! [set-deadline-timeout]
|
|
Sets the \a timeout and returns a reference to the updated object.
|
|
|
|
A deadline sets the limit for how long a client is willing to wait for a
|
|
response from a server. The actual deadline is computed by adding the \a
|
|
timeout to the start time of the RPC.
|
|
|
|
The deadline applies to the entire lifetime of an RPC, which includes
|
|
receiving the final QGrpcStatus for a previously started call and can thus
|
|
be unwanted for (long-lived) streams.
|
|
//! [set-deadline-timeout]
|
|
*/
|
|
void QGrpcCommonOptions::setDeadlineTimeout(std::chrono::milliseconds t)
|
|
{
|
|
m_timeout = t;
|
|
}
|
|
|
|
/*!
|
|
//! [metadata-multi]
|
|
\include qgrpccommonoptions.cpp metadata
|
|
Multiple values per key are supported.
|
|
|
|
\code
|
|
const auto &md = opts.metadata(QtGrpc::MultiValue);
|
|
\endcode
|
|
//! [metadata-multi]
|
|
*/
|
|
const QMultiHash<QByteArray, QByteArray> &
|
|
QGrpcCommonOptions::metadata(QtGrpc::MultiValue_t /*tag*/) const & noexcept
|
|
{
|
|
return m_metadata;
|
|
}
|
|
QMultiHash<QByteArray, QByteArray> QGrpcCommonOptions::metadata(QtGrpc::MultiValue_t /*tag*/) &&
|
|
{
|
|
return std::move(m_metadata);
|
|
}
|
|
|
|
/*!
|
|
//! [set-metadata-multi]
|
|
\include qgrpccommonoptions.cpp set-metadata
|
|
Multiple values per key are supported.
|
|
//! [set-metadata-multi]
|
|
*/
|
|
void QGrpcCommonOptions::setMetadata(const QMultiHash<QByteArray, QByteArray> &md)
|
|
{
|
|
m_metadata = md;
|
|
#if QT_DEPRECATED_SINCE(6, 13)
|
|
m_deprecatedMetadata = QtGrpcPrivate::toHash(m_metadata);
|
|
#endif
|
|
}
|
|
|
|
void QGrpcCommonOptions::setMetadata(QMultiHash<QByteArray, QByteArray> &&md)
|
|
{
|
|
m_metadata = std::move(md);
|
|
#if QT_DEPRECATED_SINCE(6, 13)
|
|
m_deprecatedMetadata = QtGrpcPrivate::toHash(m_metadata);
|
|
#endif
|
|
}
|
|
|
|
/*!
|
|
//! [add-metadata]
|
|
\since 6.10
|
|
|
|
Adds \a key and \a value to the \l metadata if the exact pair is not already contained.
|
|
The same key may appear multiple times with different values.
|
|
|
|
\sa {metadata(QtGrpc::MultiValue_t)}{metadata()} {setMetadata(const
|
|
QMultiHash<QByteArray, QByteArray>&)}{setMetadata()}
|
|
//! [add-metadata]
|
|
*/
|
|
void QGrpcCommonOptions::addMetadata(QByteArray &&key, QByteArray &&value)
|
|
{
|
|
#if QT_DEPRECATED_SINCE(6, 13)
|
|
m_deprecatedMetadata.insertOrAssign(key, value);
|
|
#endif
|
|
m_metadata.emplace(std::move(key), std::move(value));
|
|
}
|
|
|
|
bool QGrpcCommonOptions::containsMetadata(QByteArrayView key, QByteArrayView value) const
|
|
{
|
|
const auto &md = metadata(QtGrpc::MultiValue);
|
|
auto [f, l] = md.equal_range(key);
|
|
return std::find(f, l, value) != l;
|
|
}
|
|
|
|
QT_END_NAMESPACE
|