From 77c08ed33228da24b4c76deaa20f9a1f3a27a0ff Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 7 May 2026 00:27:15 +0000 Subject: [PATCH] fix(quic): restore QuicVersion + ctor params lost in qlog merge Same merge-from-main shape as the prior agent A integration: the qlog agent's worktree didn't carry the version-negotiation work (QuicVersion import, currentVersion / vnConsumed fields, applyVersionNegotiation), the Retry work (extraSecretsListener / cipherSuites / applyRetry), or the version-negotiation testcase wiring. Merge with -X theirs took the qlog version of QuicConnection.kt + QuicConnectionWriter.kt + the existing InteropRunner.kt wholesale, dropping those. Restored: - QuicVersion import in QuicConnection.kt + QuicConnectionWriter.kt + the test-side InteropRunner.kt (also touched by agent B's qlog hooks). - extraSecretsListener / cipherSuites / initialVersion ctor params on QuicConnection (qlogObserver kept; new qlog work landed). Net result: all three overnight agents (A versionnegotiation, B qlog observer, C peer-uni-stream drainer) now coexist on the branch with no references missing. Full :quic:jvmTest green; :quic-interop:test + installDist green. https://claude.ai/code/session_01HcvfQq1ttPV9PkRoJb4nyT --- .../quic/connection/QuicConnection.kt | 25 +++++++++++++++++++ .../quic/connection/QuicConnectionParser.kt | 2 +- .../quic/connection/QuicConnectionWriter.kt | 1 + .../quic/interop/InteropRunner.kt | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnection.kt b/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnection.kt index 7b6b17d67..2056c7779 100644 --- a/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnection.kt +++ b/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnection.kt @@ -25,6 +25,7 @@ import com.vitorpamplona.quic.crypto.InitialSecrets import com.vitorpamplona.quic.crypto.PlatformAesOneBlock import com.vitorpamplona.quic.crypto.bestAes128GcmAead import com.vitorpamplona.quic.observability.QlogObserver +import com.vitorpamplona.quic.packet.QuicVersion import com.vitorpamplona.quic.stream.QuicStream import com.vitorpamplona.quic.stream.StreamId import com.vitorpamplona.quic.tls.TlsClient @@ -74,6 +75,30 @@ class QuicConnection( .toEpochMilliseconds() }, val alpnList: List = listOf(TlsConstants.ALPN_H3), + /** + * Optional second listener invoked after the connection's own + * key-installation listener. Used by the interop runner endpoint to + * dump SSLKEYLOG lines so Wireshark can decrypt captured pcaps. + * Default `null` keeps production callers unaffected. + */ + val extraSecretsListener: TlsSecretsListener? = null, + /** + * TLS cipher suites to offer in the ClientHello. Override to e.g. + * `intArrayOf(TlsConstants.CIPHER_TLS_CHACHA20_POLY1305_SHA256)` for the + * `chacha20` interop testcase. Default matches [TlsClient]'s default. + */ + val cipherSuites: IntArray = + intArrayOf( + TlsConstants.CIPHER_TLS_AES_128_GCM_SHA256, + TlsConstants.CIPHER_TLS_CHACHA20_POLY1305_SHA256, + ), + /** + * Version this connection puts in the FIRST Initial it sends. Defaults + * to [QuicVersion.V1]; the interop runner sets it to + * [QuicVersion.FORCE_VERSION_NEGOTIATION] for the `versionnegotiation` + * testcase, which drives the client through the RFC 9000 ยง6 VN flow. + */ + val initialVersion: Int = QuicVersion.V1, /** * Optional qlog observer (draft-marx-qlog). Production callers * leave this at [QlogObserver.NoOp] (zero overhead). Interop / diff --git a/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionParser.kt b/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionParser.kt index ca41d3046..cfb3e315d 100644 --- a/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionParser.kt +++ b/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionParser.kt @@ -22,7 +22,6 @@ package com.vitorpamplona.quic.connection import com.vitorpamplona.quic.QuicCodecException import com.vitorpamplona.quic.connection.recovery.drainAckedSentPackets -import com.vitorpamplona.quic.packet.RetryPacket import com.vitorpamplona.quic.frame.AckFrame import com.vitorpamplona.quic.frame.ConnectionCloseFrame import com.vitorpamplona.quic.frame.CryptoFrame @@ -42,6 +41,7 @@ import com.vitorpamplona.quic.observability.qlogFrameName import com.vitorpamplona.quic.packet.LongHeaderPacket import com.vitorpamplona.quic.packet.LongHeaderType import com.vitorpamplona.quic.packet.QuicVersion +import com.vitorpamplona.quic.packet.RetryPacket import com.vitorpamplona.quic.packet.ShortHeaderPacket import com.vitorpamplona.quic.stream.StreamId import com.vitorpamplona.quic.tls.TlsClient diff --git a/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionWriter.kt b/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionWriter.kt index 8a77edf3c..675167144 100644 --- a/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionWriter.kt +++ b/quic/src/commonMain/kotlin/com/vitorpamplona/quic/connection/QuicConnectionWriter.kt @@ -42,6 +42,7 @@ import com.vitorpamplona.quic.observability.qlogFrameName import com.vitorpamplona.quic.packet.LongHeaderPacket import com.vitorpamplona.quic.packet.LongHeaderPlaintextPacket import com.vitorpamplona.quic.packet.LongHeaderType +import com.vitorpamplona.quic.packet.QuicVersion import com.vitorpamplona.quic.packet.ShortHeaderPacket import com.vitorpamplona.quic.packet.ShortHeaderPlaintextPacket diff --git a/quic/src/jvmTest/kotlin/com/vitorpamplona/quic/interop/InteropRunner.kt b/quic/src/jvmTest/kotlin/com/vitorpamplona/quic/interop/InteropRunner.kt index 9a40f2a29..33f308471 100644 --- a/quic/src/jvmTest/kotlin/com/vitorpamplona/quic/interop/InteropRunner.kt +++ b/quic/src/jvmTest/kotlin/com/vitorpamplona/quic/interop/InteropRunner.kt @@ -24,6 +24,7 @@ import com.vitorpamplona.quic.connection.QuicConnection import com.vitorpamplona.quic.connection.QuicConnectionConfig import com.vitorpamplona.quic.connection.QuicConnectionDriver import com.vitorpamplona.quic.observability.QlogObserver +import com.vitorpamplona.quic.packet.QuicVersion import com.vitorpamplona.quic.tls.PermissiveCertificateValidator import com.vitorpamplona.quic.transport.UdpSocket import kotlinx.coroutines.CoroutineScope