WebSocket и GZIP - страница 2

 

Статья то есть, но код не рабочий и не поддерживается автором. 

 

Эта тема в статье не раскрыта.

 
Ivan Titov #:

Большое спасибо, попробую. Только проблема - получить упакованное сообщение целиком в потоке получаемых данных. Разработчикам MQL5 было бы проще вставить функционал распаковки стандартных упаковщиков в функции Socket<Tls>Read... Есть ли такие планы у разработчиков?

если уж использовать DLL - то вообще всё надо делать на уровне C++ или C#, весь WebSocket, TLS, GZ и всю обработку данных. На уровень MQL должно поступать максимально готовое. В идеале программа MQL даже не должна задумываться какой транспорт у неё внизу (WS или их там два, что вообще-то типично и/или ещё что). 

А делать так что низ WS сделан на MQL, потом часть в DLL, high-level опять на MQL - это плохо..Как минимум отлаживать и сопровождать будет тяжко. Развивать вообще жестоко

 
Stanislav Korotky #:

Насколько я помню, если опция "context takeover" отключена, то каждое отдельное сообщение WebSocket-а сжимается отдельно, а завершение сообщения протокол передает.

Судя по ответу сервера такой опции нет:

HTTP/1.1 101 Switching Protocols
Date: Sun, 18 Feb 2024 07:20:11 GMT
Connection: upgrade
Upgrade: websocket
Sec-WebSocket-Accept: PDXiPRbLGvLsaGvKglpuSlj9s2Q=
CF-Cache-Status: DYNAMIC
Set-Cookie: __cf_bm=vT9Fotf2mLonRGuKa4Vhk2Xj6zYhjL2lSgh15cnSXvw-1708240811-1.0-AXDrAncJmiCXu8QwmuyP6xyHhBRJReqwl2WkAZIyvOIPYGn77k0ZB1zVS3jo3+lBNQihP5ZrEaPXX7oUuvZiMgQ=; path=/; expires=Sun, 18-Feb-24 07:50:11 GMT; domain=.bingx.com; HttpOnly; Secure
Strict-Transport-Security: max-age=15552000; includeSubDomains; preload
X-Content-Type-Options: nosniff
Set-Cookie: _cfuvid=EquHMyQdlEqFPjYq.wwlq_dYn8vPiH.v5_EuNs1IIHM-1708240811547-0.0-604800000; path=/; domain=.bingx.com; HttpOnly; Secure; SameSite=None
Server: cloudflare
CF-RAY: 8574818c89449908-ARN
alt-svc: h3=":443"; ma=86400

На dll переходить проблематично: не хотелось бы ломать базовый класс, который хорошо работает на штатной функции MQL5 SocketTlsReadAvailable() для других API (без GZIP).

Жалко только, что эта функция похоже никак не реагирует на завершение сообщения.

Заметил в ее возврате периодически встречающийся символ с кодом 255. Может это и есть разделитель упакованных сообщений (поддержка биржи BingX молчит по этому поводу)?

 
Ivan Titov #:

Судя по ответу сервера такой опции нет:

Немножко из интернета на английском.

A server must send a server_no_context_takeover parameter in a response only if the client requested the "no context takeover". In essence, the server acknowledges the client's request.

If a server decides to do "no context takeover" for sending on it's own (without the client having requested it), that's fine. In this case, no parameter is sent by the server.

То есть для гарантированного заголовка в ответе сервера нужно в своем клиентском запросе указать, что context takeover нужно отключить. (Я отправлял - не помогло. Дело не в этом.)

Если сервер ничего не говорит, то это не является индикатором включения/выключения данного режима.

 
zhekstr #:
Один из способов - написать обертку на C++ для zlib (библиотека для работы с GZIP) и подключить ее через DLL.

На маркете нельзя публиковать продукты с вызовом DLL. Может все-таки разработчики добавят хотя бы опцию CRYPT_ARCH_GZIP в функцию CryptDecode()?

 
Roman #:

Статья то есть, но код не рабочий и не поддерживается автором. 

Обижаете. Рабочая версия (протестированная мной сейчас) прикреплена ниже.

Файлы:
Zip.zip  17 kb
 
Vasiliy Sokolov #:

Обижаете. Рабочая версия протестированная мной сейчас прикреплена ниже.

Из некосметических изменений увидел отсутствие разделения MQL4/MQL5-кода.

 

Стоит различать форматы хранения данных от алгоритмов сжатия.

Zip - это формат хранения нескольких файлов в одном, наподобии формата TAR. Сами файлы в формате zip обычнно сжимаются алгоритмом сжатия deflate, но могут не сжиматся им вовсе, а просто хранится в этом формате, в таком случае формат позволяет просто объединить несколько файлов в один архив (файл) без сжатия.

GZip это формат хранения сжатых данных алгоритмом deflate в одном файле.

Если Вам выдали GZip - формат zip вам не подойдет. Вам нужно знать формат gzip и распоковать его с помощью системной функции CryptEncode(CRYPT_ARCH_ZIP). Это не сложно сделать самостоятельно, без привлечения сторонних библиотек, так как алгоритм сжатия там один и тот же, deflate (в MQL он имеет не очень удачный идентификатор CRYPT_ARCH_ZIP). Жаль что нет специальной статьи "Работаем с GZip архивом средствами MQL5". В целом, это не задача системной функции, а задача специальной MQL бибилотеки, оборачивающий deflate вокруг формата gzip.

 
fxsaber #:

Из некосметических изменений увидел отсутствие разделения MQL4/MQL5-кода.

Дал MQL5 версию, которая у меня валяется сейчас в каталоге. По Вашему скриншоту выходит что во времена когда писался код были проблемы с функцией ArrayCopy. Их не должно быть сейчас, иначе это явная проблема совместимости.

Update: скомпилил пятую версию приложенного zip в четверке. Скомпилировалось без варнингов и ошибок. Чуть позже попробую создать с ее помощью архив, но на вид она должна работать.

Причина обращения: