diff options
author | James Tucker <jftucker@gmail.com> | 2014-07-18 12:45:26 -0700 |
---|---|---|
committer | James Tucker <jftucker@gmail.com> | 2014-07-18 12:46:35 -0700 |
commit | 1aff92c9ac533dac8cc0486443d1d88cb78ad5cc (patch) | |
tree | c1ae906dd3bb6a25e449cc63ebbd04ccd258db5b | |
parent | af68941bd0e1e2e58dcdc53f9191eefe32fb67fb (diff) | |
download | rack-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.rb | 2 | ||||
-rw-r--r-- | test/spec_multipart.rb | 24 |
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 |