The errors related to [dict] have been fixed, adding the following lines within websocket-procs.tcl
… nsf::proc ::ws::client::open {url} { ... line 437 if {[dict exists $d path] ne ""} { set path [dict get $d path] append request_url /$path } if {[dict exists $d tail] ne ""} { set tail [dict get $d tail] append request_url /$tail } Even though, I still see no reason your code would break, because the wss sample does return “path”. The case of failure is when the websocket doesn’t return neither path nor tail. >> The websocket sample is "wss://javascript.info/article/websocket/demo/hello >> <wss://javascript.info/article/websocket/demo/hello>" [12/Jul/2020:21:44:37][23102.7efbf356f700][-conn:iurix:1:92-] Notice: D proto wss host javascript.info path article/websocket/demo tail hello Now, I’ve hit another situation. That error seems more serious. :) 12/Jul/2020:21:44:37][23102.7efbf356f700][-conn:iurix:1:92-] Notice: Running TCL script luna.tcl [12/Jul/2020:21:44:37][23102.7efbf356f700][-conn:iurix:1:92-] Notice: D proto wss host javascript.info path article/websocket/demo tail hello [12/Jul/2020:21:44:37][23102.7efbf356f700][-conn:iurix:1:92-] Notice: SockConnect: target host <javascript.info> has associated multiple IP addresses <104.26.12.17 104.26.13.17 172.67.74.41> [12/Jul/2020:21:44:37][23102.7efbf356f700][-conn:iurix:1:92-] Notice: async connect to 104.26.12.17 on sock 27 returned EINPROGRESS [12/Jul/2020:21:44:37][23102.7efbf356f700][-conn:iurix:1:92-] Error: ssl connect failed: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure while executing "ns_connchan open -headers $headers -version 1.1 $request_url" (procedure "ws::client::open" line 30) invoked from within "ws::client::open $url" ("uplevel" body line 8) invoked from within "uplevel { (procedure "code::tcl::/var/www/iurix//packages/ix-websocket/www/ws-sample" line 2) invoked from within "code::tcl::$__adp_stub" ("uplevel" body line 12) invoked from within "uplevel { if { [file exists $__adp_stub.tcl] } { # ensure that data source preparation procedure exists and is up-to-date ..." (procedure "adp_prepare" line 2) invoked from within "adp_prepare" invoked from within "template::adp_parse $themed_template {}" (procedure "adp_parse_ad_conn_file" line 14) invoked from within "$handler" ("uplevel" body line 2) invoked from within "uplevel $code" invoked from within "ad_try { $handler } ad_script_abort val { # do nothing }" invoked from within "rp_serve_concrete_file [ad_conn file]" > On Dhuʻl-Q. 21, 1441 AH, at 21:14, Iuri de Araujo Sampaio <i...@iurix.com> > wrote: > > … I've hit “send” button by mistake…. > > Hi Gustaf > I’ve noticed you had uploaded a simple client interface to > websocket-procs.tcl. > https://bitbucket.org/naviserver/websocket/src/master/websocket-procs.tcl > <https://bitbucket.org/naviserver/websocket/src/master/websocket-procs.tcl> > > However, I hit another error related to [dict], because the url doesn’t > return a path, when [dict get $d path] runs. > > The websocket sample is "wss://javascript.info/article/websocket/demo/hello > <wss://javascript.info/article/websocket/demo/hello>”,which returns the > following content > > [12/Jul/2020:21:10:09][22414.7efbf37fe700][-conn:iurix:0:9-] Notice: D > proto wss host javascript.info <http://javascript.info/> path > article/websocket/demo tail hello > > > > I’m going to continue writing this client. I don’t know if you are in the > middle the implementation but I shall thank you in advance. That’s been very > helpful already. > > Best wishes, > I > > >> On Dhuʻl-Q. 21, 1441 AH, at 21:08, Iuri de Araujo Sampaio <i...@iurix.com >> <mailto:i...@iurix.com>> wrote: >> >> Hi Gustaf, >> I’ve noticed you had uploaded a simple client interface to >> websocket-procs.tcl. >> https://bitbucket.org/naviserver/websocket/src/master/websocket-procs.tcl >> <https://bitbucket.org/naviserver/websocket/src/master/websocket-procs.tcl> >> >> However, I hit another error related to [dict], because the url doesn’t >> return a path, when [dict get $d path] runs. >> The websocket sample is "wss://javascript.info/article/websocket/demo/hello >> <wss://javascript.info/article/websocket/demo/hello>" >> >> Best wishes, >> I >> >> >> > [12/Jul/2020:21:10:09][22414.7efbf37fe700][-conn:iurix:0:9-] Notice: D > proto wss host javascript.info <http://javascript.info/> path > article/websocket/demo tail hello >> [12/Jul/2020:21:03:33][22342.7efbf37fe700][-conn:iurix:0:36-] Error: can't >> read "path": no such variable >> while executing >> "append request_url /$path" >> (procedure "ws::client::open" line 19) >> invoked from within >> "ws::client::open $url" >> ("uplevel" body line 8) >> invoked from within >> "uplevel { >> ns_log Notice "Running TCL script luna.tcl" >> >> (procedure "code::tcl::/var/www/iurix//packages/ix-websocket/www/luna" >> line 2) >> invoked from within >> "code::tcl::$__adp_stub" >> ("uplevel" body line 12) >> invoked from within >> "uplevel { >> >> if { [file exists $__adp_stub.tcl] } { >> >> # ensure that data source preparation procedure exists and is >> up-to-date >> ..." >> (procedure "adp_prepare" line 2) >> invoked from within >> "adp_prepare" >> invoked from within >> "template::adp_parse $themed_template {}" >> (procedure "adp_parse_ad_conn_file" line 14) >> invoked from within >> "$handler" >> ("uplevel" body line 2) >> invoked from within >> "uplevel $code" >> invoked from within >> "ad_try { >> $handler >> } ad_script_abort val { >> # do nothing >> }" >> invoked from within >> "rp_serve_concrete_file [ad_conn file]" >> (procedure "::nsf::procs::rp_serve_abstract_file" line 60) >> invoked from within >> "rp_serve_abstract_file "$root/$extra_url"" >> ("uplevel" body line 2) >> invoked from within >> >> >>> On Dhuʻl-Q. 20, 1441 AH, at 21:14, Iuri de Araujo Sampaio <i...@iurix.com >>> <mailto:i...@iurix.com>> wrote: >>> >>> Hi there, >>> >>> My code's intended to open a websocket connection to the echo service, wait >>> 400ms to ensure that the connection is really established and send a >>> textual message, which should be echoed back by the echo service. >>> >>> The last part will be handling/parsing that message (i.e. TXT or JSON >>> message, which was echoed in that channel). Thus, every time a message >>> comes through the channel a callback will be in charge to parse that >>> message and store its content. >>> >>> However, when I run the first version of the code, and it returns an error >>> related to: Error: can't set "formMap": variable is array >>> >>> >>> /usr/local/src/ns-4.9.17/tcl8.6.8/library/http/http.tcl: return [string >>> map $formMap $string] >>> /usr/local/src/tcl8.6.9/library/http/http.tcl: variable formMap [array >>> get map] >>> >>> >>> The error is related to core packages, and I believe it happens to fail >>> because that source is some sort of an old code. Thus, it’s not a good idea >>> to fork it at all. >>> How would refactor a "background websocket connection", using the new >>> implementation available at: >>> https://bitbucket.org/naviserver/websocket/src/master/ >>> <https://bitbucket.org/naviserver/websocket/src/master/> ? >>> >>> Here it’s the code >>> >>> package require websocket >>> ::websocket::loglevel debug >>> proc handler { sock type msg } { >>> switch -glob -nocase -- $type { >>> co* { >>> ns_log Notice "Connected on $sock" >>> puts "Connected on $sock" >>> >>> } >>> te* { >>> ns_log Notice "RECEIVED $msg" >>> puts "RECEIVED: $msg" >>> } >>> cl* - >>> dis* { >>> } >>> } >>> >>> } >>> proc test { sock } { >>> puts "[::websocket::conninfo $sock type] from [::websocket::conninfo >>> $sock sockname] to [::websocket::conninfo $sock peername]" >>> >>> ::websocket::send $sock text "Testing, testing..." >>> } >>> set sock [::websocket::open >>> wss://javascript.info/article/websocket/demo/hello >>> <wss://javascript.info/article/websocket/demo/hello> handler] >>> ns_log Notice "SOCKET \n $socket" >>> after 400 test $sock >>> vwait forever >>> >>> >>> >>> >>> Documentation Reference: >>> https://core.tcl-lang.org/tcllib/doc/tcllib-1-17/embedded/www/tcllib/files/modules/websocket/websocket.html#1 >>> >>> <https://core.tcl-lang.org/tcllib/doc/tcllib-1-17/embedded/www/tcllib/files/modules/websocket/websocket.html#1> >>> >>> >>> Best wishes, >>> I >>> >>> >>> >>> >>> >>> >>> [11/Jul/2020:20:39:38][471.7efbf37fe700][-conn:iurix:0:91-] Error: can't >>> set "formMap": variable is array >>> while executing >>> "variable formMap [array get map]" >>> (procedure "init" line 15) >>> invoked from within >>> "init" >>> (in namespace eval "::http" script line 83) >>> invoked from within >>> "namespace eval http { >>> # Allow resourcing to not clobber existing data >>> >>> variable http >>> if {![info exists http]} { >>> array set http { >>> -ac..." >>> (file "/usr/local/ns/lib/tcl8/8.6/http-2.9.0.tm" line 16) >>> invoked from within >>> "source -encoding utf-8 /usr/local/ns/lib/tcl8/8.6/http-2.9.0.tm" >>> ("package ifneeded http 2.9.0" script) >>> invoked from within >>> "package require http 2.7" >>> (file "/usr/local/ns/lib/tcllib1.19/websocket/websocket.tcl" line 20) >>> invoked from within >>> "source /usr/local/ns/lib/tcllib1.19/websocket/websocket.tcl" >>> ("package ifneeded websocket 1.4.1" script) >>> invoked from within >>> "package require websocket" >>> ("uplevel" body line 3) >>> invoked from within >>> "uplevel { >>> >>> package require websocket >>> ::websocket::loglevel debug >>> proc handler { sock type msg } { >>> switch -glob -nocase -- $type { >>> co* { >>> ..." >>> (procedure "code::tcl::/var/www/iurix//packages/ix-websocket/www/ws2" >>> line 2) >>> invoked from within >>> "code::tcl::$__adp_stub" >>> ("uplevel" body line 12) >>> invoked from within >>> "uplevel { >>> >>> if { [file exists $__adp_stub.tcl] } { >>> >>> # ensure that data source preparation procedure exists and is >>> up-to-date >>> ..." >>> (procedure "adp_prepare" line 2) >>> invoked from within >>> "adp_prepare" >>> invoked from within >>> "template::adp_parse $themed_template {}" >>> (procedure "adp_parse_ad_conn_file" line 14) >>> invoked from within >>> "$handler" >>> ("uplevel" body line 2) >>> invoked from within >>> "uplevel $code" >>> invoked from within >>> "ad_try { >>> $handler >>> } ad_script_abort val { >>> # do nothing >>> }" >>> invoked from within >>> "rp_serve_concrete_file [ad_conn file]" >>> (procedure "::nsf::procs::rp_serve_abstract_file" line 60) >>> invoked from within >>> "rp_serve_abstract_file "$root/$extra_url"" >>> ("uplevel" body line 2) >>> invoked from within >>> "uplevel $code" >>> invoked from within >>> "ad_try { >>> rp_serve_abstract_file "$root/$extra_url" >>> set ::tcl_url2file([ad_conn url]) [ad_conn file] >>> se..." >>> called from rp_handler >>> GET http://iurix.com/websocket/ws2? >>> <http://iurix.com/websocket/ws2?> referred by '' peer 192.199.241.135 >>> user_id 0 >>> >>> Host: iurix.com <http://iurix.com/> >>> X-Real-IP: 179.199.201.237 >>> Connection: close >>> Upgrade-Insecure-Requests: 1 >>> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) >>> AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 >>> Accept: >>> text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 >>> Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7 >>> Cookie: _ga=GA1.2.1048850939.1594336017; >>> _gid=GA1.2.432393726.1594336018; mycrawler=-6040px%3A2521px%3Aleft; >>> ad_session_id="44640008%2c0%2c0%2c1594507600%20{834%201594508800%20914BAD40D8EF86359761E4528028EE55857B5F51}" >>> >>> _______________________________________________ >>> naviserver-devel mailing list >>> naviserver-devel@lists.sourceforge.net >>> <mailto:naviserver-devel@lists.sourceforge.net> >>> https://lists.sourceforge.net/lists/listinfo/naviserver-devel >>> <https://lists.sourceforge.net/lists/listinfo/naviserver-devel> >> >> _______________________________________________ >> naviserver-devel mailing list >> naviserver-devel@lists.sourceforge.net >> <mailto:naviserver-devel@lists.sourceforge.net> >> https://lists.sourceforge.net/lists/listinfo/naviserver-devel
_______________________________________________ naviserver-devel mailing list naviserver-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/naviserver-devel