Skip to content

Commit 6d17516

Browse files
committed
Refactor multipart file item parsing
1 parent c92f9a0 commit 6d17516

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

ring-core/src/ring/middleware/multipart_params.clj

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,29 +55,33 @@
5555
(defn- parse-content-type-charset [^FileItemStream item]
5656
(some->> (.getContentType item) parsing/find-content-type-charset))
5757

58+
(defn- parse-file-item [^FileItemStream item store]
59+
{:field? (.isFormField item)
60+
:name (.getFieldName item)
61+
:value (if (.isFormField item)
62+
{:bytes (IOUtils/toByteArray (.openStream item))
63+
:encoding (parse-content-type-charset item)}
64+
(store {:filename (.getName item)
65+
:content-type (.getContentType item)
66+
:stream (.openStream item)}))})
67+
68+
(defn- find-param [params name]
69+
(first (filter #(= name (:name %)) params)))
70+
5871
(defn- parse-html5-charset [params]
59-
(when-let [charset (->> params (filter #(= (first %) "_charset_")) first second :bytes)]
72+
(when-let [charset (some-> params (find-param "_charset_") :value :bytes)]
6073
(String. ^bytes charset "US-ASCII")))
6174

62-
(defn- decode-string-values [fallback-encoding forced-encoding params]
63-
(let [html5-encoding (parse-html5-charset params)]
64-
(for [[k v field?] params]
65-
[k (if field?
66-
(String. ^bytes (:bytes v) (str (or forced-encoding
67-
html5-encoding
68-
(:encoding v)
69-
fallback-encoding)))
70-
v)])))
75+
(defn- decode-form-field
76+
[{:keys [bytes encoding]} forced-encoding fallback-encoding]
77+
(String. ^bytes bytes (str (or forced-encoding encoding fallback-encoding))))
7178

72-
(defn- parse-file-item [^FileItemStream item store]
73-
[(.getFieldName item)
74-
(if (.isFormField item)
75-
{:bytes (IOUtils/toByteArray (.openStream item))
76-
:encoding (parse-content-type-charset item)}
77-
(store {:filename (.getName item)
78-
:content-type (.getContentType item)
79-
:stream (.openStream item)}))
80-
(.isFormField item)])
79+
(defn- decode-string-values [fallback-encoding forced-encoding params]
80+
(let [forced-encoding (or forced-encoding (parse-html5-charset params))]
81+
(for [{:keys [name value field?]} params]
82+
[name (if field?
83+
(decode-form-field value forced-encoding fallback-encoding)
84+
value)])))
8185

8286
(def ^:private default-store (delay (tf/temp-file-store)))
8387

0 commit comments

Comments
 (0)