summary refs log tree commit
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2015-08-28 17:06:26 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2015-08-28 17:16:55 -0700
commitda3f2e00e0ad37a43aba760cf5c3df068cb99239 (patch)
tree3dd91747f4f3f3c58ffae3a2568982d735e0ec9b
parenta1585b1131e7e492f2c7df6a94b5d5796975e4ed (diff)
downloadrack-da3f2e00e0ad37a43aba760cf5c3df068cb99239.tar.gz
move parser loop away from io
-rw-r--r--lib/rack/multipart/parser.rb40
1 files changed, 23 insertions, 17 deletions
diff --git a/lib/rack/multipart/parser.rb b/lib/rack/multipart/parser.rb
index ce79d89f..d8d06b55 100644
--- a/lib/rack/multipart/parser.rb
+++ b/lib/rack/multipart/parser.rb
@@ -173,30 +173,19 @@ module Rack
         @collector = Collector.new tempfile
       end
 
-      def read_data
-        content = @io.read(@bufsize)
+      def on_read content
         handle_empty_content!(content)
         @buf << content
+
+        run_parser
       end
 
       def parse
-        read_data
-
+        on_read @io.read(@bufsize)
         loop do
-          case @state
-          when :FAST_FORWARD
-            next unless handle_fast_forward == :want_read
-          when :CONSUME_TOKEN
-            next unless handle_consume_token == :want_read
-          when :MIME_HEAD
-            next unless handle_mime_head == :want_read
-          when :MIME_BODY
-            next unless handle_mime_body == :want_read
-          when :DONE
-            break
-          end
+          break if @state == :DONE
 
-          read_data
+          on_read @io.read(@bufsize)
         end
 
         @collector.each do |part|
@@ -213,6 +202,23 @@ module Rack
 
       private
 
+      def run_parser
+        loop do
+          case @state
+          when :FAST_FORWARD
+            break if handle_fast_forward == :want_read
+          when :CONSUME_TOKEN
+            break if handle_consume_token == :want_read
+          when :MIME_HEAD
+            break if handle_mime_head == :want_read
+          when :MIME_BODY
+            break if handle_mime_body == :want_read
+          when :DONE
+            break
+          end
+        end
+      end
+
       def handle_fast_forward
         if consume_boundary
           @state = :MIME_HEAD