Hey all,
I wrote a clojure version of the simplest functionality of wget. I
basically translated the java version into clojure code, but I'm not
quite happy with the wget-binary function because I use a loop, and I
feel like someone else has a more idiomatic solution to iterating
through a java-array. Also, I don't know if my way of handling the no
filename case is best. Please tell me how to improve my code,
especially in the interop sections.
(ns dj
(:import [java.io File FileOutputStream BufferedInputStream
BufferedReader InputStreamReader])
(:import [java.net URL])
(:require [clojure.contrib [duck-streams :as duck-streams]]))
(defn blank?
"True if s is nil, empty, or contains only whitespace."
[#^String s]
(every? (fn [#^Character c] (Character/isWhitespace c)) s))
(defn- extract-url-filename [url]
(let [filename (.getFile url)]
(if (blank? filename)
"index.html"
(subs filename 1))))
(defn- wget-binary [con content-length]
(with-open [stream (BufferedInputStream. (.getInputStream con))]
(let [data (make-array Byte/TYPE content-length)]
(loop [offset 0]
(if (< offset content-length)
(let [bytesRead (.read stream
data
offset
(- content-length
offset))]
(if (= bytesRead -1)
data
(recur (+ offset bytesRead))))
data)))))
(defn- wget-text [url-obj]
(with-open [buf (-> url-obj
(.openStream)
(InputStreamReader.)
(BufferedReader.))]
(apply str (line-seq buf))))
(defn wget [url-address]
(let [url (URL. url-address)
filename (extract-url-filename url)
con (.openConnection url)
content-length (.getContentLength con)]
(if (or (= -1 content-length)
(.startsWith (.getContentType con) "text/"))
(duck-streams/spit filename (wget-text url))
(with-open [out-file (FileOutputStream. filename)]
(.write out-file (wget-binary con content-length))))))
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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