diff --git a/src/grpc/qgrpccalloptions.cpp b/src/grpc/qgrpccalloptions.cpp index 473a8d24..23715477 100644 --- a/src/grpc/qgrpccalloptions.cpp +++ b/src/grpc/qgrpccalloptions.cpp @@ -272,6 +272,33 @@ QGrpcCallOptions &QGrpcCallOptions::addMetadata(QByteArrayView key, QByteArrayVi return *this; } +/*! + \include qgrpccommonoptions.cpp filterServerMetadata + \sa QGrpcChannelOptions::filterServerMetadata() +*/ +std::optional QGrpcCallOptions::filterServerMetadata() const noexcept +{ + Q_D(const QGrpcCallOptions); + return d->filterServerMetadata(); +} + +/*! + \include qgrpccommonoptions.cpp setFilterServerMetadata + \note Setting this field \b{overrides} the corresponding channel options + field — see \l{QGrpcChannelOptions::setFilterServerMetadata()} + + \sa QGrpcChannelOptions::setFilterServerMetadata() +*/ +QGrpcCallOptions &QGrpcCallOptions::setFilterServerMetadata(bool value) +{ + if (d_ptr->filterServerMetadata() == value) + return *this; + d_ptr.detach(); + Q_D(QGrpcCallOptions); + d->setFilterServerMetadata(value); + return *this; +} + #ifndef QT_NO_DEBUG_STREAM /*! \since 6.8 diff --git a/src/grpc/qgrpccalloptions.h b/src/grpc/qgrpccalloptions.h index 61222fc1..79e090ef 100644 --- a/src/grpc/qgrpccalloptions.h +++ b/src/grpc/qgrpccalloptions.h @@ -64,6 +64,9 @@ public: setMetadata(std::initializer_list> list); Q_GRPC_EXPORT QGrpcCallOptions &addMetadata(QByteArrayView key, QByteArrayView value); + [[nodiscard]] Q_GRPC_EXPORT std::optional filterServerMetadata() const noexcept; + Q_GRPC_EXPORT QGrpcCallOptions &setFilterServerMetadata(bool value); + private: QExplicitlySharedDataPointer d_ptr; diff --git a/src/grpc/qgrpcchanneloptions.cpp b/src/grpc/qgrpcchanneloptions.cpp index 0b237e2a..0ad997a7 100644 --- a/src/grpc/qgrpcchanneloptions.cpp +++ b/src/grpc/qgrpcchanneloptions.cpp @@ -281,6 +281,34 @@ QGrpcChannelOptions &QGrpcChannelOptions::addMetadata(QByteArrayView key, QByteA return *this; } +/*! + \include qgrpccommonoptions.cpp filterServerMetadata + \sa QGrpcCallOptions::filterServerMetadata() +*/ +std::optional QGrpcChannelOptions::filterServerMetadata() const noexcept +{ + Q_D(const QGrpcChannelOptions); + return d->filterServerMetadata(); +} + +/*! + \include qgrpccommonoptions.cpp setFilterServerMetadata + + \include qgrpcchanneloptions.cpp channel-note + \l{QGrpcCallOptions::filterServerMetadata} + + \sa QGrpcCallOptions::setFilterServerMetadata() +*/ +QGrpcChannelOptions &QGrpcChannelOptions::setFilterServerMetadata(bool value) +{ + if (filterServerMetadata() == value) + return *this; + d_ptr.detach(); + Q_D(QGrpcChannelOptions); + d->setFilterServerMetadata(value); + return *this; +} + /*! \since 6.8 diff --git a/src/grpc/qgrpcchanneloptions.h b/src/grpc/qgrpcchanneloptions.h index c69d9ce6..7957515a 100644 --- a/src/grpc/qgrpcchanneloptions.h +++ b/src/grpc/qgrpcchanneloptions.h @@ -70,6 +70,9 @@ public: setMetadata(std::initializer_list> list); Q_GRPC_EXPORT QGrpcChannelOptions &addMetadata(QByteArrayView key, QByteArrayView value); + [[nodiscard]] Q_GRPC_EXPORT std::optional filterServerMetadata() const noexcept; + Q_GRPC_EXPORT QGrpcChannelOptions &setFilterServerMetadata(bool value); + [[nodiscard]] Q_GRPC_EXPORT QGrpcSerializationFormat serializationFormat() const; Q_GRPC_EXPORT QGrpcChannelOptions & setSerializationFormat(const QGrpcSerializationFormat &format); diff --git a/src/grpc/qgrpccommonoptions.cpp b/src/grpc/qgrpccommonoptions.cpp index add81e4b..74b40620 100644 --- a/src/grpc/qgrpccommonoptions.cpp +++ b/src/grpc/qgrpccommonoptions.cpp @@ -161,4 +161,36 @@ bool QGrpcCommonOptions::containsMetadata(QByteArrayView key, QByteArrayView val return std::find(f, l, value) != l; } +/*! +//! [filterServerMetadata] + \since 6.11 + + Returns \c true if protocol-related server metadata is excluded from the + result. Returns \c false to include all metadata received from the server. + + If this field is unset, returns an empty \c {std::optional}. + + \sa setFilterServerMetadata() +//! [filterServerMetadata] +*/ +std::optional QGrpcCommonOptions::filterServerMetadata() const noexcept +{ + return m_filterServerMetadata; +} + +/*! +//! [setFilterServerMetadata] + \since 6.11 + + If \a value is \c true, protocol-related metadata defined by the gRPC + transport (such as reserved \c{grpc-} keys) will be excluded. If \a value + is \c false, all metadata received from the server will be included. + + \sa filterServerMetadata() +*/ +void QGrpcCommonOptions::setFilterServerMetadata(bool value) +{ + m_filterServerMetadata = value; +} + QT_END_NAMESPACE diff --git a/src/grpc/qgrpccommonoptions_p.h b/src/grpc/qgrpccommonoptions_p.h index 5fd2f0ee..4c438c87 100644 --- a/src/grpc/qgrpccommonoptions_p.h +++ b/src/grpc/qgrpccommonoptions_p.h @@ -50,12 +50,16 @@ public: void addMetadata(QByteArray &&key, QByteArray &&value); bool containsMetadata(QByteArrayView key, QByteArrayView value) const; + std::optional filterServerMetadata() const noexcept; + void setFilterServerMetadata(bool value); + private: std::optional m_timeout; QMultiHash m_metadata; #if QT_DEPRECATED_SINCE(6, 13) QHash m_deprecatedMetadata; #endif + std::optional m_filterServerMetadata; }; namespace QtGrpcPrivate { diff --git a/tests/auto/grpc/qgrpccalloptions/tst_qgrpccalloptions.cpp b/tests/auto/grpc/qgrpccalloptions/tst_qgrpccalloptions.cpp index 626e217a..5aeff9e7 100644 --- a/tests/auto/grpc/qgrpccalloptions/tst_qgrpccalloptions.cpp +++ b/tests/auto/grpc/qgrpccalloptions/tst_qgrpccalloptions.cpp @@ -21,6 +21,7 @@ private Q_SLOTS: #endif void propertyMetadata() const { common.propertyMetadata(); } void propertyDeadline() const { common.propertyDeadline(); } + void propertyFilterServerMetadata() const { common.propertyFilterServerMetadata(); } void streamsToDebug() const { common.streamsToDebug(); } private: diff --git a/tests/auto/grpc/qgrpcchanneloptions/tst_qgrpcchanneloptions.cpp b/tests/auto/grpc/qgrpcchanneloptions/tst_qgrpcchanneloptions.cpp index 34865861..82ad8c53 100644 --- a/tests/auto/grpc/qgrpcchanneloptions/tst_qgrpcchanneloptions.cpp +++ b/tests/auto/grpc/qgrpcchanneloptions/tst_qgrpcchanneloptions.cpp @@ -24,6 +24,7 @@ private Q_SLOTS: #endif void propertyMetadata() const { common.propertyMetadata(); } void propertyDeadline() const { common.propertyDeadline(); } + void propertyFilterServerMetadata() const { common.propertyFilterServerMetadata(); } void streamsToDebug() const { common.streamsToDebug(); } void propertySerializationFormat() const; diff --git a/tests/auto/grpc/shared/grpccommonoptions.h b/tests/auto/grpc/shared/grpccommonoptions.h index 0b7823c5..9d81e174 100644 --- a/tests/auto/grpc/shared/grpccommonoptions.h +++ b/tests/auto/grpc/shared/grpccommonoptions.h @@ -231,6 +231,15 @@ QT_WARNING_POP QCOMPARE_EQ(o1.deadlineTimeout(), Dur); QCOMPARE_NE(o1.deadlineTimeout(), o1Detach.deadlineTimeout()); } + void propertyFilterServerMetadata() const + { + T o1; + QCOMPARE_EQ(o1.filterServerMetadata(), std::nullopt); + auto o1Detach = o1; + o1.setFilterServerMetadata(true); + QCOMPARE_NE(o1.filterServerMetadata(), o1Detach.filterServerMetadata()); + QCOMPARE_EQ(o1.filterServerMetadata(), std::optional(true)); + } void streamsToDebug() const { T o;