diff --git a/quic/api/QuicTransportBase.cpp b/quic/api/QuicTransportBase.cpp index 82f7b6755..4f08269a2 100644 --- a/quic/api/QuicTransportBase.cpp +++ b/quic/api/QuicTransportBase.cpp @@ -2603,7 +2603,13 @@ void QuicTransportBase::cancelAllAppCallbacks( } } VLOG(4) << "Clearing " << peekCallbacks_.size() << " peek callbacks"; - peekCallbacks_.clear(); + auto peekCallbacksCopy = peekCallbacks_; + for (auto& cb : peekCallbacksCopy) { + peekCallbacks_.erase(cb.first); + if (cb.second.peekCb) { + cb.second.peekCb->peekError(cb.first, err); + } + } if (connWriteCallback_) { auto connWriteCallback = connWriteCallback_; diff --git a/quic/api/test/QuicTransportBaseTest.cpp b/quic/api/test/QuicTransportBaseTest.cpp index c734d90e7..12d3abc8c 100644 --- a/quic/api/test/QuicTransportBaseTest.cpp +++ b/quic/api/test/QuicTransportBaseTest.cpp @@ -2593,6 +2593,7 @@ TEST_F(QuicTransportImplTest, TestImmediateClose) { NiceMock wcb; NiceMock wcbConn; NiceMock rcb; + NiceMock pcb; NiceMock deliveryCb; NiceMock txCb; EXPECT_CALL( @@ -2604,6 +2605,8 @@ TEST_F(QuicTransportImplTest, TestImmediateClose) { onConnectionWriteError(IsAppError(GenericApplicationErrorCode::UNKNOWN))); EXPECT_CALL( rcb, readError(stream, IsAppError(GenericApplicationErrorCode::UNKNOWN))); + EXPECT_CALL( + pcb, peekError(stream, IsAppError(GenericApplicationErrorCode::UNKNOWN))); EXPECT_CALL(deliveryCb, onCanceled(stream, _)); EXPECT_CALL(txCb, onByteEventCanceled(getTxMatcher(stream, 0))); EXPECT_CALL(txCb, onByteEventCanceled(getTxMatcher(stream, 4))); @@ -2613,6 +2616,7 @@ TEST_F(QuicTransportImplTest, TestImmediateClose) { transport->notifyPendingWriteOnConnection(&wcbConn); transport->notifyPendingWriteOnStream(stream, &wcb); transport->setReadCallback(stream, &rcb); + transport->setPeekCallback(stream, &pcb); EXPECT_CALL(*socketPtr, write(_, _)) .WillRepeatedly(SetErrnoAndReturn(EAGAIN, -1)); transport->writeChain(stream, IOBuf::copyBuffer("hello"), true, &deliveryCb); @@ -2975,6 +2979,8 @@ TEST_F(QuicTransportImplTest, PeekError) { transport->driveReadCallbacks(); + EXPECT_CALL(peekCb1, peekError(stream1, _)); + transport.reset(); }