From e11dba852bfe6712fae35f74d241f4b442757fb7 Mon Sep 17 00:00:00 2001 From: Jim Crossley Date: Thu, 22 Jan 2015 17:22:22 -0500 Subject: [PATCH] Remove reflection in-container for ws upgrades [IMMUTANT-521] --- project.clj | 2 +- web/src/immutant/web/internal/servlet.clj | 39 +++++++------------ web/src/immutant/web/internal/undertow.clj | 4 +- .../immutant/web/integ_test.clj | 3 +- 4 files changed, 20 insertions(+), 28 deletions(-) diff --git a/project.clj b/project.clj index 01a56eeb..1312a7ad 100644 --- a/project.clj +++ b/project.clj @@ -87,7 +87,7 @@ h2 "1.3.176" ;; org.projectodd.wunderboss "0.3.0" - org.projectodd.wunderboss "1.x.incremental.180" + org.projectodd.wunderboss "1.x.incremental.181" ;; org.projectodd.wunderboss "0.4.0-SNAPSHOT" org.immutant :version}} diff --git a/web/src/immutant/web/internal/servlet.clj b/web/src/immutant/web/internal/servlet.clj index b3a0a862..31391c3b 100644 --- a/web/src/immutant/web/internal/servlet.clj +++ b/web/src/immutant/web/internal/servlet.clj @@ -19,7 +19,7 @@ (:import [org.projectodd.wunderboss.web.async Channel$OnOpen Channel$OnClose Channel$OnError ServletHttpChannel Util] [org.projectodd.wunderboss.web.async.websocket DelegatingJavaxEndpoint JavaxWebsocketChannel - WebsocketChannel WebsocketChannel$OnMessage] + WebsocketChannel WebsocketChannel$OnMessage DelegatingHandshakeRequest] [javax.servlet.http HttpServlet HttpServletRequest HttpServletResponse HttpSession] [javax.servlet Servlet ServletConfig ServletContext] [javax.websocket Session Endpoint EndpointConfig MessageHandler$Whole CloseReason] @@ -101,17 +101,7 @@ (set-header [response key value] (.setHeader response key value)) (add-header [response key value] (.addHeader response key value))) -(defn- ^HttpServletRequest reflect-request - [^HandshakeRequest hsr] - (-> io.undertow.servlet.websockets.ServletWebSocketHttpExchange - (.getDeclaredField "request") - (doto (.setAccessible true)) - (.get (-> io.undertow.websockets.jsr.handshake.ExchangeHandshakeRequest - (.getDeclaredField "exchange") - (doto (.setAccessible true)) - (.get hsr))))) - -(extend-type javax.websocket.server.HandshakeRequest +(extend-type DelegatingHandshakeRequest async/WebsocketHandshake (headers [hs] (.getHeaders hs)) (parameters [hs] (.getParameterMap hs)) @@ -122,18 +112,18 @@ (user-in-role? [hs role] (.isUserInRole hs role)) ring/RingRequest - (server-port [hs] (-> hs .getRequestURI .getPort)) - (server-name [hs] (-> hs .getRequestURI .getHost)) - (uri [hs] (-> hs .getRequestURI .toString)) + (server-port [hs] (.getOriginPort hs)) + (server-name [hs] (.getOriginHost hs)) + (uri [hs] (-> hs .getRequestURI .getPath)) (query-string [hs] (.getQueryString hs)) - (scheme [hs] (ring/scheme (reflect-request hs))) + (scheme [hs] (keyword (.getOriginScheme hs))) (request-method [hs] :get) (headers [hs] (-> hs .getHeaders hdr/headers->map)) - (context [hs] (ring/context (reflect-request hs))) - (path-info [hs] (ring/path-info (reflect-request hs))) - (remote-addr [hs] (ring/remote-addr (reflect-request hs))) + (context [hs] (.getContextPath hs)) + (path-info [hs] (.getPathInfo hs)) ;; no-ops + (remote-addr [hs]) (body [hs]) (content-type [hs]) (content-length [hs]) @@ -194,12 +184,13 @@ (create (class endpoint) path) (configurator (proxy [ServerEndpointConfig$Configurator] [] (getEndpointInstance [c] endpoint) - (modifyHandshake [^ServerEndpointConfig config request response] - (-> config + (modifyHandshake [^ServerEndpointConfig config ^HandshakeRequest request response] + (let [delegate (DelegatingHandshakeRequest. request servlet-context path)] + (-> config .getUserProperties - (.put "HandshakeRequest" request)) - (when handshake - (handshake config request response))))) + (.put "HandshakeRequest" delegate)) + (when handshake + (handshake config delegate response)))))) build)))) (defn handshake-ring-invoker [handler] diff --git a/web/src/immutant/web/internal/undertow.clj b/web/src/immutant/web/internal/undertow.clj index 51e8179d..c0980963 100644 --- a/web/src/immutant/web/internal/undertow.clj +++ b/web/src/immutant/web/internal/undertow.clj @@ -156,8 +156,8 @@ (extend-type io.undertow.websockets.spi.WebSocketHttpExchange ring/RingRequest - (server-port [x] (-> x .getRequestURI URI. .getPort)) - (server-name [x] (-> x .getRequestURI URI. .getHost)) + (server-port [x] (ring/server-port (reflect-exchange x))) + (server-name [x] (ring/server-name (reflect-exchange x))) (remote-addr [x] (ring/remote-addr (reflect-exchange x))) (uri [x] (.getRequestURI x)) (query-string [x] (.getQueryString x)) diff --git a/web/test-integration/immutant/web/integ_test.clj b/web/test-integration/immutant/web/integ_test.clj index 56efeab2..95e02043 100644 --- a/web/test-integration/immutant/web/integ_test.clj +++ b/web/test-integration/immutant/web/integ_test.clj @@ -122,7 +122,8 @@ :path-info "/" :scheme :http :request-method :get - :remote-addr "127.0.0.1")))) + :server-port (http-port) + :server-name "localhost")))) (deftest response-charset-should-be-honored (doseq [charset ["UTF-8" "Shift_JIS" "ISO-8859-1" "UTF-16" "US-ASCII"]]