Thanks Steve. The code is called by another function that handles the
agent state so no it is not called directly. Here is the additional
code (it is a simple Newbie web server learning project):
Here is how the web server is run:
========================
(ws-run 3000 wh-handler)
The web server:
===========
(import '(java.io BufferedReader InputStreamReader PrintWriter))
;*******************************************************************;
(defn reader-make-from-socket [socket]
(BufferedReader. (InputStreamReader. (.getInputStream socket))))
;*******************************************************************;
(def lines-read-max 100)
(defn lines-read [reader lines]
(let [line (.readLine reader)]
(cond
(= line nil)
[]
(= line "")
lines
(> (count lines) lines-read-max) lines
true
(lines-read reader (concat lines [line])))))
;*******************************************************************;
(defn http-line-to-arg [cmd line]
(let [key (first (re-seq #"\S+:" line))]
(let [value (apply str (drop (count key) line))]
(conj cmd {(apply str (drop-last key)) (apply str (drop 1
value))}))))
(defn http-line-to-url [line]
(let [[cmd url http] (re-seq #"\S+" line)]
{"Cmd" cmd "Url" url "Http" http}))
;*******************************************************************;
(defn cmd-make-from-http-lines2 [cmd lines]
(if (= (first lines) nil)
cmd
(cmd-make-from-http-lines2 (http-line-to-arg cmd (first lines))
(rest lines))))
(defn cmd-make-from-http-lines [lines]
(if (= (first lines) nil)
{}
(cmd-make-from-http-lines2 (http-line-to-url (first lines))
(rest
lines))))
(defn cmd-print [cmd]
(let [ks (sort (keys cmd))]
(println "Cmd:")
(doseq [k ks]
(println (format " \"%s\" => \"%s\"" k (cmd k))))))
(defn cmd-read [socket]
(let [reader (reader-make-from-socket socket) lines (lines-read
reader []) cmd (cmd-make-from-http-lines lines)]
(cmd-print cmd)
(conj cmd {:socket socket})))
;*******************************************************************;
(defn ws-agent [agentCounter socket fn]
(let [cmd (cmd-read socket)]
(fn cmd)
(.close socket)
(+ agentCounter 1)))
(defn ws-accept [socket tasks fn]
(println (format "Server accepting (clients done %d)" (deref tasks)))
(let [client (.accept socket)]
(send-off tasks ws-agent client fn)))
(defn ws-run [port fn]
(let [socket (java.net.ServerSocket. port) tasks (agent 0)]
(dotimes [i 3] (ws-accept socket tasks fn))
(await tasks)
(println (format "Server done (%d clients)" (deref tasks)))
(.close socket)))
The web handler
============
(load-file "Web Server.clj")
;*******************************************************************;
(defn http-write-ok [out]
(.write out "HTTP/1.1 200 OK\r\n\r\n"))
;*******************************************************************;
(defn html-write-head [out]
(.write out "<html><body>"))
(defn html-write-tail [out]
(.write out "</html></body>"))
; THIS IS WHERE IT GOES WRONG IF I CHANGE (keys cmd) to (sort (keys
cmd)):
(defn html-write-cmd [out cmd]
(doseq [key (keys cmd)]
(.write out
(format "<b>\"%s\"</b> => \"%s\"<br>" key (cmd key)))))
(defn html-write-test [out cmd]
(http-write-ok out)
(html-write-head out)
(.write out "<h1>Hello from Clojure!</h1>")
(.write out (str "<h2>" (System/currentTimeMillis) "</h2>"))
(html-write-cmd out cmd)
(html-write-tail out))
;*******************************************************************;
(defn wh-make-writer [socket]
(PrintWriter. (.getOutputStream socket)))
(defn wh-write-test [cmd]
(let [out (wh-make-writer (cmd :socket))]
(html-write-test out cmd)
(.flush out)))
;*******************************************************************;
(defn wh-handler [cmd]
(wh-write-test cmd))
;*******************************************************************;
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---