Allow QpackStreamSenderDelegate to be set dynamically.

In IETF QUIC, the session is not allowed to open any stream until stream limit is negotiated. This means that when QPACK encoder/decoder are initialized, QPACK streams might not exist yet. Plus the peer may not support QPACK dynamic table, in which case we might choose not to create QPACK streams.

This change allows send stream to be nullptr upon initialization and be set later when QPACK streams are initialized.

gfe-relnote: v99 only, not protected.
PiperOrigin-RevId: 262167938
Change-Id: Ibd9f96dec3abcbde98e43e1199f369a1c951922d
diff --git a/quic/core/qpack/qpack_decoder_stream_sender.h b/quic/core/qpack/qpack_decoder_stream_sender.h
index 5f17744..6bf466f 100644
--- a/quic/core/qpack/qpack_decoder_stream_sender.h
+++ b/quic/core/qpack/qpack_decoder_stream_sender.h
@@ -19,8 +19,7 @@
 // stream.
 class QUIC_EXPORT_PRIVATE QpackDecoderStreamSender {
  public:
-  explicit QpackDecoderStreamSender(QpackStreamSenderDelegate* delegate);
-  QpackDecoderStreamSender() = delete;
+  QpackDecoderStreamSender();
   QpackDecoderStreamSender(const QpackDecoderStreamSender&) = delete;
   QpackDecoderStreamSender& operator=(const QpackDecoderStreamSender&) = delete;
 
@@ -34,8 +33,13 @@
   // 5.3.3 Stream Cancellation
   void SendStreamCancellation(QuicStreamId stream_id);
 
+  // delegate must be set if dynamic table capacity is not zero.
+  void set_qpack_stream_sender_delegate(QpackStreamSenderDelegate* delegate) {
+    delegate_ = delegate;
+  }
+
  private:
-  QpackStreamSenderDelegate* const delegate_;
+  QpackStreamSenderDelegate* delegate_;
   QpackInstructionEncoder instruction_encoder_;
   QpackInstructionEncoder::Values values_;
 };