Commits
Tarun Sukhani authored 04906c2021f
feat: add HTTP/3 over QUIC inbound support (release 1.12.9)
PF-57 phase 1+2 — opt-in via play.http3.enabled. UDP listener bound
alongside the existing HTTPS TCP listener; ALPN-equivalent negotiation
via Alt-Svc header automatically emitted on every TLS-protected response
when h3 is enabled, so browsers discover the QUIC endpoint after the
first TCP+TLS round-trip. Pairs cleanly with PF-58 for the full TLS-1.3-
over-QUIC + h2 fallback cascade. Disabled by default. Works with both
PEM cert+key and JKS keystore.
Native QUIC libraries bundled for osx-{aarch_64,x86_64}, linux-{aarch_64,
x86_64}, windows-x86_64. Quic.isAvailable() gates Server.start() so
unsupported platforms (e.g. linux-riscv64) get an actionable boot error
rather than a silent UDP bind failure. PF-57 phase 3 (production retry-
token handler) is a separate follow-up; current InsecureQuicTokenHandler
is suitable for dev + non-DDoS-exposed deployments.
Also fixes a latent ClassCastException in PlayHandler.getRemoteIPAddress
that surfaced under HTTP/3: the existing
((InetSocketAddress) ctx.channel().remoteAddress()) cast worked for TCP
because NioSocketChannel returns InetSocketAddress, but QuicStreamChannel
returns a stream-id-wrapper QuicStreamAddress. Resolution walks the
parent channel chain and uses reflection to call remoteSocketAddress()
on QuicheQuicChannel, keeping PlayHandler decoupled from the QUIC
artifacts so non-h3 deployments don't load them.
Adopts proper Ivy classifier syntax in dependencies.yml for the
per-platform native artifacts. The YamlParser already supported this
since the Netty 4 migration; the playCoreDependencies repo URL pattern
gets one tweak ([artifact]-[revision](-[classifier]).jar) to make local
resolution match upstream Maven Central artifact names.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>