Skip to content

QUIC Support for HTTP3 in WebClient #35516

@manonworldrepository

Description

@manonworldrepository

📝 Proposal: Add QUIC (HTTP/3) Support to Spring WebClient

🎯 Motivation

QUIC is the transport protocol behind HTTP/3, offering:

Faster connection setup (0-RTT)

Stream multiplexing without head-of-line blocking

Built-in TLS 1.3 encryption

Better performance on mobile and lossy networks

Spring WebClient currently supports HTTP/1.1 and HTTP/2 via Reactor Netty. Adding QUIC support would future-proof the framework and enable high-performance reactive clients for modern web services.

🔧 Technical Approach

1. Choose a QUIC Implementation

Use Kwik, a 100% Java QUIC library that supports both client and server roles. It’s actively maintained and interoperable with other QUIC stacks.

2. Create a Custom ClientHttpConnector

Spring WebClient uses ClientHttpConnector to abstract the transport. You can implement a new connector:

public class QuicHttpConnector implements ClientHttpConnector {
    // Wrap Kwik's QuicClientConnection and QuicStream
}

3. Handle HTTP/3 Semantics

Use Kwik’s Flupke plugin to support HTTP/3 on top of QUIC. This handles:

Stream negotiation

Request/response framing

ALPN protocol selection

4. Integrate with Reactor

Ensure the connector supports non-blocking I/O and reactive streams:

Wrap Kwik’s input/output streams in Flux and Mono

Use DataBufferFactory for efficient memory handling

5. Configuration Options

Expose QUIC-specific settings:

ALPN protocol ID

0-RTT support

Cipher suite selection

Certificate validation toggle

🧪 Testing Strategy

Use public QUIC endpoints (e.g., Cloudflare, Google) for integration tests

Benchmark against HTTP/2 for latency and throughput

Simulate packet loss and connection migration scenarios

📚 Documentation & Samples

Provide usage examples:

WebClient client = WebClient.builder()
    .clientConnector(new QuicHttpConnector())
    .build(); 

Document limitations (e.g., stream prioritization not yet supported)

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: declinedA suggestion or change that we don't feel we should currently apply

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions