From 75197d34e3f51804a03a3a58236290ab9f87d6c6 Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Mon, 5 Aug 2019 01:52:54 +0200
Subject: [PATCH] websockets: handle errors
---
src/websocketc.cr | 103 +++++++++++++++++++++-------------------------
src/websocketd.cr | 16 ++++++-
2 files changed, 62 insertions(+), 57 deletions(-)
diff --git a/src/websocketc.cr b/src/websocketc.cr
index 583a840..5b3aea5 100644
--- a/src/websocketc.cr
+++ b/src/websocketc.cr
@@ -19,62 +19,55 @@ OptionParser.parse! do |parser|
end
end
-ws = WebSocket.new(URI.parse(uri))
-
-# HTTP::WebSocket.new(URI.parse("wss://websocket.example.com/chat")) # Creates a new WebSocket with TLS to `websocket.example.com`
-# HTTP::WebSocket.new(URI.parse("http://websocket.example.com:8080/chat")) # Creates a new WebSocket to `websocket.example.com` on port `8080`
-# HTTP::WebSocket.new(URI.parse("ws://websocket.example.com/chat"), # Creates a new WebSocket to `websocket.example.com` with an Authorization header
-# HTTP::Headers{"Authorization" => "Bearer authtoken"})
-
-m = ws.read
-if m.nil?
- puts "oh no"
- exit
-end
-# puts "message: #{String.new(m)}"
-
-# puts "sending pong"
-ws.send "pong".to_slice
-m = ws.read
-if m.nil?
- puts "oh no"
- exit
-end
-# puts "message: #{String.new(m)}"
-
-# puts "sending coucou"
-tosend = to_message 2, "coucou"
-# print_hexa(String.new(tosend), "#{CBLUE}Sending message hexa#{CRESET}")
-ws.send tosend
-
-m = ws.read
-if m.nil?
- puts "oh no"
- exit
-end
-puts "message: #{String.new(m)}"
-
-# ws.on_message do |message|
-# if message == "are we websocket yet?"
-# puts "sending pong"
-# ws.send "pong\n"
-# elsif message.chomp == "OK"
-# puts "sending coucou"
-# m = to_message 2, "coucou"
-# print_hexa(String.new(m), "#{CBLUE}Sending message hexa#{CRESET}")
-# ws.send m
-# else
-# print_hexa message, "#{CORANGE}Receving a message#{CRESET}"
-# end
-# end
-
-ws.on_close do |socket|
- puts "socket is closing"
- # socket.close
+def read_then_print(ws : WebSocket)
+ m = read ws
+ puts "message: #{String.new(m)}"
end
-# ws.run
+def read_then_print_hexa(ws : WebSocket)
+ m = read ws
+ print_hexa(String.new(m), "#{CBLUE}Received message hexa#{CRESET}")
+end
-ws.close
+def read(ws : WebSocket)
+ m = ws.read
+ if m.nil?
+ raise "empty message"
+ end
-ws.read
+ m
+end
+
+def send_with_announce(ws : WebSocket, m : String)
+ puts "sending #{m}"
+ send ws, m
+end
+
+def send(ws : WebSocket, m : String)
+ ws.send m
+end
+
+def send(ws : WebSocket, m : Slice)
+ ws.send m
+end
+
+
+begin
+ ws = WebSocket.new(URI.parse(uri))
+
+ ws.on_close do |socket|
+ puts "socket is closing"
+ exit 0
+ end
+
+ read ws
+ send ws, "pong"
+ read ws
+ send ws, to_message(2, "coucou")
+ read ws
+
+ ws.close
+ ws.read
+rescue e
+ puts "Exception: #{e}"
+end
diff --git a/src/websocketd.cr b/src/websocketd.cr
index ef85584..1c8e78f 100644
--- a/src/websocketd.cr
+++ b/src/websocketd.cr
@@ -208,7 +208,13 @@ def websocket_switching_procedure (activefd : Int, context : InstanceStorage)
# The client is a WebSocket on top of a TCP connection
client = context.socklist[activefd]
wsclient = context.wssocklist[activefd]
- message = wsclient.read
+ begin
+ message = wsclient.read
+ rescue e
+ puts "#{CRED}Exception (receiving a message)#{CRESET} #{e}"
+ closing_client activefd, context
+ return
+ end
if wsclient.closed?
# puts "#{CBLUE}client is closed#{CRESET}"
@@ -290,7 +296,13 @@ service.loop do |event|
# since it's an external communication
# we have to read the message here, it's not handled by default in libipc
wsclient = context.wssocklist[activefd]
- message = wsclient.read
+ begin
+ message = wsclient.read
+ rescue e
+ puts "#{CRED}Exception (receiving a message)#{CRESET} #{e}"
+ closing_client activefd, context
+ next
+ end
if message.nil?
puts "#{CBLUE}disconnection of client#{CRESET} #{event.connection.fd}"