> 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 clojure@googlegroups.com
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to