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 <[email protected]>
> 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 <[email protected]
>> <mailto:[email protected]>> 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 <[email protected]
>>> <mailto:[email protected]>> 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
>>> [email protected]
>>> <mailto:[email protected]>
>>> https://lists.sourceforge.net/lists/listinfo/naviserver-devel
>>> <https://lists.sourceforge.net/lists/listinfo/naviserver-devel>
>>
>> _______________________________________________
>> naviserver-devel mailing list
>> [email protected]
>> <mailto:[email protected]>
>> https://lists.sourceforge.net/lists/listinfo/naviserver-devel
_______________________________________________
naviserver-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/naviserver-devel