I'm using a TIdHTTPServer component, so far is working fine, but when I added SSL support using this code
  SSLHandler:= TIdServerIOHandlerSSLOpenSSL.Create(nil);
  SSLHandler.SSLOptions.CertFile := 'foo.pem';
  SSLHandler.SSLOptions.KeyFile := 'foo.pem';
  SSLHandler.SSLOptions.RootCertFile := 'foo.pem';
  SSLHandler.SSLOptions.Method := sslvSSLv23;
  SSLHandler.SSLOptions.Mode := sslmServer;
  SSLHandler.SSLOptions.VerifyDepth := 1;
  SSLHandler.SSLOptions.VerifyMode := [sslvrfPeer,sslvrfFailIfNoPeerCert,sslvrfClientOnce];
  idHttpServer1.IOHandler := SSLHandler;
  IdHTTPServer1.Bindings.Add.Port := 80;  
  IdHTTPServer1.Bindings.Add.Port := 443;       
  IdHTTPServer1.Active := True;
The server only process https requests and if I send a http request this exception is thrown
Error accepting connection with SSL. error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request
The question is : I can use a single TIdHTTPServer component to process the http and https requests? if the answer is Yes how this can be done? If the answer is No, I must create two TIdHTTPServer instances one for http and another for https?
Yes, you can use a single TIdHTTPServer for both HTTP and HTTPS.
If you are using Indy 9, then it has a bug where all client connections will have SSL enabled by default when they connect to the server.  To work around that, use the server's OnConnect event to manually turn off SSL if the connection is not on port 443, eg:
procedure TForm1.IdHTTPServer1Connect(AThread: TIdPeerThread);
begin
  if AThread.Connection.Socket.Binding.Port <> 443 then
    TIdSSLIOHandlerSocket(AThread.Connection.Socket).PassThrough := True;
end;
If you are using Indy 10, then that bug was fixed, so all client connections will have SSL disabled by default, so you can either:
use the OnConnect event to turn on SSL if the connection is on port 443, eg:
procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
begin
  if AContext.Connection.Socket.Binding.Port = 443 then
    TIdSSLIOHandlerSocketBase(AContext.Connection.Socket).PassThrough := False;
end;
(preferred) use the new TIdHTTPServer.OnQuerySSLPort event to tell the server which port should use SSL or not, eg:
procedure TForm1.IdHTTPServer1QuerySSLPort(APort: TIdPort; var VUseSSL: Boolean);
begin
  VUseSSL := (APort = 443);
end;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With