TsgcWebSocketServer | TLS i zwykły HTTP na tym samym porcie

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.

Właściwości

Typ wyliczeniowy TsgcSSLPlainTextPolicy jest zadeklarowany w jednostce sgcWebSocket_Types.

Przykład

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;

Ograniczenia