powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / WebSocket и read
13 сообщений из 13, страница 1 из 1
WebSocket и read
    #38345680
ZitRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, коллеги. Такая вот история.

Уже несколько дней не может решится одна из тормозящих задачу мелочь, на первый взгляд. Суть ее заключается в следующем.

В работе по протоколу WebSocket ( %CSP.WebSocket ), где обмен данными идет меж браузером и сервером, тщетно идут попытки устроить удалённое исполнение кода на сервере. Среди буков исходника за принятие "команды" клиента отвечает нечто такое:
принимаем данные
Код: vbnet
1.
2.
set data = ..Read(,.status) // извлекли данные из пакета
do ..ExecuteCommand(data) // отправили данные на выполнение в свой метод


В методе ExecuteCommand перед непосредственно выполнением устанавливаем флажки T и Q , чтобы вывод (write) с этого произвольного кода летел напрямую к браузеру, и ввод (read) обрывался по терминаторам:
помимо всяких локальных настроекuse $Principal:(::"+T+Q")

xecute CODE // выполняем произвольный код

С выводом все хорошо - сценарий типа for i=0:1:10 { write i hang 0.1 } выполняется как следует. Но если выполнять что-то похожее на read ^a write ^a (клиент отдает данные с терминатором в конце), окажется, что в ^a находится несколько лишних байтов перед непосредственно данными, чего и следовало бы ожидать, т.к. ..Read() класса %CSP.WebSocket делает тот же простой read, но извлекает первые пять символов (тело пакета).

Вопрос стоит в отбрасывании этих "мусорных" байтов прилетевшего пакета, не затрагивая код, ведь он может быть произвольным, или вообще содержать вызов программы с read'ами. Есть несколько идей реализации, но только идей, и они наверняка не совершенны.

Буду благодарен за любой совет, пример, критику, подсказку или способ. Заранее спасибо.
...
Рейтинг: 0 / 0
WebSocket и read
    #38346035
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZitRoчтобы вывод (write) с этого произвольного кода летел напрямую к браузеруТо есть, Вы отдаёте данные в обход рекомендованного ..Write()?
Это не очень хорошо вклинивать свои команды read/write внутри сервера websocket, тем самым увеличивая вероятность нарушения обработки протокола RFC6455.
В новой версии код ..Read()/..Write() существенно дополнен с учётом автоматической конвертации входных/выходных данных в UTF8 и поддержки SharedConnection=1, поэтому могут быть проблемы с совместимостью в будущих версиях.
...
Рейтинг: 0 / 0
WebSocket и read
    #38346319
ZitRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Servit, спасибо за совет.

С COS'ом я работаю совсем недавно, и применимо к задаче меня посещали идеи реализовать что-то наподобие такого:

В теории, мне кажется, это возможно, но попытки его реализовать, а особенно, грамотно, не увенчались успехом - проблемы с коммуникацией между WS server и processor. Может, существуют и более простые пути, о которых я пока не догадываюсь.
...
Рейтинг: 0 / 0
WebSocket и read
    #38346597
ZitRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В двух словах, пишу реализацию web-терминала овер WebSockets. Исполняемый код, поступающий на удалённый сервер абсолютно произвольный . Вышеописанным (в шапке) методом все работает, за исключением разных утилит, использующих read. В xecut'e выполняется чтение всего пакета, а не данных, которые он содержит, вот.
Есть ли способ это поправить - для меня пока загадка, в чем и вопрос.
...
Рейтинг: 0 / 0
WebSocket и read
    #38347530
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZitRoЕсть ли способ это поправить - для меня пока загадка, в чем и вопрос.Не уверен, что такое возможно.
Но попробуйте задать Ваш вопрос в WRC.
...
Рейтинг: 0 / 0
WebSocket и read
    #38347598
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая штука - i/o redirection. М.б., поможет. Прилагаю материал по ней.
...
Рейтинг: 0 / 0
WebSocket и read
    #38347794
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZitRo ,

Приведу пример кода использования i/o redirection, предложенной Alexey Maslov.
Код классаClass demo.test [ Abstract ]
{

/// Публичные точки входа, использующиеся при перенаправлении ввода/вывода
ClassMethod redirects() [ Internal, Private, ProcedureBlock = 0 ]
{
wstr(s) d pStream.Write(s) q
wchr(c) d pStream.Write($c(c)) q
wnl d pStream.Write($c(13,10)) q
wff d pStream.Write($c(12)) q
wtab(s) d pStream.Write($j("",s-$x)) q

rstr(len,timeout) q "test"
rchr(timeout) q "-"

  /*
  // этот код нужно менять под Ваши нужды  
rstr(len,timeout)
  n rd,vr,rt
  s vr="rt"
  s rd=##class(%Device).ReDirectIO($$$NO)
  s:$d(len) vr=vr_"#"_len s:$d(timeout) vr=vr_":"_timeout
  r @vr
  s rd=##class(%Device).ReDirectIO(rd)
  s rd=$zu(96,4,$t)
  q rt
  */
}

/// Перенаправляем вывод с терминала в поток, используя публичные точки входа
ClassMethod Write2Stream(Output pStream As %Stream.Object) [ ProcedureBlock = 0 ]
{
  n io
  
  s pStream=##class(%Stream.TmpBinary).%New()

  s io = $io
  u io::("^"_$zn)
  d ##class(%Device).ReDirectIO($$$YES)
  
  d ..MyPackage()
  
  d ##class(%Device).ReDirectIO($$$NO)
  u io
  
  d pStream.Rewind() ##; идём в начало потока
}

/// наш пакет команд
ClassMethod MyPackage()
{
  s str="1+2"
  w "Привет!",!
  w str,"=",@str,!
  r a w a,!
  r *a w a,!
}

ClassMethod Test()
{
  d ..Write2Stream(.stream)
  
  ##; выводим размер потока и его содержимое
  
  w stream.Size,!,stream.Read()
}

}
Результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
USER>d ##class(demo.test).Test()
25
Привет!
1+2=3
test
-
...
Рейтинг: 0 / 0
WebSocket и read
    #38347795
ZitRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Servit, Alexey Maslov, спасибо большое, по-моему это то, что надо. Завтра будем продолжать, о результатах отпишусь.
...
Рейтинг: 0 / 0
WebSocket и read
    #38348125
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,
Документация по i/o redirectInside io redir handler use idiom S io=$io U 0 Command arg U io. The command is not redirected in this caseпоэтому команды отключения/включения redirect внутри закомментированной rstr() - лишние.
...
Рейтинг: 0 / 0
WebSocket и read
    #38348153
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Maslovпоэтому команды отключения/включения redirect внутри закомментированной rstr() - лишние.В исходниках самой InterSystems они везде во встречающихся rstr временно отключают i/o redirect.
...
Рейтинг: 0 / 0
WebSocket и read
    #38348154
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

мне приходилось использовать i/o redirect, так что знаю, о чём пишу.
...
Рейтинг: 0 / 0
WebSocket и read
    #38349321
ZitRo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отлично, кажись, все получилось, чрезмерно благодарен за помощь! Команды включения/отключения redirect внутри переопределённого r/w таки оказались нужными.
...
Рейтинг: 0 / 0
WebSocket и read
    #38349388
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как видно, это связано с тем, что использовался редирект текущего устройства. У меня была несколько иная схема, в ней внутреннее переключение redirect было не нужно. Могу набросать, если кому-то интересно.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / WebSocket и read
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]