From b5e89d251eb99b87db1893661679f68d659ba59d Mon Sep 17 00:00:00 2001 From: Dennis Oberst Date: Fri, 18 Jul 2025 15:56:08 +0200 Subject: [PATCH] Http2Handler: provide channel() and channelPriv() accessors For consistency. No null checking is needed as the channel will always destroy all children before destroying itself. Pick-to: 6.9 6.8 Change-Id: I4638cd906dc6c66d2559048bd147216518655110 Reviewed-by: Alexey Edelev (cherry picked from commit f8196f805091ba0c144ad0ab7e7947e7915074cd) Reviewed-by: Qt Cherry-pick Bot --- src/grpc/qgrpchttp2channel.cpp | 35 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/grpc/qgrpchttp2channel.cpp b/src/grpc/qgrpchttp2channel.cpp index 4d9403a4..d3382ae7 100644 --- a/src/grpc/qgrpchttp2channel.cpp +++ b/src/grpc/qgrpchttp2channel.cpp @@ -273,6 +273,8 @@ public: private: void prepareInitialRequest(QGrpcOperationContext *operationContext, QGrpcHttp2ChannelPrivate *channel); + [[nodiscard]] QGrpcHttp2ChannelPrivate *channelPriv() const; + [[nodiscard]] QGrpcHttp2Channel *channel() const; HPack::HttpHeader m_initialHeaders; std::weak_ptr m_operation; @@ -412,9 +414,8 @@ void Http2Handler::attachStream(QHttp2Stream *stream_) auto *channelOpPtr = operation(); m_stream = stream_; - auto *parentChannel = qobject_cast(parent()); QObject::connect(m_stream.get(), &QHttp2Stream::headersReceived, channelOpPtr, - [channelOpPtr, parentChannel, this](const HPack::HttpHeader &headers, + [channelOpPtr, this](const HPack::HttpHeader &headers, bool endStream) { auto md = channelOpPtr->serverMetadata(); QtGrpc::StatusCode statusCode = StatusCode::Ok; @@ -436,25 +437,24 @@ void Http2Handler::attachStream(QHttp2Stream *stream_) emit channelOpPtr->finished( QGrpcStatus{ statusCode,statusMessage }); } - parentChannel->deleteHandler(this); + channelPriv()->deleteHandler(this); } }); - Q_ASSERT(parentChannel != nullptr); QObject::connect( - m_stream.get(), &QHttp2Stream::errorOccurred, parentChannel, - [parentChannel, this](quint32 http2ErrorCode, const QString &errorString) { + m_stream.get(), &QHttp2Stream::errorOccurred, channelPriv(), + [this](quint32 http2ErrorCode, const QString &errorString) { if (!m_operation.expired()) { auto channelOp = m_operation.lock(); emit channelOp->finished(QGrpcStatus{ http2ErrorToStatusCode(http2ErrorCode), errorString }); } - parentChannel->deleteHandler(this); + channelPriv()->deleteHandler(this); }, Qt::SingleShotConnection); QObject::connect(m_stream.get(), &QHttp2Stream::dataReceived, channelOpPtr, - [channelOpPtr, parentChannel, this](const QByteArray &data, bool endStream) { + [channelOpPtr, this](const QByteArray &data, bool endStream) { if (m_handlerState != Cancelled) { m_expectedData.container.append(data); @@ -479,7 +479,7 @@ void Http2Handler::attachStream(QHttp2Stream *stream_) if (endStream) { m_handlerState = Finished; emit channelOpPtr->finished({}); - parentChannel->deleteHandler(this); + channelPriv()->deleteHandler(this); } } }); @@ -488,10 +488,10 @@ void Http2Handler::attachStream(QHttp2Stream *stream_) &Http2Handler::processQueue); std::optional deadline; - if (channelOpPtr->callOptions().deadlineTimeout()) - deadline = channelOpPtr->callOptions().deadlineTimeout(); - else if (parentChannel->q_ptr->channelOptions().deadlineTimeout()) - deadline = parentChannel->q_ptr->channelOptions().deadlineTimeout(); + if (auto dt = channelOpPtr->callOptions().deadlineTimeout()) + deadline = dt; + else if (auto chdt = channel()->channelOptions().deadlineTimeout()) + deadline = chdt; if (deadline) { // We have an active stream and a deadline. It's time to start the timer. QObject::connect(&m_deadlineTimer, &QTimer::timeout, this, &Http2Handler::deadlineTimeout); @@ -559,6 +559,15 @@ void Http2Handler::prepareInitialRequest(QGrpcOperationContext *operationContext writeMessage(operationContext->argument()); } +QGrpcHttp2ChannelPrivate *Http2Handler::channelPriv() const +{ + return qobject_cast(this->parent()); +} +QGrpcHttp2Channel *Http2Handler::channel() const +{ + return channelPriv()->q_ptr; +} + // Slot to enqueue a writeMessage request, either from the initial message // or from the user in client/bidirectional streaming RPCs. void Http2Handler::writeMessage(QByteArrayView data)