Delphi xe 10.4 webSocket пишет Connection closed by gracefully
Использую для теста компонент: https://github.com/arvanus/Indy/blob/WebSocketImpl/Lib/Core/IdWebSocketSimpleClient.pas
При подключении пишет ошибку Connection closed by Gracefully. Хотя в целом тестировал подключение здесь https://www.xhcode.com/websocket/ и здесь https://www.piesocket.com/websocket-tester, все без проблем
Соединяюсь с wss://gateway.discord.gg
Менял UserAgent и заголовки, не помогает
Подскажите в чем может быть проблема или же подскажите иные компоненты
uses
IdWebSocketSimpleClient;
procedure Tform1.lSWC1DataEvent(Sender: TObject; const Text: string);
begin
smemo1.Lines.Add(text);
end;
procedure TForm1.sButton1Click(Sender: TObject);
var
lSWC: TIdSimpleWebSocketClient;
begin
try
lSWC := TIdSimpleWebSocketClient.Create(self);
lSWC.onDataEvent := lSWC1DataEvent;
lSWC.AutoCreateHandler := false; //you can set this as true in the majority of Websockets with ssl
if not lSWC.AutoCreateHandler then
begin
if lSWC.IOHandler = nil then
lSWC.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(lSWC);
(lSWC.IOHandler as TIdSSLIOHandlerSocketOpenSSL).SSLOptions.Mode := TIdSSLMode.sslmClient;
(lSWC.IOHandler as TIdSSLIOHandlerSocketOpenSSL).SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
end;
lSWC.Connect('wss://gateway.discord.gg');
finally
freeandnil(lSWC);
end;
end;
Заголовки сейчас стоят такие:
self.Socket.WriteLn(format('GET %s HTTP/1.1', [URI.path + URI.Document]));
self.Socket.WriteLn(format('Host: %s', [URI.Host]));
self.Socket.WriteLn('User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4721.209 Safari/537.36');
self.Socket.WriteLn('Connection: Upgrade');
self.Socket.WriteLn('Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits');
self.Socket.WriteLn('Upgrade: WebSocket');
self.Socket.WriteLn('Sec-WebSocket-Version: 13');
self.Socket.WriteLn(format('Sec-WebSocket-Key: %s', [generateWebSocketKey()]));
self.Socket.WriteLn('');
В снифере получаю это:
Host: gateway.discord.gg
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4721.209 Safari/537.36
Connection: Upgrade
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Upgrade: WebSocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: huxJmxdLhlbX1YXBNTohUA==
В ответе получаю это:
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>cloudflare</center>
</body>
</html>
Ответы (2 шт):
Автор решения: KPOC
→ Ссылка
Решил проблему, ответ нашел тут: https://github.com/IndySockets/Indy/issues/201#issuecomment-894709701
Автор решения: usercss8
→ Ссылка
(lSWC.IOHandler as TIdSSLIOHandlerSocketOpenSSL).PassThrough := False;