r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[!Cheyenne] Discussions about the Cheyenne Web Server

Dockimbel
25-Dec-2009
[6727]
Graham: you should check if your server is reachable on this URL 
: http://localhost/ws.rsp(it should if you're using the config file 
from SVN). 


Web Control Panel : yes, it's easier with web sockets than with COMET 
approach, but it's not a show stopper anyway.

Mail server : it could make it easier if you're using a client supporting 
web sockets.
Terry
25-Dec-2009
[6728]
Can i put a forever loop in RSP, and how would i push the buffer?
Dockimbel
25-Dec-2009
[6729]
No you can't, it won't work (RSP engine use a request/response model), 
but even if you could, that would mean one process per client connection, 
definitely not scalable.
Terry
25-Dec-2009
[6730]
Strikes me as a new Uniserve service
Dockimbel
25-Dec-2009
[6731]
My thought would be a business layer managing sockets?

 If you want a kind of bridging server (web sockets<=> Server <=> 
 TCP), there's already existing products doing that like http://www.kaazing.com/products/kaazing-websocket-gateway
Terry
25-Dec-2009
[6732x6]
Well, there's already existing web servers as well. .That's not the 
point.
This could be a Kaazing killer
(Watch that pop to the top of Google when searching 'Kaazing' :)
Needs to be in a forever loop somewhere. I'm guessing a service (or 
protocol.. can't remember which)
so that you can connect and to this.. 

forever [

do %somehandler.r

]

where somehandler.r could manage the connections? no?
so the "polling" aspect is moved from the client -> server.. to an 
internal script via multiple forevers 
or sumtin' like that ?
something like taskmaster?
Dockimbel
25-Dec-2009
[6738]
I don't get your "forever loop" approach, UniServe uses an event 
loop.
Terry
25-Dec-2009
[6739x6]
I'm looking for some old experiments
but wouldn't it just be standard on-connected , on-received  protocol 
handlers anyway?
it requires some kind of null event at the end of each incoming message
install-service [

    	name: 'test
    	port-id: 3001
	stop-at: "^@"
(that's the standard Flash EOF)
on-received: func [data][ 
	theIP: client/remote-ip
	do %websockethandler.r	
]
Dockimbel
25-Dec-2009
[6745]
If you're trying to ask if a gateway like Kazaaing can be built using 
UniServe, the answer is : sure and it will be scalable.
Terry
25-Dec-2009
[6746x3]
I think the hard part is done already.. dealing with ws://
(maybe wss:// might be a little trickier :)
It's exciting.. i'm sending javascript back to the browser via the 
websocket to be eval'd.. the browser just became a killer GUI
Dockimbel
25-Dec-2009
[6749x2]
Important notice wrt web sockets : IIRC, all data sent on both sides 
have to be UTF-8 encoded. The current Cheyenne implementation doesn't 
enforce that encoding, so it's up to the developer to send the right 
data format.
This is apply to the so-called "text frames" which Cheyenne supports. 
The other kind of frames (binary frames) doesn't require such encoding 
(not supported by Cheyenne yet).
Terry
25-Dec-2009
[6751]
UTF-8 support is icing on the cake.
Dockimbel
25-Dec-2009
[6752]
This is apply => This applies
Terry
25-Dec-2009
[6753x3]
Here's quick demo of pushing javascript back for eval

---------WS.html--------------


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>Welcome!</title>
	

<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'</script>

<script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js'</script>	

</head>
<body>
<center>
<h2>Web Socket test page</h2>

<script>
var conn = new WebSocket("ws://localhost/ws.rsp")

conn.onopen = function(evt) {
 alert("Conn opened");
}
conn.onmessage = function(evt) {
 eval(evt.data); 
 }
conn.onclose = function(evt) {
 alert("Conn closed"); 
}


</script>

<button onClick="conn.send('Hello World');"> Send Message </button>
<button onclick="conn.send('makedrag');"> Make it drag</button>
</center>


<div id="test" style="height:100px;width:100px;border: 1px solid 
grey">MAKE ME DRAGGABLE</div>
</body>
</html>

-------WS.rsp------


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
	<title>Welcome!</title>
	

<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'</script>

<script src='http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js'</script>	

</head>
<body>
<center>
<h2>Web Socket test page</h2>

<script>
var conn = new WebSocket("ws://localhost/ws.rsp")

conn.onopen = function(evt) {
 alert("Conn opened");
}
conn.onmessage = function(evt) {
 eval(evt.data); 
 }
conn.onclose = function(evt) {
 alert("Conn closed"); 
}


</script>

<button onClick="conn.send('Hello World');"> Send Message </button>
<button onclick="conn.send('makedrag');"> Make it drag</button>
</center>


<div id="test" style="height:100px;width:100px;border: 1px solid 
grey">MAKE ME DRAGGABLE</div>
</body>
</html>
oops
WS.rsp  should look like this

<%

;-- RSP API web sockets specific changes --
;

;   request/web-socket? => true if this is an incoming socket message, 
false if it's HTTP.
;   request/content/data => contains the socket message (string!)

;-- just echo back the message
//prin request/content/data

inc: request/content/data
if inc = "makedrag" [prin "$('#test').draggable();"]  

if inc = "Hello World" [prin "alert('Hello back');"]
 
%>
Dockimbel
25-Dec-2009
[6756x2]
Btw, the Internet Draft defining the web socket protocol (http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-54) 
is really badly written. In particular, algorithm descriptions are 
incredibly obfuscated. On the design side, a packet-oriented protocol 
not sending packet length (for text frames), rather relying on begin/end 
markers, is a surprizing choice to me.
Terry: I'm glad you're enjoying your christmas gift. ;-)
Terry
25-Dec-2009
[6758x2]
yeah.. you've ruined my whole day :)
is there a particular code snippet repository everyone is using?
Dockimbel
25-Dec-2009
[6760]
I guess that can use a Cheyenne powered service for that : http://www.qwikitxt.com
If it doesn't suit your needs, there's http://pastebin.com/
Terry
25-Dec-2009
[6761]
Hey.. i like the "eat your own dogfood" philosophy
Graham
25-Dec-2009
[6762x3]
Not using the default config .. but I get this

26/12-10:17:23.838-[RSP] ##RSP Script Error: 

	URL  = /ws.rsp
	File = www/ws.rsp

	** Script Error : Invalid path value: data 
	** Where: rsp-script 
	** Near:  [prin request/content/data] 


Request  = make object! [

    headers: [Host "localhost:8000" Connection "keep-alive" User-Agent 
    {Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 
    (KHTML, like Gecko) Chrome/4.0.249.43 Safari/532.5} Accept {application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5} 
    Accept-Encoding "gzip,deflate" Accept-Language "en-GB,en-US;q=0.8,en;q=0.6" 
    Accept-Charset "ISO-8859-1,utf-8;q=0.7,*;q=0.3"]
    status-line: #{474554202F77732E72737020485454502F312E310D0A}
    method: 'GET
    url: "/ws.rsp"
    content: none
    path: "/"
    target: "ws.rsp"
    arg: none
    ext: '.rsp
    version: none
    file: %www/ws.rsp
    script-name: none
    ws?: none
]
listening on port 8000
I'll download a fresh svn ..
Terry
25-Dec-2009
[6765]
The only problem with eating your own dog food is sometimes it  just 
doesn't taste that good.. like when it processes html
Here's the pastebin code for the eval demo above
http://pastebin.com/d1cfec7dc
Graham
25-Dec-2009
[6766]
Very odd .. downloaded fresh checkout.  There's no listen in the 
httpd.cfg but it starts up listening at 8000 and not 80.
Pekr
25-Dec-2009
[6767]
I think it might be somewhere in Uniserve's config ...
Graham
25-Dec-2009
[6768]
And if i browse to http://localhost:8000/ws.html .. I see the web 
socket test page, and I get a Chrome alert saying that Conn closed.
Dockimbel
25-Dec-2009
[6769]
Graham: how do you start Cheyenne?
Graham
25-Dec-2009
[6770x3]
I don't think we can listen at 80 anyway on Windows 7
do %cheyenne.r
we can't listen ..
Dockimbel
25-Dec-2009
[6773]
Even if you use "Run as administrator" on REBOL binary?
Graham
25-Dec-2009
[6774]
I created a listen on 8010
and still same error
Dockimbel
25-Dec-2009
[6775x2]
If you're not running on port 80, you need to add the port number 
to the ws:// URL in ws.html. Tested here, it fixes the "conn closed" 
issue.
var conn = new WebSocket("ws://localhost:8000/ws.rsp")