Skip to content

HTTP3 Support discussion #174

Description

@nicorobinreal

I want to discuss some approaches to HTTP3, specifically related to negotiating and timing.

As I see it there are three approaches for implementing HTTP3. Each with their own pros and cons

  1. Start with HTTP over TCP and upgrade to QUIC over UDP via Alt-Svc header. The already negotiated key will be transferred over via PSK extension to share the pre negotiated key. This is the way most browsers implement HTTP3 and fits what your library is trying to accomplish. However, it will also leave more traces due to the double fingerprinting taking place (first HTTP2/1.1 and then HTTP3).
  2. A happy eyeballs approach that starts HTTP3 and HTTP2/1.1 in parallel and go with what responds first. This will also cause double fingerprinting.
  3. Start with HTTP3 and wait for a response. If no response fallback to HTTP2/1,1. This will imitate a browser that has cached the result of a Alt-Svc header with HTTP3 support beforehand.

Another (4:th) option is to delegate the strategy of negotiating to the users of the rnet library via configuration. For example a HTTP3 strategy parameter that the user can provide with options like: HTTP3 only, HTTP2 only, HTTP3 browser like, HTTP3 happy eyeballs, HTTP3 with fallback, etc..

Which option do you think is the best?

Activity

  1. 0x676e67 commented on Mar 29, 2025

    @0x676e67
    Owner

    However, this is not a problem. The problem is that rust's h3 is not perfect. And most of the APIs are low level, which is quite a big project to adapt. There is no doubt that this is a difficult task, and it is free of charge.

    It is unlikely to achieve this goal in a short period of time, and before receiving any donations, there will not be much enthusiasm...

  2. Repository owner locked and limited conversation to collaborators on Aug 26, 2025
  3. converted this issue into a discussion #306 on Aug 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions