TNetHTTPClient потомок Delphi, поддерживающий http2 - PullRequest
0 голосов
/ 08 июня 2019

Я пытаюсь связаться с Google Cloud Speech через gRPC из клиентского приложения Delphi 10.3.1 для Windows. Для этого в качестве протокола должен использоваться протокол http2, а данные должны передаваться в двух направлениях асинхронно.

Delphi включает TNetHTTPClient, который используется TNetHTTPRequest для http-связи. Используя отладчик, я обнаружил, что TWinHTTPClient в System.Net.HttpClient.Win.pas используется для связи внутренне.

Чтобы добавить поддержку http2, я вставил 2 строки в TWinHTTPClient.DoExecuteRequest в System.Net.HttpClient.Win.pas, строка 1360:

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

После добавления вышеуказанного кода компонент использует http2, что я подтвердил, успешно вызвав конечную точку Google Cloud Speech Sync Request через gRPC.

Однако у моего подхода есть два основных недостатка:

  1. Требуется модификация исходного кода Delphi.
  2. Он не поддерживает асинхронную двунаправленную передачу данных, для которой, я думаю, необходимо событие a la OnDataReceived, которое может быть запущено без закрытия соединения.

Я пытался найти точку, где я мог бы заменить TNetHTTPClient на модифицированный компонент TMyNetHTTPClient, но мне это не удалось.

Итак, вопрос: как создать замену TNetHTTPClient, основанную на TWinHTTPClient, которая поддерживает http2 и реализует событие OnDataReceived без закрытия соединения?

...