Использование GitHub API из Indy в Delphi - PullRequest
5 голосов
/ 04 июня 2019

Я работаю над проектом в Delphi 10.1 Berlin, который интегрируется с GitHub. Этот проект предназначен для загрузки репозиториев через ZIP-файлы. Однако я столкнулся с некоторыми проблемами.

Изначально я решил (как всегда) использовать Indy для интеграции с GitHub API. Я всегда использовал Indy для всего потребления веб-API. Однако я не пользуюсь им с GitHub.

API требует HTTPS. Я получил последние библиотеки OpenSSL для использования с Indy и использую библиотеку Indy с Delphi 10.1 Berlin.

Я настроил компонент TIdHTTP с прикрепленным TIdSSLIOHandlerSocketOpenSSL. Я установил этот обработчик ввода-вывода на все доступные опции Method, и ни один из них не дает мне правильного ответа. Я получаю один из двух разных ответов ...

  1. При использовании sslvSSLv3 я получаю: error:14094410:SSL routines: SSL3_READ_BYTES:sslv3 alert handshake failure.
  2. При использовании sslvTLSv1_2 я получаю: error:1409442E:SSL routines:SSL_READ_BYTES:tlsv1 alert protocol version

На данный момент мне пришлось прибегнуть к TRESTClient, чтобы иметь возможность работать с API. Но он не обрабатывает двоичный файл должным образом.

Тест так же прост, как https://api.github.com. Я могу позвонить в Chrome и Postman и получить ответ. Только не через Инди.

Как мне установить соединение с API GitHub через библиотеку Delphi Indy?

1 Ответ

7 голосов
/ 04 июня 2019

Этот подкласс Indy HTTP работает с GitHub API.

type
  TIndyHttpTransport = class(TIdCustomHTTP)
  public
    constructor Create;
  end;

implementation

uses
  IdSSLOpenSSL;

{ TIndyHttpTransport }

constructor TIndyHttpTransport.Create;
var
  SSLIO: TIdSSLIOHandlerSocketOpenSSL;
begin
  inherited Create;

  HTTPOptions := HTTPOptions + [hoNoProtocolErrorException, hoWantProtocolErrorContent];

  SSLIO := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
  SSLIO.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
  SSLIO.SSLOptions.Mode        := sslmClient;
  SSLIO.SSLOptions.VerifyMode  := [];
  SSLIO.SSLOptions.VerifyDepth := 0;

  Self.IOHandler := SSLIO;

  // Request.UserAgent := 'my useragent string';

end;

Возможно, вашему коду также нужно изменить строку пользовательского агента (потому что я использую этот код с различными поставщиками услуг, а не только с GitHub. Некоторые из них требуют измененной строки пользовательского агента вместо значения по умолчанию).

Источник: https://github.com/michaelJustin/daraja-framework/blob/master/demo/common/IndyHttpTransport.pas

...