|
WebSocket и read
|
|||
---|---|---|---|
#18+
Здравствуйте, коллеги. Такая вот история. Уже несколько дней не может решится одна из тормозящих задачу мелочь, на первый взгляд. Суть ее заключается в следующем. В работе по протоколу WebSocket ( %CSP.WebSocket ), где обмен данными идет меж браузером и сервером, тщетно идут попытки устроить удалённое исполнение кода на сервере. Среди буков исходника за принятие "команды" клиента отвечает нечто такое: принимаем данные Код: vbnet 1. 2.
В методе 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'ами. Есть несколько идей реализации, но только идей, и они наверняка не совершенны. Буду благодарен за любой совет, пример, критику, подсказку или способ. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2013, 17:05 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
ZitRoчтобы вывод (write) с этого произвольного кода летел напрямую к браузеруТо есть, Вы отдаёте данные в обход рекомендованного ..Write()? Это не очень хорошо вклинивать свои команды read/write внутри сервера websocket, тем самым увеличивая вероятность нарушения обработки протокола RFC6455. В новой версии код ..Read()/..Write() существенно дополнен с учётом автоматической конвертации входных/выходных данных в UTF8 и поддержки SharedConnection=1, поэтому могут быть проблемы с совместимостью в будущих версиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2013, 20:21 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
Servit, спасибо за совет. С COS'ом я работаю совсем недавно, и применимо к задаче меня посещали идеи реализовать что-то наподобие такого: В теории, мне кажется, это возможно, но попытки его реализовать, а особенно, грамотно, не увенчались успехом - проблемы с коммуникацией между WS server и processor. Может, существуют и более простые пути, о которых я пока не догадываюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2013, 14:25 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
В двух словах, пишу реализацию web-терминала овер WebSockets. Исполняемый код, поступающий на удалённый сервер абсолютно произвольный . Вышеописанным (в шапке) методом все работает, за исключением разных утилит, использующих read. В xecut'e выполняется чтение всего пакета, а не данных, которые он содержит, вот. Есть ли способ это поправить - для меня пока загадка, в чем и вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2013, 14:01 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
ZitRoЕсть ли способ это поправить - для меня пока загадка, в чем и вопрос.Не уверен, что такое возможно. Но попробуйте задать Ваш вопрос в WRC. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 15:59 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
Есть такая штука - i/o redirection. М.б., поможет. Прилагаю материал по ней. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 16:43 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 19:00 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
Servit, Alexey Maslov, спасибо большое, по-моему это то, что надо. Завтра будем продолжать, о результатах отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2013, 19:00 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
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() - лишние. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 09:08 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
Alexey Maslovпоэтому команды отключения/включения redirect внутри закомментированной rstr() - лишние.В исходниках самой InterSystems они везде во встречающихся rstr временно отключают i/o redirect. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 09:32 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
servit, мне приходилось использовать i/o redirect, так что знаю, о чём пишу. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 09:34 |
|
WebSocket и read
|
|||
---|---|---|---|
#18+
Отлично, кажись, все получилось, чрезмерно благодарен за помощь! Команды включения/отключения redirect внутри переопределённого r/w таки оказались нужными. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2013, 18:54 |
|
|
start [/forum/topic.php?fid=39&msg=38347530&tid=1557090]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
4ms |
track hit: |
150ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 256ms |
0 / 0 |