幾個月來,我一直使用帶有此處提供的 Delphi 10.3 的 IdWebSocketSimpleClient 單元來設定與不和諧網關 API 的 Websocket 連接。現在,我更改為 Delphi 11,相同的代碼顯示了另一種行為。
之前,連接到服務器的組件,向 websocket 連接發起 HTTP 升級,收到 101 - 切換協議回應并開始通信。現在,使用 Delphi 11,我收到 400 - Bad 請求。內部錯誤訊息顯示“普通 HTTP 請求已發送到 HTTPS 埠”。在這兩種情況下,相同的 OpenSSL dll 檔案都位于應用程式可執行檔案夾中,并且使用了 TIdSSLIOHandlerSocketOpenSSL 組件。
在這一點上,我真的很困惑為什么會這樣,因為程式代碼沒有改變。這讓我想知道所涉及的 indy 單位是否有任何行為變化。我什至不知道從哪里開始我的調查。有人可以幫忙嗎?
uj5u.com熱心網友回復:
Delphi 10.3 于 2018 年末發布。2019 年末對該TIdSSLIOHandlerSocketBase類進行了更改,以修復其PassThrough屬性被初始化為False應該被初始化為的錯誤True(現在是當前行為)。
因此,這很容易解釋您所看到的行為,因為錯誤訊息抱怨將不安全的 HTTP 訊息發送到安全的 HTTPS 埠(因為PassThrough很可能True)。
該更改不會影響大多數 Indy 組件,因為它們在內部PassThrough根據需要明確設定(通常基于UseTLS屬性或請求的特定 URL 協議/埠)。但是,更改確實會影響TIdTCPClient直接使用的最終用戶代碼(正如此 WebSocket 代碼所做的那樣)。在這種情況下,用戶(并且一直)負責PassThrough根據需要進行設定,但是這個 WebSocket 代碼并沒有這樣做。連接到安全 URL 時,它假定在呼叫之前已由用戶PassThrough設定為,而不是強制它為. 如果需要自動創建自己的物件,肯定不會被設定為。FalseTIdSimpleWebSocketClient.Connect()FalsePassThroughFalseTIdSimpleWebSocketClientSSLIOHandler
TIdSimpleWebSocketClient.Connect() 應該PassThrough := not lSecure;在呼叫之前在內部設定inherited Connect。我已將此作為錯誤報告給作者:
#10: TIdSimpleWebSocketClient TLS 錯誤 - 400 錯誤請求,純 HTTP 請求被發送到 HTTPS 埠
同時,在作者修復此錯誤之前,您可以簡單地將自己的SSLIOHandler組件分配給TIdSimpleWebSocketClient.IOHandler屬性并在使用URLPassThrough=False呼叫之前將其設定為。TIdSimpleWebSocketClient.Connect()wss:
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/460924.html
上一篇:如何在后臺運行回圈程式?
下一篇:如何使用私有資料模塊與全域實體
