lib/websocket: Refactored websocket to be more compliant with the model of the Sockets
authorLucas Bajolet <r4pass@hotmail.com>
Mon, 12 Jan 2015 16:29:32 +0000 (11:29 -0500)
committerLucas Bajolet <r4pass@hotmail.com>
Tue, 13 Jan 2015 15:27:27 +0000 (10:27 -0500)
Signed-off-by: Lucas Bajolet <r4pass@hotmail.com>

lib/websocket/examples/websocket_server.nit
lib/websocket/websocket.nit

index 80c9d25..8b4584c 100644 (file)
@@ -19,7 +19,7 @@ module websocket_server
 
 import websocket
 
-var sock = new WebSocket(8088, 1)
+var sock = new WebSocketListener(8088, 1)
 
 var msg: String
 
@@ -27,20 +27,21 @@ if sock.listener.closed then
        print sys.errno.strerror
 end
 
-sock.accept
+var cli: TCPStream
 
-while not sock.listener.closed do
-       if not sock.connected then sock.accept
-       if sys.stdin.poll_in then
-               msg = gets
-               printn "Received message : {msg}"
-               if msg == "exit" then sock.close
-               if msg == "disconnect" then sock.disconnect_client
-               sock.write(msg)
-       end
-       if sock.can_read(10) then
-               msg = ""
-               while sock.can_read(0) do msg += sock.read(100)
-               if msg != "" then print msg
+while not sock.closed do
+       cli = sock.accept
+       while cli.connected do
+               if sys.stdin.poll_in then
+                       msg = gets
+                       printn "Received message : {msg}"
+                       if msg == "disconnect" then cli.close
+                       cli.write(msg)
+               end
+               if cli.can_read(10) then
+                       msg = ""
+                       while cli.can_read(0) do msg += cli.read(100)
+                       if msg != "" then print msg
+               end
        end
 end
index 200c1f5..7e4d329 100644 (file)
@@ -24,14 +24,11 @@ import base64
 
 intrude import standard::stream
 
-# Websocket compatible server, works as an extra layer to the original Sockets
-class WebSocket
-       super BufferedIStream
-       super OStream
-       super PollableIStream
-
-       # Client connection to the server
-       var client: TCPStream
+# Websocket compatible listener
+#
+# Produces Websocket client-server connections
+class WebSocketListener
+       super Socket
 
        # Socket listening to connections on a defined port
        var listener: TCPServer
@@ -39,39 +36,50 @@ class WebSocket
        # Creates a new Websocket server listening on given port with `max_clients` slots available
        init(port: Int, max_clients: Int)
        do
-               _buffer = new FlatBuffer
-               _buffer_pos = 0
                listener = new TCPServer(port)
                listener.listen max_clients
        end
 
-       # Accept an incoming connection and initializes the handshake
-       fun accept
+       # Accepts an incoming connection
+       fun accept: WebsocketConnection
        do
                assert not listener.closed
 
                var client = listener.accept
                assert client != null
-               self.client = client
 
+               return new WebsocketConnection(listener.port, "", client)
+       end
+
+       # Stop listening for incoming connections
+       fun close
+       do
+               listener.close
+       end
+end
+
+# Connection to a websocket client
+#
+# Can be used to communicate with a client
+class WebsocketConnection
+       super TCPStream
+
+       init do
+               _buffer = new FlatBuffer
+               _buffer_pos = 0
                var headers = parse_handshake
                var resp = handshake_response(headers)
 
                client.write(resp)
        end
 
-       # Disconnect from a client
-       fun disconnect_client
-       do
-               client.close
-       end
+       # Client connection to the server
+       var client: TCPStream
 
-       # Disconnects the client if one is connected
-       # And stops the server
+       # Disconnect from a client
        redef fun close
        do
                client.close
-               listener.close
        end
 
        # Parses the input handshake sent by the client
@@ -134,7 +142,7 @@ class WebSocket
        do
                buf.append client.read_line
                buf.append("\r\n")
-               if buf.has_substring("\r\n\r\n", buf.length - 4) then return buf.to_s
+               if buf.has_suffix("\r\n\r\n") then return buf.to_s
                return read_http_frame(buf)
        end
 
@@ -222,9 +230,9 @@ class WebSocket
        end
 
        # Checks if a connection to a client is available
-       fun connected: Bool do return client.connected
+       redef fun connected do return client.connected
 
-       redef fun write(msg: Text)
+       redef fun write(msg)
        do
                client.write(frame_message(msg.to_s))
        end