Я пытаюсь связаться с 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.
Однако у моего подхода есть два основных недостатка:
- Требуется модификация исходного кода Delphi.
- Он не поддерживает асинхронную двунаправленную передачу данных, для которой, я думаю, необходимо событие a la OnDataReceived, которое может быть запущено без закрытия соединения.
Я пытался найти точку, где я мог бы заменить TNetHTTPClient на модифицированный компонент TMyNetHTTPClient, но мне это не удалось.
Итак, вопрос: как создать замену TNetHTTPClient, основанную на TWinHTTPClient, которая поддерживает http2 и реализует событие OnDataReceived без закрытия соединения?