Delphi HTTP/3 客户端 | QUIC 与 WebTransport 组件 | eSeGeCe

Delphi HTTP/3 客户端——面向 Pascal 的 QUIC 与 WebTransport

一套真正可用的 Delphi 和 C++Builder HTTP/3 协议栈:TsgcHTTP3Client 通过 QUIC 发送 RFC 9114 请求,支持 QPACK 头部压缩、Alt-Svc 发现、服务器推送和 Extended CONNECT 隧道。原始 QUIC 传输组件和 WebTransport 会话包含在同一软件包中,还有一个 HTTP/3 服务器补全整个体系。

相同的 HTTP 语义,全新的传输层

HTTP/3(RFC 9114)保留您已熟悉的方法、状态码和头部,并把 TCP 替换为 QUIC:一种内置 TLS 1.3、基于 UDP 的传输。

Delphi HTTP/3 客户端让您的应用程序用上现代 Web 正在迁移到的传输层。QUIC(RFC 9000)将传输握手与 TLS 握手合并为一次往返,消除了传输级队头阻塞(丢失的数据包只会阻塞携带其数据的流),并通过连接 ID 在网络变化中存活,使连接可以跟随设备从 Wi-Fi 切换到移动数据。头部使用 QPACK(RFC 9204)压缩,它是 HTTP/3 中 HPACK 的替代者。

sgcWebSockets 通过 OpenSSL 3.5 的原生 QUIC 支持驱动 QUIC。加载 OpenSSL 库时会自动检测引擎:使用随附的 OpenSSL 3.5 二进制文件即可获得 qmBuiltin 引擎,它支持每个连接多个流,也是这些组件围绕其构建的引擎。另有面向 quictls 风格 OpenSSL 构建的 qmCustom 路径,限制为每个连接单个流。

HTTP/3 客户端

TsgcHTTP3Client:阻塞与异步请求、Alt-Svc、推送、隧道

HTTP/3 服务器

TsgcHTTP3Server:通过 QUIC 提供请求服务,继承自 TsgcQUICServer

原始 QUIC

TsgcQUICClient / TsgcQUICServer:不带 HTTP 语义的 QUIC 流

标准

RFC 9000(QUIC)、RFC 9114(HTTP/3)、RFC 9204(QPACK)、RFC 9220(Extended CONNECT)

HTTP/3 客户端能做什么

十个 HTTP 方法,加上以事件和方法公开的 HTTP/3 专属机制。

全部动词

GET、HEAD、POST、PUT、DELETE、PATCH、OPTIONS、TRACE、CONNECT 以及新的 IETF QUERY 方法,每个都提供阻塞调用,多数还有异步变体。

Alt-Svc 发现

服务器通过 Alt-Svc 头部(RFC 7838)宣告 HTTP/3 可用性。客户端解析该头部并通过 OnAltSvc 呈现,由您的应用程序决定何时切换。

服务器推送

客户端对推送的响应保持掌控:用 SetMaxPushId 宣告上限,通过 OnPushPromise 获得通知,用 CancelPush 拒绝。

Extended CONNECT

RFC 9220 通过请求流隧道另一个协议。当服务器宣告支持时,ExtendedConnect 打开隧道;随后由 TunnelSendOnTunnelData 搬运字节。

WebTransport

通过 Extended CONNECT 协商的会话,把 QUIC 流直接交给应用程序,为低延迟双向流量而生。基于流;随附的 QUIC 引擎不承载数据报。

QPACK 压缩

RFC 9204 头部压缩专为 QUIC 的乱序交付设计,动态表更新通过专用的编码器和解码器流传输。

支持 0-RTT 的握手

QUIC 将传输和 TLS 1.3 合并为一次飞行;新连接一个往返即可完成,恢复的会话可在首个飞行中携带 0-RTT 数据。

连接迁移

QUIC 连接由连接 ID 而非地址四元组标识,因此客户端切换网络后连接依然存活。

多流

在内置引擎上,EnableMultiStreamOpenStream 可在一个连接上放置多个独立的 QUIC 流,这正是 WebTransport 构建的基础。

通过 HTTP/3 发起 GET 请求

连接到主机和端口,然后发出请求。默认端口为 443。

var
  oClient: TsgcHTTP3Client;
  vBody: string;
begin
  oClient := TsgcHTTP3Client.Create(nil);
  oClient.OnResponse := OnResponseHandler;
  oClient.OnAltSvc   := OnAltSvcHandler;

  oClient.Connect('www.example.com', 443);
  vBody := oClient.Get('https://www.example.com/');
  oClient.Disconnect;
end;
TsgcHTTP3Client* oClient = new TsgcHTTP3Client(NULL);
oClient->OnResponse = OnResponseHandler;
oClient->OnAltSvc   = OnAltSvcHandler;

oClient->Connect("www.example.com", 443);
String vBody = oClient->Get("https://www.example.com/");
oClient->Disconnect();
var oClient = new TsgcHTTP3Client();
oClient.OnResponse += OnResponseHandler;
oClient.OnAltSvc   += OnAltSvcHandler;

oClient.Connect("www.example.com", 443);
var vBody = oClient.Get("https://www.example.com/");
oClient.Disconnect();

用 Delphi 实现 HTTP/3 服务器

服务器绑定一个 UDP 端口,加载证书和密钥,并为每个请求触发事件。库的 HTTP 服务器侧同样提供 HTTP/3 支持。

var
  oServer: TsgcHTTP3Server;
begin
  oServer := TsgcHTTP3Server.Create(nil);
  oServer.Port := 443;
  oServer.QUICOptions.SSLOptions.CertFile := 'cert.pem';
  oServer.QUICOptions.SSLOptions.KeyFile  := 'key.pem';
  oServer.OnH3Request := OnH3RequestHandler;
end;

版本与运行时要求

HTTP/3、QUIC 和 WebTransport 为 All-Access 版本独有。这些组件需要基于 Indy 的库核心以及 OpenSSL 3.5 或更高版本,后者提供了组件所依赖的原生 QUIC 支持。

WebTransport 还需要内置的 OpenSSL QUIC 引擎(qmBuiltin),因为一个会话需要在同一 QUIC 连接上使用多个流。服务器组件也只在内置引擎上运行。由于客户端无法假定服务器支持 HTTP/3,请为只宣告 h2 的源站备好 HTTP/2 客户端。Alt-Svc 事件会告诉您 HTTP/3 何时可用。

深入了解

Delphi HTTP/2 客户端与服务器

基于 TCP 的同门组件:多路复用流、HPACK、服务器推送和 WebSocket-over-HTTP/2。

HTTP 组件

完整的 HTTP 家族:HTTP/2、OAuth2、JWT、gRPC、推送服务等。

Delphi 对比指南

sgcWebSockets 与其他 Delphi 网络库的对比,注明来源。

WebSocket 组件

基于 HTTP/3 和 QUIC(RFC 9220)、HTTP/2(RFC 8441)以及 HTTP/1.1(RFC 6455)的 WebSocket。

博客:HTTP QUERY 方法

新的 IETF 动词在 HTTP/1.1、HTTP/2 和 HTTP/3 客户端中的实现,附代码。

版本

sgcWebSockets 各版本包含的内容,从 Standard 到 All-Access。

Best value: All-AccessEvery eSeGeCe product, Premium Support included, from €1,059/year.
See All-Access pricing

立即在 Delphi 中试用 HTTP/3

下载试用版,用 HTTP/3 客户端连接您自己的服务器或任何启用 HTTP/3 的源站。