TsgcWebSocketServer | TLS ve Aynı Portta Düz HTTP

Bir TLS sunucusu (varsayılan Indy, IOCP veya EPOLL IOHandler ile TsgcWebSocketServer, TsgcWebSocketHTTPServer ve TsgcHTTPServer), TLS için kullandığı aynı portta düz HTTP ve WebSocket bağlantılarını da kabul edebilir. Bu seçenek etkinleştirildiğinde sunucu, her yeni bağlantının ilk baytına bakar. $16 baytı (TLS el sıkışma kaydı) istemcinin bir TLS el sıkışması başlattığı anlamına gelir, diğer her bayt ise bağlantının düz metin olarak sunulacağı anlamına gelir. PlainTextTimeout süresi içinde hiçbir bayt gelmezse bağlantı TLS olarak değerlendirilir, bu da önceki davranıştır. IOCP ve EPOLL IOHandler'larında karar, engellenmeden, alınan ilk veriye göre verilir ve PlainTextTimeout kullanılmaz.

Tipik kullanım, istemcilerde yapılandırılan portu değiştirmeden, yayınlanmış mevcut bir düz HTTP portunu HTTPS'e taşımaktır. İstemciler güncellenirken AllowPlainText seçeneğini etkinleştirin ve hepsi TLS kullanmaya başladığında tekrar kapatın.

Özellikler

TsgcSSLPlainTextPolicy numaralandırması sgcWebSocket_Types biriminde tanımlanmıştır.

Örnek

443 portunda hem TLS hem de düz bağlantıları kabul eden ve ikisini de sunan bir sunucu başlatın.


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.Port := 443;
oServer.SSLOptions.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.KeyFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.RootCertFile := 'c:\certificates\mycert.pem';
oServer.SSLOptions.AllowPlainText := True;
oServer.SSLOptions.PlainTextPolicy := ptpServe;
oServer.Active := True;

Bir isteğin TLS kullanıp kullanmadığını öğrenmek için, örneğin OnCommandGet veya OnCommandOther olaylarında, IsTLS(AContext) sunucu yöntemini çağırın. Bağlantının (TsgcWSConnectionServer) TLS özelliği de kullanılabilir.


procedure OnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  if TsgcWebSocketHTTPServer1.IsTLS(AContext) then
    AResponseInfo.ContentText := 'Secure connection'
  else
    AResponseInfo.ContentText := 'Plain connection, please use https://';
end;

Sınırlamalar