Better error handling in Clojure Websockify.

Also, disable verbose debug.
This commit is contained in:
Joel Martin 2012-01-27 15:37:35 -06:00
parent a5d4fe1d18
commit 3278905ead
1 changed files with 24 additions and 15 deletions

View File

@ -74,9 +74,13 @@
;; WebSockets ;; WebSockets
(defn target-open [ctx e] (defn target-open [ctx e]
(println "channelConnected:" e)) (println "Connected to target")
#_(println "channelConnected:" e))
(defn target-close [ctx e] (defn target-close [ctx e]
(println "channelDisconnected:" e)) #_(println "channelDisconnected:" e)
(println "Target closed")
(when-let [channel (get @targets (.getChannel ctx))]
(.disconnect channel)))
(defn target-message [ctx e] (defn target-message [ctx e]
(let [channel (.getChannel ctx) (let [channel (.getChannel ctx)
client (get @targets channel) client (get @targets channel)
@ -84,18 +88,18 @@
len (.readableBytes msg) len (.readableBytes msg)
b64 (Base64/encode msg false) b64 (Base64/encode msg false)
blen (.readableBytes b64)] blen (.readableBytes b64)]
(println "received " len "bytes from target") #_(println "received" len "bytes from target")
#_(println "target receive:" (.toString msg 0 len CharsetUtil/UTF_8)) #_(println "target receive:" (.toString msg 0 len CharsetUtil/UTF_8))
#_(println "sending to client:" (.toString b64 0 blen CharsetUtil/UTF_8)) #_(println "sending to client:" (.toString b64 0 blen CharsetUtil/UTF_8))
(.sendMessage client (.toString b64 0 blen CharsetUtil/UTF_8)) (.sendMessage client (.toString b64 0 blen CharsetUtil/UTF_8))))
))
;; http://wiki.eclipse.org/Jetty/Feature/WebSockets ;; http://wiki.eclipse.org/Jetty/Feature/WebSockets
(defn make-websocket-handler [] (defn make-websocket-handler []
(reify org.eclipse.jetty.websocket.WebSocket$OnTextMessage (reify org.eclipse.jetty.websocket.WebSocket$OnTextMessage
(onOpen [this connection] (onOpen [this connection]
(println "Got WebSocket connection:" connection) #_(println "Got WebSocket connection:" connection)
(println "New client")
(let [target (netty-client (let [target (netty-client
"localhost" 5901 "localhost" 5901
target-open target-close target-message)] target-open target-close target-message)]
@ -103,20 +107,22 @@
:target target}) :target target})
(swap! targets assoc target connection))) (swap! targets assoc target connection)))
(onClose [this code message] (onClose [this code message]
(do (println "WebSocket connection closed")
(let [target (:target (get @clients this))] (when-let [target (:target (get @clients this))]
(swap! clients dissoc this) (println "Closing target")
(swap! targets dissoc target) (.close target)
))) (println "Target closed")
(swap! targets dissoc target))
(swap! clients dissoc this))
(onMessage [this data] (onMessage [this data]
(println "WebSocket onMessage:" data) #_(println "WebSocket onMessage:" data)
(let [target (:target (get @clients this)) (let [target (:target (get @clients this))
cbuf (ChannelBuffers/copiedBuffer data CharsetUtil/UTF_8) cbuf (ChannelBuffers/copiedBuffer data CharsetUtil/UTF_8)
decbuf (Base64/decode cbuf) decbuf (Base64/decode cbuf)
rlen (.readableBytes decbuf)] rlen (.readableBytes decbuf)]
(println "Sending to target:" (.toString decbuf 0 rlen CharsetUtil/UTF_8)) #_(println "Sending" rlen "bytes to target")
(.write target decbuf) #_(println "Sending to target:" (.toString decbuf 0 rlen CharsetUtil/UTF_8))
)))) (.write target decbuf)))))
(defn make-websocket-servlet [] (defn make-websocket-servlet []
(proxy [org.eclipse.jetty.websocket.WebSocketServlet] [] (proxy [org.eclipse.jetty.websocket.WebSocketServlet] []
@ -158,6 +164,9 @@
(println "Not serving web requests")) (println "Not serving web requests"))
(defn stop [] (defn stop []
(doseq [client (vals @clients)]
(.disconnect (:client client))
(.close (:target client)))
(.stop server) (.stop server)
(reset! clients {}) (reset! clients {})
(reset! targets {}) (reset! targets {})