sgcIndy em cinco minutos

O sgcIndy é uma compilação mantida do Indy, não um fork com nomes novos. Os nomes das units, os nomes das classes e as páginas da paleta de componentes são os que você já usa, então o início rápido não é "escreva este código", é "instale, recompile e depois defina uma propriedade nova".

Mesmos nomes de units e classes do Indy
OpenSSL 1.0, 1.1 e 3.0, com TLS 1.3
Delphi, C++Builder, FreePascal e Lazarus

O fato que molda todo o resto

Não há prefixo sgcId. Nem uma unit, nem uma classe. Seu código existente compila sem alterações.

Nomes de units

Nomes simples do Indy. IdTCPClient, IdHTTP, IdSSLOpenSSL e cerca de quatrocentos outros. Nenhuma unit da biblioteca tem nome com prefixo sgc.

Nomes de classes

Também nomes simples do Indy: TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL, TIdSSHClient, TIdSFTPClient.

Páginas da paleta

As mesmas cinco: Indy Clients, Indy Servers, Indy Intercepts, Indy I/O Handlers e Indy Misc. Cerca de 166 componentes entre elas, nos lugares em que você já procura.

Então o que muda

O instalador troca quais pacotes a IDE carrega e reescreve o caminho de busca. Seu projeto não muda. A diferença visível é uma propriedade nova, SSLOptions.APIVersion, e as correções por baixo.

Requisitos e edições

O sgcIndy não tem níveis de recursos. Os níveis de licença mudam o que vem na caixa, não o que o código pode fazer.

O quê Valor
IDE Do Delphi 7 ao RAD Studio 13, e do C++Builder 2007 ao 13. Acompanham grupos de pacotes para cada um.
Cláusula uses Inalterada. O que o seu projeto já escreve continua funcionando, porque os nomes das units são idênticos aos do Indy padrão.
Versão base do Indy A biblioteca se identifica como Indy 10.6.3.12. As alterações da sgc são marcadas com comentários e defines condicionais dentro das units originais, e não renomeando-as.
Edições Sem níveis de recursos. O flag de edição é injetado em tempo de compilação e tem exatamente dois consumidores, a caixa Sobre e a tela de abertura da IDE. Nada na biblioteca é controlado por ele. O que os níveis realmente mudam é o empacotamento: as compilações Community e Basic trazem binários compilados, com os arquivos .pas e .inc excluídos, enquanto a compilação com código-fonte os inclui.
FreePascal e Lazarus Compatíveis. Acompanha um pacote Lazarus, junto com os stubs de pacote do FreePascal e os arquivos de build, e a escada de compiladores cobre do FPC 2.2.2 ao 3.3.1. Uma ressalva: o modo Delphi é desativado de propósito para o Lazarus, então uma unit que o presume precisará de ajuste.
Plataformas Windows, Linux, macOS, FreeBSD, iOS e Android têm, cada um, seus próprios blocos condicionais. No iOS, o OpenSSL precisa ser vinculado estaticamente.

A coisa mais útil a saber antes de começar: como os nomes das units colidem com o Indy que acompanha o RAD Studio, o instalador cuida da troca para você. Ele cancela o registro dos pacotes de design do Indy embutido, registra os seus e reescreve os caminhos de busca da IDE.

Instale e confirme a troca

O instalador faz o trabalho. O que importa é confirmar que a IDE realmente está carregando o sgcIndy depois.

1. Execute o instalador

Execute o setup baixado e marque as versões do RAD Studio e as plataformas que você quer. Ele copia a biblioteca e, nos pacotes Community e Basic, omite os arquivos de código-fonte.

2. Deixe-o trocar os pacotes

O instalador cancela o registro dos pacotes de design do Indy embutidos na IDE e registra os seus no lugar. É isso que faz os mesmos nomes de units serem resolvidos para o sgcIndy.

3. Deixe-o corrigir o caminho de busca

Ele coloca as pastas do sgcIndy na frente dos caminhos de busca da IDE para cada plataforma e remove entradas obsoletas de uma instalação anterior.

4. Confirme na tela de abertura

Reinicie a IDE. A tela de abertura cita o sgcIndy, e a caixa Sobre do Indy também. Essa é a verificação de que a troca funcionou.

5. Recompile seu projeto

Abra seu projeto Indy existente e recompile. Não toque na cláusula uses. Se ele compilava com o Indy padrão, compila com este.

Recompile e depois alcance o TLS 1.3

A primeira aba é como o seu projeto existente já se parece. A segunda é a linha nova que vale adicionar. A terceira prova que você está no sgcIndy e não no Indy padrão.

FHttpClient.pas
// This is a shipped sgcIndy demo's uses clause.
// Read it twice: there is not one sgc prefix in it.
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
  IdSSLOpenSSL, IdSSLOpenSSLHeaders, StdCtrls;

Seu projeto existente já se parece com isto, e esse é o ponto. Não há sgcIdTCPClient nem TsgcIdSSLIOHandlerSocketOpenSSL, porque nenhuma unit e nenhuma classe da biblioteca tem prefixo sgc. Instale, recompile, pronto.

FHttpClient.pas
procedure TFRMHttpClient.btnGoToClick(Sender: TObject);
var
  oStream: TStringStream;
begin
  // Two separate settings. APIVersion picks which generation of the
  // OpenSSL API to call, Method picks the TLS version. TLS 1.3 needs
  // the 3.0 API, so both lines change together.
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;

  oStream := TStringStream.Create('');
  try
    IdHTTP1.Get(txtURL.Text, oStream);
  finally
    FreeAndNil(oStream);
  end;
end;

TIdSSLAPIVersion tem os membros sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 e sslvAPI_3_0. Nem o tipo nem a propriedade existem no Indy padrão, o que faz deste trecho uma prova em tempo de compilação de qual biblioteca você está usando.

fTcpClient.pas
procedure TfrmTCPClient.btnConnectClick(Sender: TObject);
begin
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.APIVersion := sslvAPI_3_0;
  IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1_3;

  IdTCPClient1.Host := txtHost.Text;
  IdTCPClient1.Port := StrToInt(txtPort.Text);
  IdSSLIOHandlerSocketOpenSSL1.PassThrough := False;

  IdTCPClient1.Connect;
end;

procedure TfrmTCPClient.btnDisconnectClick(Sender: TObject);
begin
  IdTCPClient1.Disconnect;
end;

Mesmos componentes, mesmas propriedades, mesma página da paleta. PassThrough := False é o que transforma o socket simples em um socket TLS, exatamente como no Indy padrão. A leitura é IdTCPClient1.IOHandler.ReadLn e a escrita é IOHandler.Write, sem alterações.

As duas primeiras abas vêm do demo que acompanha o pacote, Demos\HttpClient\FHttpClient.pas, com a caixa de combinação substituída por um literal. Dezoito demos acompanham o pacote no total, incluindo clientes SSH e SFTP, um cliente FTP, clientes de e-mail, um servidor TCP e um par UDP.

Comprove que você está executando o sgcIndy

Como os nomes das units são idênticos, você não consegue saber pelo seu próprio código-fonte. Aqui estão três verificações inequívocas.

A tela de abertura

Reinicie a IDE depois de instalar. A tela de abertura cita o sgcIndy. Essa é a verificação de que a troca de pacotes funcionou, e é a mais rápida.

A caixa Sobre

O diálogo Sobre do Indy informa eSeGeCe em vez do texto padrão e diz Community Edition no pacote gratuito.

Uma linha que não compila com o Indy padrão

SSLOptions.APIVersion := sslvAPI_3_0;. O tipo TIdSSLAPIVersion não existe no Indy padrão, então se essa linha compila, você está no sgcIndy.

Seu próprio projeto

Recompile-o sem tocar na cláusula uses. Ele deve compilar exatamente como antes, porque os nomes das units e das classes são idênticos.

O que costuma dar errado na primeira vez

Seis problemas respondem por quase toda migração.

Você saiu procurando units sgcId

Não existe nenhuma. Zero units e zero classes da biblioteca têm prefixo sgc. Se você reescrever sua cláusula uses para sgcIdTCPClient, o projeto não vai compilar, porque essa unit não existe.

A IDE ainda carrega o Indy padrão

O instalador cuida da troca de pacotes, então isso geralmente significa que a instalação não foi concluída ou que uma entrada manual no caminho de busca está prevalecendo. Confira a tela de abertura, que cita o sgcIndy quando a troca funcionou.

O TLS 1.3 não negocia

Defina as duas propriedades. SSLOptions.APIVersion seleciona qual geração da API do OpenSSL usar, e SSLOptions.Method seleciona a versão do protocolo. O TLS 1.3 precisa da API 3.0, então as duas linhas precisam mudar juntas.

Faltam as DLLs do OpenSSL

Cada pasta de demo traz o conjunto de que precisa ao lado do executável. Para a API 3.0, são libcrypto-3.dll e libssl-3.dll. Para as APIs mais antigas os nomes são diferentes, e copiar o par errado é uma causa comum de um handshake que falha antes de começar.

Uma unit falha no Lazarus

O modo Delphi é desligado de propósito nas compilações do Lazarus nos defines do compilador, com um comentário dizendo que ele falha ali. O código que depende da semântica do modo Delphi precisa de ajuste.

Os arquivos de código-fonte não estão no pacote

Os instaladores Community e Basic trazem binários compilados e excluem os arquivos .pas e .inc. Se você precisa depurar dentro da biblioteca, precisa do pacote que inclui o código-fonte.

O que o sgcIndy acrescenta ao Indy

Quatro coisas que vale conhecer depois que a recompilação terminar.

OpenSSL moderno e TLS 1.3

O Indy padrão 10.6.2 é anterior às mudanças de API do OpenSSL 1.1 e 3.0. SSLOptions.APIVersion seleciona a geração, e sslvTLSv1_3 se torna alcançável na API 3.0.

Recursos do sgcIndy

SSH e SFTP

TIdSSHClient e TIdSFTPClient nem existem no Indy padrão. Acompanham demos para ambos.

Cliente SSH e cliente SFTP

Servidores de alto desempenho

Os handlers de IO IOCP e epoll substituem o modelo de uma thread por conexão no Windows e no Linux, o que muda o formato de um servidor sob carga real.

Como ele se compara

Autenticação moderna para e-mail

O suporte a XOAUTH2 significa que um cliente SMTP ou IMAP pode se autenticar em provedores que aposentaram a autenticação básica.

XOAUTH2 no sgcIndy

Referência, demos e documentação

Dezoito projetos de demo acompanham o download, de um cliente de eco a SSH e SFTP.

Recursos do sgcIndy O que esta compilação corrige e acrescenta ao Indy 10.6.3.
Como ele se compara O sgcIndy contra o Indy padrão, recurso por recurso.
Download O pacote Community é de uso gratuito.
Comprar Os pacotes que incluem o código-fonte completo.
Visão geral do produto O que é o sgcIndy e para quem ele serve.
Todos os produtos Os preços de todas as bibliotecas da eSeGeCe em uma única tabela.

Leitura relacionada: OpenSSL 3.0 com o Indy, o servidor IOCP, o cliente SSH e as notas da versão mais recente. Cada produto tem seu próprio início rápido, listado na página de primeiros passos.

Perguntas sobre o início rápido do sgcIndy

Não, e essa é a coisa mais importante sobre o sgcIndy. Toda unit mantém seu nome original do Indy, IdTCPClient, IdHTTP, IdSSLOpenSSL e as demais, e toda classe mantém seu nome original, TIdTCPClient, TIdHTTP, TIdSSLIOHandlerSocketOpenSSL. Não há nenhuma unit nem classe em toda a biblioteca com prefixo sgc. Instale, recompile e seu projeto está no sgcIndy.
O instalador faz a troca. Ele cancela o registro dos pacotes de design do Indy embutido na IDE, registra os do sgcIndy no lugar e coloca as pastas do sgcIndy na frente dos caminhos de busca. Como os nomes das units são idênticos, é isso que precisa mudar, e não o seu código.
Três verificações. A tela de abertura da IDE cita o sgcIndy na inicialização. A caixa Sobre do Indy também. E há uma prova em tempo de compilação: SSLOptions.APIVersion só existe nesta compilação, então uma linha que atribui sslvAPI_3_0 a ela compila aqui e falha contra o Indy padrão.
Duas propriedades, definidas juntas. SSLOptions.APIVersion := sslvAPI_3_0 seleciona a geração da API 3.0 do OpenSSL, e SSLOptions.Method := sslvTLSv1_3 seleciona o protocolo. O tipo TIdSSLAPIVersion tem os membros sslvAPIDefault, sslvAPI_1_0, sslvAPI_1_1 e sslvAPI_3_0, e TIdSSLVersion ganhou sslvTLSv1_3. Depois distribua libcrypto-3.dll e libssl-3.dll ao lado do seu executável, como fazem os demos.
A biblioteca se identifica como Indy 10.6.3.12. As alterações da sgc são feitas dentro dos arquivos originais, marcadas com comentários e protegidas por defines condicionais, e é exatamente por isso que os nomes das units puderam continuar os mesmos.
Nenhuma, porque nenhum recurso é controlado por edição. O flag de edição é injetado em tempo de compilação e tem apenas dois consumidores em toda a biblioteca, ambos cosméticos: o título da caixa Sobre e o texto da tela de abertura da IDE. O que os níveis realmente mudam é o empacotamento, porque os instaladores Community e Basic trazem binários compilados e excluem os arquivos .pas e .inc, enquanto o pacote com código-fonte os inclui.
Sim. Acompanha um pacote Lazarus, junto com os stubs de pacote do FreePascal e os arquivos de build, e a escada de compiladores cobre do FPC 2.2.2 ao 3.3.1. Há uma ressalva que vale conhecer antes de começar: o modo Delphi é desativado de propósito para o Lazarus nos defines do compilador, com um comentário dizendo que ele falha ali, então uma unit que dependa da semântica do modo Delphi precisará de ajuste.
Windows, Linux, macOS, FreeBSD, iOS e Android têm, cada um, seus próprios blocos condicionais nos defines do compilador. Os destinos Unix usam o OpenSSL e a unit zlib incluída. O iOS é o que tem uma restrição real: o OpenSSL precisa ser vinculado estaticamente ali, em vez de carregado em tempo de execução.
Melhor custo-benefício: All-AccessTodos os produtos da eSeGeCe, com Suporte Premium incluído, a partir de €1,059/ano.
Ver preços do All-Access

Pronto para deixar o Indy padrão?

O pacote Community é gratuito. Instale, recompile e confira a tela de abertura.