Skip to content

Commit

Permalink
Move websocket middleware to middleware ns [IMMUTANT-521]
Browse files Browse the repository at this point in the history
  • Loading branch information
tobias committed Jan 16, 2015
1 parent fe01d51 commit 188c095
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 54 deletions.
5 changes: 2 additions & 3 deletions web/dev-resources/testing/app.clj
Expand Up @@ -14,9 +14,8 @@

(ns testing.app
(:require [immutant.web :as web]
[immutant.web.websocket :as ws]
[immutant.web.async :as async]
[immutant.web.middleware :refer (wrap-session)]
[immutant.web.middleware :refer (wrap-session wrap-websocket)]
[immutant.codecs :refer (encode)]
[compojure.core :refer (GET defroutes)]
[ring.util.response :refer (charset redirect response)]))
Expand Down Expand Up @@ -104,7 +103,7 @@
(defn run []
(web/run (-> #'routes
wrap-session
(ws/wrap-websocket
(wrap-websocket
:on-open #'on-open-set-handshake
:on-message #'on-message-send-handshake)))
(web/run (-> ws-as-channel wrap-session) :path "/ws"))
34 changes: 31 additions & 3 deletions web/src/immutant/web/middleware.clj
Expand Up @@ -14,9 +14,10 @@

(ns immutant.web.middleware
"Ring middleware useful with immutant.web"
(:require [immutant.internal.util :refer [try-resolve]]
[immutant.util :refer [in-container?]]
[immutant.web.internal.servlet :refer [wrap-servlet-session]]
(:require [immutant.internal.util :refer [try-resolve]]
[immutant.util :refer [in-container?]]
[immutant.web.async :refer [as-channel]]
[immutant.web.internal.servlet :refer [wrap-servlet-session]]
[immutant.web.internal.undertow :refer [wrap-undertow-session]]))

(defn wrap-development
Expand Down Expand Up @@ -66,3 +67,30 @@
(if (in-container?)
(wrap-servlet-session handler options)
(wrap-undertow-session handler options)))))

(defn wrap-websocket
"Middleware to attach websocket callbacks to a Ring handler.
The following callbacks are supported, where `channel` is an object
extended to [[immutant.web.async/Channel]], `handshake` is extended
to [[immutant.web.async/WebsocketHandshake]], `throwable` is a Java
exception, and `message` may be either a `String` or a `byte[]`:
* :on-message `(fn [channel message])`
* :on-open `(fn [channel handshake])`
* :on-close `(fn [channel {:keys [code reason]}])`
* :on-error `(fn [channel throwable])`
If handler is nil, a 404 status will be returned for any
non-websocket request.
If called within a servlet container, e.g. WildFly, this should be
the last call in your middleware chain, as its result will be a
servlet, not a function."
([handler key value & key-values]
(wrap-websocket handler (apply hash-map key value key-values)))
([handler callbacks]
(fn [request]
(if (:websocket? request)
(as-channel request callbacks)
(merge {:status 404} (when handler (handler request)))))))
46 changes: 0 additions & 46 deletions web/src/immutant/web/websocket.clj

This file was deleted.

3 changes: 1 addition & 2 deletions web/test/immutant/web/websocket_test.clj
Expand Up @@ -15,9 +15,8 @@
(ns immutant.web.websocket-test
(:require [clojure.test :refer :all]
[immutant.web :refer :all]
[immutant.web.websocket :refer :all]
[immutant.web.async :refer :all]
[immutant.web.middleware :refer [wrap-session]]
[immutant.web.middleware :refer [wrap-session wrap-websocket]]
[ring.util.response :refer [response]]
[http.async.client :as http]
[testing.web :refer [hello get-body]]
Expand Down

0 comments on commit 188c095

Please sign in to comment.