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.
Boolean, varsayılan False. True olduğunda TLS dinleyicisi aynı portta düz bağlantıları da kabul eder.ptpServe (varsayılan): düz istek normal şekilde sunulur.ptpRedirect: sunucu https://<Host><path> adresine 308 Permanent Redirect yanıtı verir, böylece istemci yöntemi ve gövdeyi korur. İstekte Host başlığı yoksa sunucu 400 Bad Request yanıtı verir.ptpReject: sunucu 400 Bad Request yanıtı verir ve bağlantıyı kapatır.Integer, milisaniye, varsayılan 5000. Bağlantı TLS olarak değerlendirilmeden önce istemciden gelecek ilk bayt için beklenecek süre. Yalnızca varsayılan Indy IOHandler için geçerlidir.TsgcWSConnectionServer) salt okunur Boolean özelliği, bağlantı TLS kullandığında True olur. IsTLS(AContext) sunucu yöntemi, bir isteğin TIdContext nesnesinden aynı değeri döndürür.TsgcSSLPlainTextPolicy numaralandırması sgcWebSocket_Types biriminde tanımlanmıştır.
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;
TLS değeri henüz güvenilir değildir. İlk istekten itibaren doğrudur.SecurityOptions) yalnızca TLS bağlantılarında gönderilir, düz bağlantılarda asla gönderilmez.