> I have gotten your example to work with a bit of reading and
> modification (and thank you, I was after an example http server, this
> got me going):
A bit more hacking and it's possible to add/replace handlers after the
server has been started:
(import
'(java.io IOException OutputStream)
'(java.util Iterator List Set)
'(com.sun.net.httpserver Headers HttpExchange HttpHandler)
'(java.net InetSocketAddress)
'(java.util.concurrent Executors)
'(com.sun.net.httpserver HttpServer))
(defmacro with-response-print-stream [http-exchange var resp-code
content-type & body]
(let [ex-var (gensym)
hdrs-var (gensym)]
`(try
(do
(let [~hdrs-var (.getResponseHeaders ~http-exchange)]
(.add ~hdrs-var "Content-type: " ~content-type))
(.sendResponseHeaders ~http-exchange ~resp-code 0)
(let [~var (java.io.PrintStream. (.getResponseBody
~http-exchange))]
[EMAIL PROTECTED]
(.close ~var)))
(catch Throwable ~ex-var
(println (str "Error: " ~ex-var))))))
(defn start-server [port]
(let [server (. HttpServer create (new InetSocketAddress port) 0)]
(.setExecutor server (. Executors newCachedThreadPool))
(.start server)
server))
(defn server-add-handler [#^HttpServer server context handler-fn]
(let [handler (proxy [HttpHandler] []
(handle [#^HttpExchange exchange]
(handler-fn exchange)))]
(try
(.removeContext server context)
(catch Throwable ex
:was-not-present))
(.createContext server context handler))
nil)
(def server (start-server 8080))
(server-add-handler
server
"/"
(fn [#^HttpExchange exchange]
(with-response-print-stream exchange out 200 "text/html"
(.println out (str "<b>bold</b> and <i>italic</i>"))
(.println out (str "You should try: <a
href=\"/stuff/something/to/find?a=b\">this</a>, or <a
href=\"/time\">that</a> ")))))
(server-add-handler
server
"/stuff"
(fn [#^HttpExchange exchange]
(with-response-print-stream exchange out 200 "text/plain"
(.println out (str "You are in the /stuff context, asking for: "
(.getRequestURI exchange))))))
(server-add-handler
server
"/time"
(fn [#^HttpExchange exchange]
(with-response-print-stream exchange out 200 "text/plain"
(.println out (str "The time (at now) is: "
(java.util.Date.))))))
;; (.stop server 0)
I'm new to clojure so I'm sure this isn't good form, but it it useful
to me already.
Kyle
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---