@@ -293,7 +293,7 @@ module Multipart
293293
294294 def self . parse_multipart ( env )
295295 unless env [ 'CONTENT_TYPE' ] =~
296- %r|\A multipart/form-data .*boundary=\" ?([^\" ;,]+)\" ?|n
296+ %r|\A multipart/.*boundary=\" ?([^\" ;,]+)\" ?|n
297297 nil
298298 else
299299 boundary = "--#{ $1} "
@@ -319,15 +319,15 @@ def self.parse_multipart(env)
319319 filename = content_type = name = nil
320320
321321 until head && buf =~ rx
322- if !head && i = buf . index ( " \r \n \r \n " )
322+ if !head && i = buf . index ( EOL + EOL )
323323 head = buf . slice! ( 0 , i +2 ) # First \r\n
324324 buf . slice! ( 0 , 2 ) # Second \r\n
325325
326326 filename = head [ /Content-Disposition:.* filename="?([^\" ;]*)"?/ni , 1 ]
327- content_type = head [ /Content-Type: (.*)\r \n /ni , 1 ]
328- name = head [ /Content-Disposition:.* name="?([^\" ;]*)"?/ni , 1 ]
327+ content_type = head [ /Content-Type: (.*)#{ EOL } /ni , 1 ]
328+ name = head [ /Content-Disposition:.*\s + name="?([^\" ;]*)"?/ni , 1 ] || head [ /Content-ID: \s *([^ #{ EOL } ]*) /ni, 1 ]
329329
330- if filename
330+ if content_type || filename
331331 body = Tempfile . new ( "RackMultipart" )
332332 body . binmode if body . respond_to? ( :binmode )
333333 end
@@ -369,6 +369,12 @@ def self.parse_multipart(env)
369369
370370 data = { :filename => filename , :type => content_type ,
371371 :name => name , :tempfile => body , :head => head }
372+ elsif !filename && content_type
373+ body . rewind
374+
375+ # Generic multipart cases, not coming from a form
376+ data = { :type => content_type ,
377+ :name => name , :tempfile => body , :head => head }
372378 else
373379 data = body
374380 end
0 commit comments