How to get HttpServletRequest in a Ring handler?

1.1k Views Asked by At

Is there a way to get the HttpServletRequest object in a Ring handler? I am using Noir to develope a web app. I need to get the HttpServletRequest obj when handling a URI. So I use the (noir.request.ring-request) function to get back the ring request map which contains :servlet-request key, but the value is nil. Is this the right way to do it or do I miss something?

following is the code:

(ns my-app
     (:use noir.request))
(defpage [:get "/app"] []
     (str (ring-request)))

the result:

{:remote-addr "127.0.0.1", :scheme :http, :query-params {}, :session {}, :form-params {}, :multipart-params {}, :servlet #, :request-method :get, :query-string nil, :content-type nil, :cookies {"ring-session" {:value "eb509a65-d33a-40d2-9646-e2ff785428b0"}}, :uri "/app", :server-name "127.0.0.1", :params {}, :headers {"cookie" "ring-session=eb509a65-d33a-40d2-9646-e2ff785428b0", "accept-charset" "GBK,utf-8;q=0.7,*;q=0.3", "accept-language" "en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4", "accept-encoding" "gzip,deflate,sdch", "accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "user-agent" "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.106 Safari/535.2", "connection" "keep-alive", "host" "127.0.0.1:8080"}, :servlet-request #, :content-length nil, :server-port 8080, :character-encoding nil, :servlet-response #, :body #, :servlet-context #}
1

There are 1 best solutions below

0
Aaron Iba On

It looks like the ring request map is constructed based on the adapter you are using for the webserver. In the case of jetty, this happens in ring.adapter.jetty:

https://github.com/ring-clojure/ring/blob/master/ring-jetty-adapter/src/ring/adapter/jetty.clj

If I were you, I would create my own adapter that explicitly adds what you need to the request map. Specifically you would replace

request-map (servlet/build-request-map request)

with something like:

request-map (assoc (servlet/build-request-map request) :jetty-request request)