Delphi的TNetHTTPClient后代支持http2

时间:2019-06-08 11:03:26

标签: delphi grpc http2

我正在尝试从Delphi 10.3.1 Windows客户端应用程序通过gRPC与Google Cloud Speech通信。为此,通信需要使用http2作为协议,并且数据需要双向异步传输。

Delphi包含TNetHTTPClient,由TNetHTTPRequest用于HTTP通信。使用调试器,我发现System.Net.HttpClient.Win.pas中的TWinHTTPClient在内部用于通信。

要添加http2支持,我在System.Net.HttpClient.Win.pas的TWinHTTPClient.DoExecuteRequest中的第1360行插入了两行:

    LOptionValue := 1;//WINHTTP_PROTOCOL_FLAG_HTTP2;
    WinHttpSetOption(LRequest.FWRequest, WINHTTP_OPTION_ENABLE_HTTP_PROTOCOL, @LOptionValue, sizeof(LOptionValue));

添加上述代码后,该组件使用的是http2,我已通过gRPC成功调用Google Cloud Speech Sync Request端点进行了验证。

但是,我的方法有两个主要缺点:

  1. 它需要修改Delphi源代码。
  2. 它不支持数据的异步双向传输,对此,我认为有必要在不关闭连接的情况下触发一个OnDataReceived事件。

我试图找到一个可以用修改后的组件TMyNetHTTPClient替换TNetHTTPClient的地方,但是我没有成功。

因此,问题是:如何在不关闭连接的情况下基于TWinHTTPClient创建支持http2并实现OnDataReceived事件的TNetHTTPClient替代项?

1 个答案:

答案 0 :(得分:0)

它不是基于TNetHTTPClient,但是grijjy已经为Windows和Linux开放了HTTP2 Delphi客户端的源代码。

您可以在这里找到它-https://github.com/grijjy/DelphiScalableClientSockets