summary refs log tree commit
diff options
context:
space:
mode:
authorJames Tucker <jftucker@gmail.com>2014-07-18 12:45:26 -0700
committerJames Tucker <jftucker@gmail.com>2014-07-18 12:46:35 -0700
commit1aff92c9ac533dac8cc0486443d1d88cb78ad5cc (patch)
treec1ae906dd3bb6a25e449cc63ebbd04ccd258db5b
parentaf68941bd0e1e2e58dcdc53f9191eefe32fb67fb (diff)
downloadrack-1aff92c9ac533dac8cc0486443d1d88cb78ad5cc.tar.gz
multipart content-type match now case insensitive
Closes #676

This may not be 100% to spec, but it is important for compatibility and should
not cause regressions.
-rw-r--r--lib/rack/multipart.rb2
-rw-r--r--test/spec_multipart.rb24
2 files changed, 25 insertions, 1 deletions
diff --git a/lib/rack/multipart.rb b/lib/rack/multipart.rb
index d67ff051..7a44c4d4 100644
--- a/lib/rack/multipart.rb
+++ b/lib/rack/multipart.rb
@@ -9,7 +9,7 @@ module Rack
 
     EOL = "\r\n"
     MULTIPART_BOUNDARY = "AaB03x"
-    MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|n
+    MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni
     TOKEN = /[^\s()<>,;:\\"\/\[\]?=]+/
     CONDISP = /Content-Disposition:\s*#{TOKEN}\s*/i
     DISPPARM = /;\s*(#{TOKEN})=("(?:\\"|[^"])*"|#{TOKEN})/
diff --git a/test/spec_multipart.rb b/test/spec_multipart.rb
index 069dc4d2..8b453bea 100644
--- a/test/spec_multipart.rb
+++ b/test/spec_multipart.rb
@@ -502,4 +502,28 @@ contents\r
     params["file"][:filename].should.equal('long' * 100)
   end
 
+  should "support mixed case metadata" do
+    file = multipart_file(:text)
+    data = File.open(file, 'rb') { |io| io.read }
+
+    type = "Multipart/Form-Data; Boundary=AaB03x"
+    length = data.respond_to?(:bytesize) ? data.bytesize : data.size
+
+    e = { "CONTENT_TYPE" => type,
+      "CONTENT_LENGTH" => length.to_s,
+      :input => StringIO.new(data) }
+
+    env = Rack::MockRequest.env_for("/", e)
+    params = Rack::Multipart.parse_multipart(env)
+    params["submit-name"].should.equal "Larry"
+    params["submit-name-with-content"].should.equal "Berry"
+    params["files"][:type].should.equal "text/plain"
+    params["files"][:filename].should.equal "file1.txt"
+    params["files"][:head].should.equal "Content-Disposition: form-data; " +
+      "name=\"files\"; filename=\"file1.txt\"\r\n" +
+      "Content-Type: text/plain\r\n"
+    params["files"][:name].should.equal "files"
+    params["files"][:tempfile].read.should.equal "contents"
+  end
+
 end