<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -5,38 +5,78 @@
 ;; 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.servlet ServletFileUpload]))
+  (: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))
 
-(defn multipart?
-  &quot;Does this request contain multipart content?&quot;
+(defn multipart-form?
+  &quot;Does a request have a multipart form?&quot;
   [request]
-  (ServletFileUpload/isMultipartContent request))
+  (if-let [content-type (:content-type request)]
+    (.startsWith content-type &quot;multipart/form-data&quot;)))
 
-(defvar- upload (ServletFileUpload.))
+(defvar- file-upload
+  (FileUpload.
+    (doto (DiskFileItemFactory.)
+      (.setSizeThreshold -1)
+      (.setFileCleaningTracker nil)))
+  &quot;Uploader class to save multipart form values to temporary files.&quot;)
 
-(defn field-seq
-  &quot;Map field names to values, which will either be a simple string or map.
+(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))))
 
-  Multipart values will be maps with content-type, name (original filename),
-  and stream (an open input stream object).&quot;
+(defn get-multipart-params
+  &quot;Retrieve multipart params from the request.&quot;
   [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)))
+  (if (multipart-form? request)
+    (parse-multipart-params request)
+    {}))
 
 (defn with-multipart
+  &quot;Decorate a Ring handler with multipart parameters.&quot;
   [handler]
   (fn [request]
-    (let [req (merge request {:params (merge (field-seq request))})]
+    (let [params  (get-multipart-params request)
+          request (-&gt; request
+                    (assoc :multipart-params params)
+                    (assoc :params (merge (request :params) params)))]
       (handler request))))</diff>
      <filename>src/compojure/http/multipart.clj</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>1361dc3c7f33e74abc8e2900a5317518fac06df7</id>
    </parent>
  </parents>
  <author>
    <name>weavejester</name>
    <email>jreeves@weavejester.com</email>
  </author>
  <url>http://github.com/abedra/compojure/commit/6bd4a3232117a2c1ca101a910f091bb36c1e3b32</url>
  <id>6bd4a3232117a2c1ca101a910f091bb36c1e3b32</id>
  <committed-date>2009-11-02T12:57:38-08:00</committed-date>
  <authored-date>2009-11-02T12:57:38-08:00</authored-date>
  <message>Revert &quot;Rewritten multipart library to use ServletFileUpload courtesy of Adam&quot;

This reverts commit dd36e217de2ea968eca1953a0b9d5a81b54d0d9c.</message>
  <tree>9533199b88eb957e1e4fee163c07888630b7a5ac</tree>
  <committer>
    <name>weavejester</name>
    <email>jreeves@weavejester.com</email>
  </committer>
</commit>
