Serwer TLS (TsgcWebSocketServer, TsgcWebSocketHTTPServer i TsgcHTTPServer z domyślnym IOHandlerem Indy, IOCP lub EPOLL) może także przyjmować zwykłe połączenia HTTP i WebSocket na tym samym porcie, którego używa dla TLS. Gdy ta opcja jest włączona, serwer podgląda pierwszy bajt każdego nowego połączenia. Bajt $16 (rekord uzgadniania TLS) oznacza, że klient rozpoczyna uzgadnianie TLS, każdy inny bajt oznacza, że połączenie jest obsługiwane jako zwykły tekst. Jeśli żaden bajt nie nadejdzie w czasie PlainTextTimeout, połączenie jest traktowane jako TLS, czyli tak jak dotychczas. Z IOHandlerami IOCP i EPOLL decyzja jest podejmowana na podstawie pierwszych odebranych danych, bez blokowania, a PlainTextTimeout nie jest używany.
Typowe zastosowanie to migracja istniejącego, opublikowanego portu zwykłego HTTP na HTTPS bez zmiany portu skonfigurowanego u klientów. Włącz AllowPlainText na czas aktualizacji klientów i wyłącz tę opcję, gdy wszyscy będą używać TLS.
Boolean, wartość domyślna False. Gdy ma wartość True, nasłuch TLS przyjmuje także zwykłe połączenia na tym samym porcie.ptpServe (domyślnie): zwykłe żądanie jest obsługiwane normalnie.ptpRedirect: serwer odpowiada 308 Permanent Redirect na adres https://<Host><path>, dzięki czemu klient zachowuje metodę i treść żądania. Jeśli żądanie nie zawiera nagłówka Host, serwer odpowiada 400 Bad Request.ptpReject: serwer odpowiada 400 Bad Request i zamyka połączenie.Integer, milisekundy, wartość domyślna 5000. Czas oczekiwania na pierwszy bajt od klienta, po którym połączenie jest traktowane jako TLS. Dotyczy tylko domyślnego IOHandlera Indy.Boolean połączenia serwera (TsgcWSConnectionServer), ma wartość True, gdy połączenie używa TLS. Metoda serwera IsTLS(AContext) zwraca tę samą wartość na podstawie TIdContext żądania.Typ wyliczeniowy TsgcSSLPlainTextPolicy jest zadeklarowany w jednostce sgcWebSocket_Types.
Uruchom serwer na porcie 443, który przyjmuje połączenia TLS i zwykłe oraz obsługuje oba rodzaje.
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;
Aby sprawdzić, czy żądanie używa TLS, wywołaj metodę serwera IsTLS(AContext), na przykład w zdarzeniach OnCommandGet lub OnCommandOther. Dostępna jest także właściwość TLS połączenia (TsgcWSConnectionServer).
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 odczytana w OnConnect nie jest jeszcze wiarygodna. Od pierwszego żądania jest poprawna.SecurityOptions) są wysyłane tylko w połączeniach TLS, nigdy w zwykłych.