Home   Archive   Permalink

websocket scheme

Hi, here is my first web socket client implementation draft.
First of all, it is very simple.
I used this as an example:
And I tested only with this simple websocket chat server:
run the chat server, it uses port 8181, so open that port on your firewall. start this script type;
p: open url
it should connect to the server
and start the script again connect to the server.
try 'insert p "hello"' from one client, on the other one, 'pick p 1' it should receive the message.
currently no utf8 handling, no authentication support, no data packets handling.
R E B O L [
    title: "Web Socket Client Protocol Implementation"
    version: 0.0.1
    date: 2010-07-17
    author: "Semseddin (Endo) Moldibi"
    license: 'public-domain
make root-protocol [
    port-flags: system/standard/port-flags/pass-thru
    open: func [port /local client-request tmp] [
        if port/port-id = 0 [port/port-id: 80]
        client-request: rejoin [
            "HTTP/1.1 101 Web Socket Protocol Handshake"    newline
            "Upgrade: WebSocket"                            newline
            "Connection: Upgrade"                            newline
            "WebSocket-Origin: " join http:// port/host        newline
            "WebSocket-Location: " port/url                    newline
        port/locals: make object! [header: make string! 1024]
        port/state/tail: 2000
        port/state/index: 0
        port/state/flags: port/state/flags or port-flags
        ;open communication port & send web socket request
        open-proto/sub-protocol/generic port 'tcp
        system/words/insert port/sub-port client-request
        ;read result
        if not all [
            equal? "HTTP/1.1 101 Web Socket Protocol Handshake"    first port/sub-port
            equal? "Upgrade: WebSocket"                            first port/sub-port
            equal? "Connection: Upgrade"                        first port/sub-port
        ] [
            print "Invalid handshake response."
        set-modes port [lines: false no-wait: true]
        ;read headers
        until [none? tmp: pick port 1]
    insert: func [port data] [
        system/words/insert port/sub-port rejoin [#{00} data #{FF}]
    ;pick: func [port /local data b e] [
    pick: func [port] [
        data: make string! 63
        forever [
            either error? try [
                b: system/words/first port/sub-port
            ] [
                data: none
            ] [
                if b > 0 [
                    if b = 255 [
                    append data to-char b
    close: func [port][
        ;close the connection cleanly
        system/words/insert port/sub-port #{FF00}
        wait 0.2
        system/words/close port/sub-port
    net-utils/net-install ws self 0
print "protocol loaded"
url: ws://localhost:8181/chat
;p: open url

posted by:   Endo       25-Jul-2010/17:06:32-7:00

here is the syntax highlighted version:

posted by:   Endo       26-Jul-2010/4:48:10-7:00

I've updated the ws script. Now you can get the header just after connected to server.
PICK returns empty string instead of none when no new message.
     >> p: open url
     >> print p/locals/header
     WebSocket-Origin: http://localhost:8080
     WebSocket-Location: ws://localhost:8181/chat
     >> pick p 1
     == "" ;returns empty string if no new message
     >> insert p "test"
     == "test"
     >> pick p 1
     == "me: test" ;returns the message string comes from server

posted by:   Endo       26-Jul-2010/17:47:48-7:00

Endo, I updated the rebolforum script to maintain your formatting :)

posted by:   Nick       27-Jul-2010/0:58:29-7:00