Built-in HTTPS listener only serves HTTP/1.1; request HTTP/2 support

Stalwart’s built-in HTTPS listener currently serves HTTP/1.1 only. I verified this with Stalwart v0.16.16: clients requesting HTTP/2 negotiate HTTP/1.1, and the inbound HTTP handler uses Hyper’s http1::Builder.

This is problematic for browser JMAP clients that use long-lived SSE event streams. Each SSE stream occupies an HTTP/1.1 browser connection slot, so normal JMAP requests can queue behind persistent streams.

HTTP/2 multiplexing would avoid this connection-slot starvation.

Environment

  • Stalwart Mail Server v0.16.16
  • Built-in HTTPS listener on port 443
  • Direct browser JMAP access
  • No reverse proxy

Observed behavior

  • Browser requests to the HTTPS listener negotiate HTTP/1.1 even when HTTP/2 is requested.
  • Long-lived JMAP SSE streams consume browser connection slots.
  • Normal JMAP requests can remain browser-queued for many seconds, despite Stalwart responding in ~30 ms once requests are sent.

Expected behavior
The built-in HTTPS listener should support HTTP/2 via ALPN, or Stalwart should document an officially supported way to enable it without requiring a separate TLS
reverse proxy.

related:

I just setup caddy to support stalwart http/2.

result: AMAZING. The result is night and day. Responses are “instant”.

I suggest that the docs gets a "always use a reverse proxy that supports HTTP/2 until stalwart supports it itself.