<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -5,78 +5,38 @@
 ;; using this software in any fashion, you are agreeing to be bound by the
 ;; terms of this license. You must not remove this notice, or any other, from
 ;; this software.
+;; Modified by Adam Blinkinsop &lt;blinks@acm.org&gt; in August 2009.
 
 (ns compojure.http.multipart
   &quot;Add multipart form handling to Compojure. Relies on the Apache Commons
    FileUpload library.&quot;
   (:use clojure.contrib.def)
   (:use compojure.map-utils)
-  (:import org.apache.commons.fileupload.FileUpload)
-  (:import org.apache.commons.fileupload.RequestContext)
-  (:import org.apache.commons.fileupload.disk.DiskFileItemFactory)
-  (:import org.apache.commons.fileupload.disk.DiskFileItem))
+  (:import [org.apache.commons.fileupload.servlet ServletFileUpload]))
 
-(defn multipart-form?
-  &quot;Does a request have a multipart form?&quot;
+(defn multipart?
+  &quot;Does this request contain multipart content?&quot;
   [request]
-  (if-let [content-type (:content-type request)]
-    (.startsWith content-type &quot;multipart/form-data&quot;)))
+  (ServletFileUpload/isMultipartContent request))
 
-(defvar- file-upload
-  (FileUpload.
-    (doto (DiskFileItemFactory.)
-      (.setSizeThreshold -1)
-      (.setFileCleaningTracker nil)))
-  &quot;Uploader class to save multipart form values to temporary files.&quot;)
+(defvar- upload (ServletFileUpload.))
 
-(defn- request-context
-  &quot;Create a RequestContext object from a request map.&quot;
-  [request]
-  (proxy [RequestContext] []
-    (getContentType []       (:content-type request))
-    (getContentLength []     (:content-length request))
-    (getCharacterEncoding [] (:character-encoding request))
-    (getInputStream []       (:body request))))
-
-(defn- file-map
-  &quot;Create a file map from a DiskFileItem.&quot;
-  [#^DiskFileItem item]
-  {:disk-file-item item
-   :filename       (.getName item)
-   :size           (.getSize item)
-   :content-type   (.getContentType item)
-   :tempfile       (.getStoreLocation item)})
-
-(defn parse-multipart-params
-  &quot;Parse a map of multipart parameters from the request.&quot;
-  [request]
-  (reduce
-    (fn [param-map, #^DiskFileItem item]
-      (assoc-vec param-map
-        (keyword (.getFieldName item))
-        (if (.isFormField item)
-          (if (zero? (.getSize item))
-            &quot;&quot;
-            (.getString item))
-          (file-map item))))
-    {}
-    (.parseRequest
-       file-upload
-       (request-context request))))
+(defn field-seq
+  &quot;Map field names to values, which will either be a simple string or map.
 
-(defn get-multipart-params
-  &quot;Retrieve multipart params from the request.&quot;
+  Multipart values will be maps with content-type, name (original filename),
+  and stream (an open input stream object).&quot;
   [request]
-  (if (multipart-form? request)
-    (parse-multipart-params request)
-    {}))
+  (map (fn [i] {(keyword (.getFieldName i))
+                (if (.isFormField i)
+                  (.getParameter request (.getFieldName i))
+                  {:content-type (.getContentType i)
+                   :name (.getName i)
+                   :stream (.openStream i)})})
+       (.getItemIterator upload request)))
 
 (defn with-multipart
-  &quot;Decorate a Ring handler with multipart parameters.&quot;
   [handler]
   (fn [request]
-    (let [params  (get-multipart-params request)
-          request (-&gt; request
-                    (assoc :multipart-params params)
-                    (assoc :params (merge (request :params) params)))]
+    (let [req (merge request {:params (merge (field-seq request))})]
       (handler request))))</diff>
      <filename>src/compojure/http/multipart.clj</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>e365932c8f799f03b1318bf19845559df9648174</id>
    </parent>
    <parent>
      <id>1e5ab06c5d9a6cc4c94fdd76b0991f3d80bd61fa</id>
    </parent>
  </parents>
  <author>
    <name>weavejester</name>
    <email>jreeves@weavejester.com</email>
  </author>
  <url>http://github.com/abedra/compojure/commit/dd36e217de2ea968eca1953a0b9d5a81b54d0d9c</url>
  <id>dd36e217de2ea968eca1953a0b9d5a81b54d0d9c</id>
  <committed-date>2009-10-14T11:19:56-07:00</committed-date>
  <authored-date>2009-10-14T11:16:37-07:00</authored-date>
  <message>Rewritten multipart library to use ServletFileUpload courtesy of Adam
Blinkinsop</message>
  <tree>517024db34c7fa53d36e025a47e605a9d21943b3</tree>
  <committer>
    <name>weavejester</name>
    <email>jreeves@weavejester.com</email>
  </committer>
</commit>
