适用于 Delphi 和 C++ Builder 的 HTTP/3 客户端和服务器组件 | eSeGeCe 博客

适用于 Delphi 和 C++ Builder 的 HTTP/3 客户端和服务器组件

· 组件
sgcQUIC HTTP/3 客户端和服务器组件

昨天的文章介绍了 sgcQUIC 中的原始 QUIC 传输。今天我们来看看位于其上层的部分:HTTP/3(RFC 9114)。两个组件 TsgcHTTP3ClientTsgcHTTP3Server 将现代 Web 传输带到 Delphi、C++ Builder 和 .NET。

HTTP/3 保留了你已经从 HTTP/1.1 和 HTTP/2 中熟悉的请求和响应语义,但通过 QUIC 而非 TCP 来运行它们。头部使用 QPACK(RFC 9204)进行压缩,而且由于 QUIC 独立地多路复用各个流,丢失一个数据包不再会阻塞连接上的每个请求。

HTTP/3 客户端

连接到主机,然后调用其中一个谓词方法。Get 以字符串形式返回正文,而包含状态码和头部的完整响应会传递给 OnResponse

uses
  sgcHTTP3_Client;

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

  oClient.Connect('www.example.com', 443);
  vBody := oClient.Get('https://www.example.com/');
end;

procedure TForm1.OnResponse(Sender: TObject; aResponse: TsgcHTTP3Response);
begin
  Memo1.Lines.Add('status ' + IntToStr(aResponse.StatusCode));
  Memo1.Lines.Add(aResponse.GetDataAsString);
end;

每个 HTTP 谓词都可用:GetHeadPostPutDeletePatchOptionsTraceConnectQuery。每个方法都有一个异步对应版本(GetAsyncPostAsync 等),它会立即返回,并通过 OnResponse 报告结果。

QPACK 和 Alt-Svc

QPACK 使用在专用编码器流和解码器流上传输的动态表来压缩请求和响应头部。你可以通过 Settings 对其进行调整:

oClient.Settings.QPACKMaxTableCapacity := 4096;
oClient.Settings.MaxFieldSectionSize   := 65536;

许多服务器仍然通过 HTTP/1.1 或 HTTP/2 应答第一个请求,并在 Alt-Svc 头部(RFC 7838)中通告 HTTP/3。OnAltSvc 事件会呈现该通告,因此客户端可以发现 HTTP/3 端点并在下一个请求时升级。

HTTP/3 服务器

服务器从 QUIC 层继承其 QUIC 侦听器和证书选项,因此其配置方式相同,都是使用一个端口以及一个 PEM 证书和密钥。每个请求都会触发 OnH3Request,你在其中填充响应对象。

uses
  sgcHTTP3_Server;

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 := OnH3Request;
  oServer.Active := True;
end;

procedure TForm1.OnH3Request(Sender: TObject;
  const aConnection: TsgcQUICServerConnection;
  const aRequest: TsgcHTTP3Request; const aResponse: TsgcHTTP3Response);
begin
  aResponse.StatusCode  := 200;
  aResponse.ContentType := 'text/plain';
  aResponse.Data := TEncoding.UTF8.GetBytes('Hello from HTTP/3');
end;

服务器推送、隧道和 WebTransport

这些组件同样实现了更广泛的 HTTP/3 特性集。服务器可以在客户端请求之前,使用 PushPromise 推送一个资源,客户端则通过 OnPushPromise 接收它。扩展 CONNECT(RFC 9220)在 HTTP/3 流上开启隧道,而 WebTransport 则基于相同的机制,为实时应用提供双向流和数据报。

可用性

sgcQUIC 是一个独立的软件包,作为 sgcWebSockets Enterprise 的附加组件授权,它同时包含 QUIC 和 HTTP/3 组件。每个许可证都附带完整的 Pascal 源代码以及一年的更新。这些组件安装在 SGC QUIC 面板上,支持 Delphi 和 C++ Builder 7 到 13,外加一个使用相同 Tsgc 类名的 .NET 移植版本。

下载试用版并在 sgcQUIC 产品页面 阅读完整参考文档。

有问题或反馈?联系我们,你将收到编写这些代码的人的回复。