2013-07-22 28 views
5

मैं एक TIdHTTPServer घटक उपयोग कर रहा हूँ, अब तक ठीक काम कर रहा है, लेकिन इस कोडक्या एक ही TIdHTTPServer घटक एक ही समय में http और https अनुरोध संभाल सकता है?

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 अनुरोध भेजने के इस अपवाद

फेंक दिया जाता है

Error accepting connection with SSL. error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request

सवाल यह है: मैं http और https अनुरोधों को संसाधित करने के लिए एक एकल TIdHTTPServer घटक का उपयोग कर सकते हैं? अगर जवाब हां है तो यह कैसे किया जा सकता है? अगर उत्तर नहीं है, तो मुझे http के लिए दो टीआईडीएचटीपीएससेवर इंस्टेंस एक और https के लिए दूसरा बनाना होगा?

उत्तर

6

हां, आप HTTP और HTTPS दोनों के लिए एक एकल TIdHTTPServer का उपयोग कर सकते हैं।

यदि आप इंडी 9 का उपयोग कर रहे हैं, तो इसमें एक बग है जहां सभी क्लाइंट कनेक्शनों में एसएसएल सक्षम होगा डिफ़ॉल्ट रूप से सर्वर से कनेक्ट होने पर। कि हल करने के लिए मैन्युअल रूप से एसएसएल बंद चालू करने के लिए सर्वर के OnConnect घटना का उपयोग करता है, तो कनेक्शन, 443 पोर्ट पर नहीं है जैसे,:,

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

आप इंडी 10 का उपयोग कर रहे हैं तो यह उस बग तय किया गया था, इसलिए सभी ग्राहक कनेक्शन एसएसएल विकलांग डिफ़ॉल्ट रूप से होगा, तो आप या तो:

  1. एसएसएल पर चालू करने के लिए करता है, तो कनेक्शन पोर्ट 443, जैसे पर है OnConnect घटना का उपयोग करें:

    procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext); 
    begin 
        if AContext.Connection.Socket.Binding.Port = 443 then 
        TIdSSLIOHandlerSocketBase(AContext.Connection.Socket).PassThrough := False; 
    end; 
    
  2. (पसंदीदा) नई TIdHTTPServer.OnQuerySSLPort घटना का उपयोग सर्वर बताने के लिए जो बंदरगाह एसएसएल या नहीं, जैसे उपयोग करना चाहिए:

    procedure TForm1.IdHTTPServer1QuerySSLPort(APort: TIdPort; var VUseSSL: Boolean); 
    begin 
        VUseSSL := (APort = 443); 
    end; 
    
संबंधित मुद्दे