gpt4 book ai didi

delphi - 单个 TIdHTTPServer 组件可以同时处理 http 和 https 请求吗?

转载 作者:可可西里 更新时间:2023-11-01 15:17:09 25 4
gpt4 key购买 nike

我正在使用 TIdHTTPServer 组件,到目前为止工作正常,但是当我使用此代码添加 SSL 支持时

  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;

服务器只处理 https 请求,如果我发送 http 请求,则会抛出此异常

接受 SSL 连接时出错。错误:1407609C:SSL 例程:SSL23_GET_CLIENT_HELLO:http 请求

问题是:我可以使用单个 TIdHTTPServer 组件来处理 http 和 https 请求吗?如果答案是肯定的,如何做到这一点?如果答案是否定的,我必须创建两个 TIdHTTPServer 实例,一个用于 http,另一个用于 https?

最佳答案

是的,您可以对 HTTP 和 HTTPS 使用单个 TIdHTTPServer

如果您使用的是 Indy 9,那么它有一个错误,所有客户端连接在连接到服务器时默认都将 启用 SSL。要解决此问题,如果连接不在端口 443 上,请使用服务器的 OnConnect 事件手动关闭 off SSL,例如:

procedure TForm1.IdHTTPServer1Connect(AThread: TIdPeerThread);
begin
if AThread.Connection.Socket.Binding.Port <> 443 then
TIdSSLIOHandlerSocket(AThread.Connection.Socket).PassThrough := True;
end;

如果您使用的是 Indy 10,则该错误已修复,因此默认情况下所有客户端连接都将禁用 SSL,因此您可以:

  1. 如果连接在端口 443 上,则使用 OnConnect 事件打开 SSL,例如:

    procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
    begin
    if AContext.Connection.Socket.Binding.Port = 443 then
    TIdSSLIOHandlerSocketBase(AContext.Connection.Socket).PassThrough := False;
    end;
  2. (首选)使用新的 TIdHTTPServer.OnQuerySSLPort 事件告诉服务器哪个端口应该使用 SSL,例如:

    procedure TForm1.IdHTTPServer1QuerySSLPort(APort: TIdPort; var VUseSSL: Boolean);
    begin
    VUseSSL := (APort = 443);
    end;

关于delphi - 单个 TIdHTTPServer 组件可以同时处理 http 和 https 请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17796111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com