Skip to content

Commit

Permalink
websockets init
Browse files Browse the repository at this point in the history
  • Loading branch information
mpenet committed Oct 7, 2023
1 parent d687671 commit 14b5c5e
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 31 deletions.
1 change: 1 addition & 0 deletions deps.edn
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
com.github.strojure/zmap {:mvn/version "1.3.26"}
io.helidon.http/helidon-http {:mvn/version "4.0.0-RC1"}
io.helidon.webserver/helidon-webserver {:mvn/version "4.0.0-RC1"}
io.helidon.webserver/helidon-webserver-websocket {:mvn/version "4.0.0-RC1"}
io.helidon.webserver/helidon-webserver-http2 {:mvn/version "4.0.0-RC1"}}

:aliases
Expand Down
7 changes: 4 additions & 3 deletions src/s_exp/mina.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
(ns s-exp.mina
(:require [s-exp.mina.handler]
[s-exp.mina.options :as options])
(:require [s-exp.mina.http.handler]
[s-exp.mina.options :as options]
[s-exp.mina.websocket.handler])
(:import (io.helidon.webserver WebServer WebServerConfig WebServerConfig$Builder)))

(set! *warn-on-reflection* true)
Expand Down Expand Up @@ -28,7 +29,7 @@
* `:tls` - a `io.helidon.nima.common.tls.Tls` instance"
([handler options]
(start! (assoc options :handler handler)))
(start! (assoc options :http-handler handler)))
([options]
(-> (server-builder (merge default-options options))
.build
Expand Down
12 changes: 6 additions & 6 deletions src/s_exp/mina/handler.clj → src/s_exp/mina/http/handler.clj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(ns s-exp.mina.handler
(:require [s-exp.mina.options :as options]
[s-exp.mina.request :as request]
[s-exp.mina.response :as response])
(ns s-exp.mina.http.handler
(:require [s-exp.mina.http.request :as request]
[s-exp.mina.http.response :as response]
[s-exp.mina.options :as options])
(:import (io.helidon.webserver WebServerConfig$Builder)
(io.helidon.webserver.http Handler
HttpRouting)))
Expand All @@ -15,14 +15,14 @@
(.build
(doto (HttpRouting/builder)
(.any
^"[Lio.helidon.webserver.http.Handler;"
^"[Lio.helidon.webserver.http.Handler;"
(into-array Handler
[(reify Handler
(handle [_ server-request server-response]
(->> (request/ring-request server-request server-response)
handler
(response/set-response! server-response))))])))))))

(defmethod options/set-server-option! :handler
(defmethod options/set-server-option! :http.handler
[^WebServerConfig$Builder builder _ handler options]
(set-ring1-handler! builder handler options))
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
(ns s-exp.mina.request
(ns s-exp.mina.http.request
(:require [clojure.string :as str]
[strojure.zmap.core :as zmap])
(:import (clojure.lang
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
(ns s-exp.mina.response
(:import (io.helidon.http Header
Headers
HeaderNames
(ns s-exp.mina.http.response
(:import (io.helidon.http HeaderNames
HeaderName
Status)
(io.helidon.webserver.http ServerResponse)
Expand Down
49 changes: 49 additions & 0 deletions src/s_exp/mina/websocket/handler.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
(ns s-exp.mina.websocket.handler
(:require [s-exp.mina.options :as options])
(:import (io.helidon.common.buffers BufferData)
(io.helidon.http Headers)
(io.helidon.http HttpPrologue)
(io.helidon.webserver WebServerConfig$Builder)
(io.helidon.webserver.websocket WsRouting)
(io.helidon.websocket WsListener WsSession)
(java.util Optional)))

(set! *warn-on-reflection* true)

(defn make-listener
^WsListener [{:as _listener
:keys [message ping pong close error open http-upgrade]
:or {message (constantly nil)
ping (constantly nil)
pong (constantly nil)
close (constantly nil)
error (constantly nil)
open (constantly nil)
http-upgrade (constantly (Optional/empty))}}]
(reify WsListener
(^void onMessage [_ ^WsSession session ^BufferData data ^boolean last?]
(message session data last?))
(^void onPing [_ ^WsSession session ^BufferData data]
(ping session data))
(^void onPong [_ ^WsSession session ^BufferData data]
(pong session data))
(^void onClose [_ ^WsSession session ^int status ^String reason]
(close session status reason))
(^void onError [_ ^WsSession session ^Throwable e]
(error session e))
(^void onOpen [_ ^WsSession session]
(open session))
(^Optional onHttpUpgrade [_ ^HttpPrologue http-prologue ^Headers headers]
(http-upgrade http-prologue headers))))

(defn set-websocket-handler! ^WebServerConfig$Builder
[^WebServerConfig$Builder builder [path listener] _options]
(doto builder
(.addRouting
(.build
(doto (WsRouting/builder)
(.endpoint path (make-listener listener)))))))

(defmethod options/set-server-option! :websocket-handler
[^WebServerConfig$Builder builder _ handler options]
(set-websocket-handler! builder handler options))
34 changes: 17 additions & 17 deletions test/s_exp/mina_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -20,57 +20,57 @@
(finally (m/stop! server#))))))

(deftest test-send-headers
(with-server {:handler (fn [req] {:headers {:foo "bar"}})}
(with-server {:http-handler (fn [req] {:headers {:foo "bar"}})}
(is (-> (client/get *endpoint*) :headers :foo (= "bar"))))
(with-server {:handler (fn [req] {:headers {:foo ["bar" "baz"]}})}
(with-server {:http-handler (fn [req] {:headers {:foo ["bar" "baz"]}})}
(is (-> (client/get *endpoint*) :headers :foo (= ["bar" "baz"])))))

(deftest test-status
(with-server {:handler (fn [req] {:status 201})}
(with-server {:http-handler (fn [req] {:status 201})}
(is (-> (client/get *endpoint*) :status (= 201)))))

(deftest test-query-string
(with-server {:handler (fn [req] {:body (:query-string req)})}
(with-server {:http-handler (fn [req] {:body (:query-string req)})}
(is (-> (client/get (str *endpoint* "?foo=bar")) :body (= "foo=bar"))))

(with-server {:handler (fn [req] {:body (:query-string req)})}
(with-server {:http-handler (fn [req] {:body (:query-string req)})}
(is (-> (client/get (str *endpoint* "?")) :body (= ""))))

(with-server {:handler (fn [req] {:body (:query-string req)})}
(with-server {:http-handler (fn [req] {:body (:query-string req)})}
(is (-> (client/get (str *endpoint* "")) :body (= "")))))

(deftest test-method
(with-server {:handler (fn [req] {:body (str (:request-method req))})}
(with-server {:http-handler (fn [req] {:body (str (:request-method req))})}
(is (-> (client/post *endpoint*) :body (= ":post"))))

(with-server {:handler (fn [req] {:body (str (:request-method req))})}
(with-server {:http-handler (fn [req] {:body (str (:request-method req))})}
(is (-> (client/put *endpoint*) :body (= ":put"))))

(with-server {:handler (fn [req] {:body (str (:request-method req))})}
(with-server {:http-handler (fn [req] {:body (str (:request-method req))})}
(is (-> (client/delete *endpoint*) :body (= ":delete")))))

(deftest test-uri
(with-server {:handler (fn [req] {:body (:uri req)})}
(with-server {:http-handler (fn [req] {:body (:uri req)})}
(is (-> (client/delete (str *endpoint* "foo/bar")) :body (= "/foo/bar")))))

(deftest test-scheme
(with-server {:handler (fn [req] {:body (str (:scheme req))})}
(with-server {:http-handler (fn [req] {:body (str (:scheme req))})}
(is (-> (client/get *endpoint*) :body (= ":http")))))

(deftest test-body
(with-server {:handler (fn [req] {})}
(with-server {:http-handler (fn [req] {})}
(is (-> (client/get *endpoint*) :body (= ""))))

(with-server {:handler (fn [req] {:body "yes"})}
(with-server {:http-handler (fn [req] {:body "yes"})}
(is (-> (client/get *endpoint*) :body (= "yes"))))

(with-server {:handler (fn [req] {:body ["yes" "no"]})}
(with-server {:http-handler (fn [req] {:body ["yes" "no"]})}
(is (-> (client/get *endpoint*) :body (= "yesno"))))

(with-server {:handler (fn [req] {:body (.getBytes "yes")})}
(with-server {:http-handler (fn [req] {:body (.getBytes "yes")})}
(is (-> (client/get *endpoint*) :body (= "yes"))))

(with-server {:handler (fn [req] {:body (java.io.ByteArrayInputStream. (.getBytes "yes"))})}
(with-server {:http-handler (fn [req] {:body (java.io.ByteArrayInputStream. (.getBytes "yes"))})}
(is (-> (client/get *endpoint*) :body (= "yes")))))

(defn tls []
Expand All @@ -84,7 +84,7 @@
(.build b)))

(deftest test-ssl-context
(with-server {:handler (fn [req] {}) :tls (tls)}
(with-server {:http-handler (fn [req] {}) :tls (tls)}
(let [endpoint (str/replace *endpoint* "http://" "https://")]
(is (thrown? Exception (client/get endpoint)))
(is (status-ok? (client/get endpoint
Expand Down

0 comments on commit 14b5c5e

Please sign in to comment.