summary refs log tree commit
diff options
context:
space:
mode:
authorJeremy Daer <jeremydaer@gmail.com>2017-07-19 12:54:36 -0600
committerGitHub <noreply@github.com>2017-07-19 12:54:36 -0600
commit3682c0b4a02f8d95eb2044f6f333e6cd7e97a9b5 (patch)
tree5cc94af0567ffd743ceb8366dc14bddbdd04e598
parentcace56c92562ef7edf2115959d94a0f88581b54a (diff)
parent9279d3bf87cd30083f87287a6ef81f3baf2308f7 (diff)
downloadrack-3682c0b4a02f8d95eb2044f6f333e6cd7e97a9b5.tar.gz
Merge pull request #1179 from tompng/master
Large file upload performance fix
-rw-r--r--lib/rack/multipart/parser.rb12
1 files changed, 7 insertions, 5 deletions
diff --git a/lib/rack/multipart/parser.rb b/lib/rack/multipart/parser.rb
index e2e821ac..e324be82 100644
--- a/lib/rack/multipart/parser.rb
+++ b/lib/rack/multipart/parser.rb
@@ -166,6 +166,7 @@ module Rack
 
       def initialize(boundary, tempfile, bufsize, query_parser)
         @buf            = String.new
+        @buf_rx_start   = 0
 
         @query_parser   = query_parser
         @params         = query_parser.make_params
@@ -174,6 +175,7 @@ module Rack
         @bufsize        = bufsize
 
         @rx = /(?:#{EOL})?#{Regexp.quote(@boundary)}(#{EOL}|--)/n
+        @rx_max_size = EOL.size + @boundary.size + [EOL.size, '--'.size].max
         @full_boundary = @boundary
         @end_boundary = @boundary + '--'
         @state = :FAST_FORWARD
@@ -263,15 +265,15 @@ module Rack
       end
 
       def handle_mime_body
-        if @buf =~ rx
+        if i = @buf.index(rx, @buf_rx_start)
           # Save the rest.
-          if i = @buf.index(rx)
-            @collector.on_mime_body @mime_index, @buf.slice!(0, i)
-            @buf.slice!(0, 2) # Remove \r\n after the content
-          end
+          @collector.on_mime_body @mime_index, @buf.slice!(0, i)
+          @buf.slice!(0, 2) # Remove \r\n after the content
+          @buf_rx_start = 0 # Reset rx search position
           @state = :CONSUME_TOKEN
           @mime_index += 1
         else
+          @buf_rx_start = [@buf_rx_start, @buf.size - @rx_max_size].max
           :want_read
         end
       end