Un server TLS (TsgcWebSocketServer, TsgcWebSocketHTTPServer e TsgcHTTPServer con l'IOHandler Indy predefinito, IOCP o EPOLL) può accettare anche connessioni HTTP e WebSocket in chiaro sulla stessa porta che usa per TLS. Quando questa opzione è abilitata, il server legge in anteprima il primo byte di ogni nuova connessione. Un byte $16 (record di handshake TLS) indica che il client avvia un handshake TLS, qualsiasi altro byte indica che la connessione viene servita in chiaro. Se non arriva nessun byte entro PlainTextTimeout, la connessione viene trattata come TLS, che è il comportamento precedente. Con gli IOHandler IOCP ed EPOLL la decisione viene presa sul primo dato ricevuto, senza bloccare, e PlainTextTimeout non viene usato.
L'uso tipico è la migrazione a HTTPS di una porta HTTP in chiaro già pubblicata, senza cambiare la porta configurata sui client. Abilitare AllowPlainText mentre i client vengono aggiornati e disabilitarlo di nuovo quando tutti usano TLS.
Boolean, valore predefinito False. Quando è True, il listener TLS accetta anche connessioni in chiaro sulla stessa porta.ptpServe (predefinito): la richiesta in chiaro viene servita normalmente.ptpRedirect: il server risponde 308 Permanent Redirect a https://<Host><path>, in modo che il client mantenga il metodo e il corpo. Se la richiesta non ha l'header Host, il server risponde 400 Bad Request.ptpReject: il server risponde 400 Bad Request e chiude la connessione.Integer, millisecondi, valore predefinito 5000. Tempo di attesa del primo byte del client prima che la connessione venga trattata come TLS. Si applica solo all'IOHandler Indy predefinito.Boolean di sola lettura della connessione del server (TsgcWSConnectionServer), True quando la connessione usa TLS. Il metodo del server IsTLS(AContext) restituisce lo stesso valore a partire dal TIdContext di una richiesta.L'enumerazione TsgcSSLPlainTextPolicy è dichiarata nell'unit sgcWebSocket_Types.
Avviare un server sulla porta 443 che accetta connessioni TLS e in chiaro e serve entrambe.
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;
Per sapere se una richiesta usa TLS, chiamare il metodo del server IsTLS(AContext), ad esempio negli eventi OnCommandGet o OnCommandOther. È disponibile anche la proprietà TLS della connessione (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 letto dentro OnConnect non è ancora affidabile. Dalla prima richiesta in poi è corretto.SecurityOptions) vengono inviati solo sulle connessioni TLS, mai su quelle in chiaro.