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_encoder_stream_sender.h b/quic/core/qpack/qpack_encoder_stream_sender.h
index bf3a79f..3c410d5 100644
--- a/quic/core/qpack/qpack_encoder_stream_sender.h
+++ b/quic/core/qpack/qpack_encoder_stream_sender.h
@@ -17,8 +17,7 @@
 // This class serializes instructions for transmission on the encoder stream.
 class QUIC_EXPORT_PRIVATE QpackEncoderStreamSender {
  public:
-  explicit QpackEncoderStreamSender(QpackStreamSenderDelegate* delegate);
-  QpackEncoderStreamSender() = delete;
+  QpackEncoderStreamSender();
   QpackEncoderStreamSender(const QpackEncoderStreamSender&) = delete;
   QpackEncoderStreamSender& operator=(const QpackEncoderStreamSender&) = delete;
 
@@ -37,8 +36,13 @@
   // 5.2.4. Set Dynamic Table Capacity
   void SendSetDynamicTableCapacity(uint64_t capacity);
 
+  // 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_;
 };