To answer my own question: [#^HttpServletRequest request] {:server-port (.getServerPort request) :server-name (.getServerName request) :remote-addr (.getRemoteAddr request) :uri (.getRequestURI request) :query-string (.getQueryString request) :scheme (keyword (.getScheme request)) :request-method (keyword (.toLowerCase (.getMethod request))) :headers (reduce (fn [header-map #^String header-name] (assoc header-map (.toLowerCase header-name) (.getHeader request header-name))) {} (enumeration-seq (.getHeaderNames request))) :content-type (.getContentType request) :content-length (let [len (.getContentLength request)] (if (>= len 0) len)) :character-encoding (.getCharacterEncoding request) :body (.getInputStream request)})
Which by the way is awesome, because you function takes a map, which doesn't have to be created from an HttpServletRequest object. For the purposes of testing, you can just construct a map with the parts you want and pass that to your function. Great Work! On Tue, Jan 13, 2009 at 1:13 AM, Paul Barry <pauljbar...@gmail.com> wrote: > What's does the req object that is passed into the function have in it? > > > On Mon, Jan 12, 2009 at 11:45 PM, Mark McGranaghan <mmcgr...@gmail.com>wrote: > >> >> Hi All, >> >> I'm happy to announce the alpha release of 'Ring', a library inspired >> by Python's WSGI and Ruby's Rack for developing web applications in >> Clojure. >> >> I've made it as easy as humanly possible for you to try it out: >> >> git clone git://github.com/mmcgrana/ring.git >> cd ring >> java -Djava.ext.dirs=jars clojure.main src/ring/examples/ >> hello_world.clj >> >> And your up and running with your first Ring web app, which you can >> see at http://localhost:8080/ in your browser. >> >> The basic idea of Ring is that web apps are just Clojure functions >> that take a standardized request as a single argument and return and >> standardized response. For example, the hello_world.clj script from >> above is: >> >> (ns ring.examples.hello-world >> (:require ring.jetty) >> (:import java.util.Date java.text.SimpleDateFormat)) >> >> (def formatter (SimpleDateFormat. "HH:mm:ss")); >> >> (defn app >> [req] >> {:status 200 >> :headers {"Content-Type" "text/html"} >> :body (str "<h3>Hello World from Ring</h3>" >> "<p>The current time is " >> (.format formatter (Date.)) ".</p>")}) >> >> (ring.jetty/run {:port 8080} app) >> >> Its nice to be able to get to "Hello World" so quickly, but the real >> power of Ring is that apps are just functions - hence we can combine, >> wrap, curry, and generally manipulate them as first class values. >> >> For example, someone asked in #clojure today how they could make their >> web app provide a cleaned backtrace as an HTML response when it raised >> exceptions. To add such exception handling to our Hello World Ring app >> we would just use the ring.backtrace middleware: >> >> (ring.jetty/run {:port 8080} app) >> >> becomes >> >> (ring.jetty/run {:port 8080} >> (ring.backtrace/wrap >> app)) >> >> Similarly, one might want to have changes to a web app's code be >> reflected in real time in the development environment, so as to avoid >> constantly having to reboot the webserver. The ring.reload middleware >> accomplishes exactly that: >> >> (ring.jetty/run {:port 8080} >> (ring.backtrace/wrap >> (ring.reload/wrap '(ring.examples.hello-world) >> app) >> >> These are some of the features that originally motivated me to develop >> Ring, but the complete list of functionality available to Ring apps is >> larger and continues to grow: >> >> * ring.jetty: Handler for the Jetty webserver. >> * ring.file: Middleware that serves static files out of a public >> directory. >> * ring.file-info: Middleware that augments response headers with info >> about File responses. >> * ring.dump: Endpoint that dumps the Ring requests as HTML responses >> for debugging. >> * ring.show-exceptions: Middleware that catches exceptions and >> displays readable backtraces for debugging. >> * ring.reload: Middleware to automatically reload selected libs before >> each requests, minimizing server restarts. >> * ring.builder: Helpers for combining Ring endpoints and middleware >> into Ring apps. >> * ring.lint: Linter for the Ring interface, ensures compliance with >> the Ring spec. >> * ring.examples.*: Various example Ring apps. >> >> You can find more details about Ring at its project page on GitHub, >> including a README file for new users and a draft SPEC file that >> documents the Ring interface: >> >> http://github.com/mmcgrana/ring >> >> I've built an open source web app on Ring: http://cljre.com. The >> source for this simple app, available at >> http://github.com/mmcgrana/cljre.com, >> could serve as a good introduction to how apps can consume Ring >> requests and to the use of modular Ring middleware; see in particular >> the src/cljre/app.clj file, where most of that application is defined. >> >> Also, I think I should mention how I see Ring relating to the Java >> Servlet abstraction and to existing and new Clojure web frameworks. >> Ring heavily leverages the Servlet API internally, as I strongly >> believe in not reinventing wheels such as basic HTTP parsing. >> Furthermore, I think that the interface that Ring presents to Clojure >> web application developers by pre-processing the servlet requests is >> dramatically more useful than that of the raw servlet. Ring uses >> Servlets for what they are really good at - implementing HTTP - and >> presents a simple API against which additional logic can be defined in >> the application layer. >> >> In terms of Clojure web frameworks, I think that there is a lot to be >> gained by leveraging the Ring interface, especially from the modular >> functionality provided by Ring middleware. I'd like in particular to >> be able to run Compojure apps in Ring - if the users and authors of >> Compojure are interested I'd be happy to work with them to see what we >> can do. >> >> If you've made it this far, thanks a lot for reading! I welcome any >> comments or suggestions that you have about Ring, the draft SPEC >> document, or the Clojure web app space in general. >> >> Thanks again, >> - Mark >> >> >> >> > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---