Een TLS-server (TsgcWebSocketServer, TsgcWebSocketHTTPServer en TsgcHTTPServer met de standaard Indy, IOCP of EPOLL IOHandler) kan ook gewone HTTP- en WebSocket-verbindingen accepteren op dezelfde poort die hij voor TLS gebruikt. Als deze optie is ingeschakeld, bekijkt de server de eerste byte van elke nieuwe verbinding. Een $16-byte (TLS handshake record) betekent dat de client een TLS-handshake start, elke andere byte betekent dat de verbinding als gewone tekst wordt afgehandeld. Als er binnen PlainTextTimeout geen byte binnenkomt, wordt de verbinding als TLS behandeld, wat het eerdere gedrag is. Met de IOCP- en EPOLL-IOHandlers wordt de beslissing genomen op de eerste ontvangen data, zonder te blokkeren, en wordt PlainTextTimeout niet gebruikt.
Het typische gebruik is het migreren van een bestaande gepubliceerde gewone HTTP-poort naar HTTPS zonder de poort te wijzigen die bij de clients is geconfigureerd. Schakel AllowPlainText in terwijl de clients worden bijgewerkt en schakel het weer uit zodra ze allemaal TLS gebruiken.
Boolean, standaard False. Indien True accepteert de TLS-listener ook gewone verbindingen op dezelfde poort.ptpServe (standaard): het gewone verzoek wordt normaal afgehandeld.ptpRedirect: de server antwoordt met 308 Permanent Redirect naar https://<Host><path>, zodat de client de methode en de body behoudt. Als het verzoek geen Host-header heeft, antwoordt de server met 400 Bad Request.ptpReject: de server antwoordt met 400 Bad Request en sluit de verbinding.Integer, milliseconden, standaard 5000. Wachttijd voor de eerste byte van de client voordat de verbinding als TLS wordt behandeld. Het geldt alleen voor de standaard Indy IOHandler.Boolean van de serververbinding (TsgcWSConnectionServer), True als de verbinding TLS gebruikt. De servermethode IsTLS(AContext) geeft dezelfde waarde terug vanuit de TIdContext van een verzoek.De enumeratie TsgcSSLPlainTextPolicy is gedeclareerd in de unit sgcWebSocket_Types.
Start een server op poort 443 die TLS- en gewone verbindingen accepteert en beide afhandelt.
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;
Om te weten of een verzoek TLS gebruikt, roept u de servermethode IsTLS(AContext) aan, bijvoorbeeld in de gebeurtenissen OnCommandGet of OnCommandOther. De eigenschap TLS van de verbinding (TsgcWSConnectionServer) is ook beschikbaar.
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-waarde die binnen OnConnect wordt gelezen is nog niet betrouwbaar. Vanaf het eerste verzoek is ze correct.SecurityOptions) worden alleen op TLS-verbindingen verzonden, nooit op gewone.