Skip to content

Commit

Permalink
Remove reflection in-container for ws upgrades [IMMUTANT-521]
Browse files Browse the repository at this point in the history
  • Loading branch information
jcrossley3 committed Jan 22, 2015
1 parent 68615cb commit e11dba8
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 28 deletions.
2 changes: 1 addition & 1 deletion project.clj
Expand Up @@ -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}}
Expand Down
39 changes: 15 additions & 24 deletions web/src/immutant/web/internal/servlet.clj
Expand Up @@ -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]
Expand Down Expand Up @@ -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))
Expand All @@ -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])
Expand Down Expand Up @@ -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]
Expand Down
4 changes: 2 additions & 2 deletions web/src/immutant/web/internal/undertow.clj
Expand Up @@ -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))
Expand Down
3 changes: 2 additions & 1 deletion web/test-integration/immutant/web/integ_test.clj
Expand Up @@ -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"]]
Expand Down

0 comments on commit e11dba8

Please sign in to comment.