ring-clojure / ring

Clojure HTTP server abstraction
MIT License
3.76k stars 519 forks source link

Automatic transfer-decoding of file content for multipart-params #260

Open dmichulke opened 8 years ago

dmichulke commented 8 years ago

When receiving a file via multipart-params, there is an (optional) key "Content-Transfer-Encoding" with values 7bit (default), 8bit, binary and base64.

Depending on these values, the file or byte array (depending on the store used) should automatically be decoded to its original form.

Using Java7 or higher, one can use (.decode (java.util.Base64/getDecoder) bytes) to receive a new byte array with the real payload.

This is an issue because upon receiving the data, the multpart-params middleware has the "Content-Transfer-Encoding" parameters available to select the correct decoding mechanism. But since the Content-Transfer-Encoding value is not transmitted further down the line, the actual consumer of the file has to guess the real Content-Transfer-Encoding.

dmichulke commented 8 years ago

As a current workaround for guessing whether the data is still base64 encoded I use

(if (every? #(<= (int \+) % (int \z)) (seq bytes))
    (.decode (Base64/getDecoder) bytes)
    bytes)
dmichulke commented 8 years ago

In a related stack overflow post, there is a discussion as to whether this is a bug in the software (PHP in this case) or in the RFC:

http://stackoverflow.com/questions/5169434/content-transfer-encoding-in-file-uploading-request#5487532