summary refs log tree commit
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2022-04-27 08:14:33 +1200
committerGitHub <noreply@github.com>2022-04-27 08:14:33 +1200
commit11b4ac5237b25ba773ca519cc4e508c9008bed65 (patch)
treeb3e6068e8ebe79ce3ba0d8ba793f08d4755ab8e6
parented308ff555ae0aeff465044be92bc6bcbc3ddaaa (diff)
downloadrack-11b4ac5237b25ba773ca519cc4e508c9008bed65.tar.gz
Remove `Rack::Multipart` dependency on `Rack::Request`. (#1872)
-rw-r--r--lib/rack/multipart.rb37
-rw-r--r--lib/rack/multipart/generator.rb1
-rw-r--r--test/spec_multipart.rb1
-rw-r--r--test/spec_request.rb9
4 files changed, 28 insertions, 20 deletions
diff --git a/lib/rack/multipart.rb b/lib/rack/multipart.rb
index f88e4fd2..d6021f8c 100644
--- a/lib/rack/multipart.rb
+++ b/lib/rack/multipart.rb
@@ -3,6 +3,9 @@
 require_relative 'constants'
 require_relative 'utils'
 
+require_relative 'multipart/parser'
+require_relative 'multipart/generator'
+
 module Rack
   # A multipart form data parser, adapted from IOWA.
   #
@@ -12,20 +15,25 @@ module Rack
 
     class << self
       def parse_multipart(env, params = Rack::Utils.default_query_parser)
-        extract_multipart Rack::Request.new(env), params
+        io = env[RACK_INPUT]
+        
+        if content_length = env['CONTENT_LENGTH']
+          content_length = content_length.to_i
+        end
+        
+        content_type = env['CONTENT_TYPE']
+        
+        tempfile = env[RACK_MULTIPART_TEMPFILE_FACTORY] || Parser::TEMPFILE_FACTORY
+        bufsize = env[RACK_MULTIPART_BUFFER_SIZE] || Parser::BUFSIZE
+        
+        info = Parser.parse(io, content_length, content_type, tempfile, bufsize, params)
+        env[RACK_TEMPFILES] = info.tmp_files
+        
+        return info.params
       end
 
-      def extract_multipart(req, params = Rack::Utils.default_query_parser)
-        io = req.get_header(RACK_INPUT)
-        content_length = req.content_length
-        content_length = content_length.to_i if content_length
-
-        tempfile = req.get_header(RACK_MULTIPART_TEMPFILE_FACTORY) || Parser::TEMPFILE_FACTORY
-        bufsize = req.get_header(RACK_MULTIPART_BUFFER_SIZE) || Parser::BUFSIZE
-
-        info = Parser.parse io, content_length, req.get_header('CONTENT_TYPE'), tempfile, bufsize, params
-        req.set_header(RACK_TEMPFILES, info.tmp_files)
-        info.params
+      def extract_multipart(request, params = Rack::Utils.default_query_parser)
+        parse_multipart(request.env)
       end
 
       def build_multipart(params, first = true)
@@ -34,8 +42,3 @@ module Rack
     end
   end
 end
-
-require_relative 'request' unless defined?(Rack::Request)
-require_relative 'multipart/parser'
-require_relative 'multipart/uploaded_file' unless defined?(Rack::Multipart::UploadedFile)
-require_relative 'multipart/generator' unless defined?(Rack::Multipart::Generator)
diff --git a/lib/rack/multipart/generator.rb b/lib/rack/multipart/generator.rb
index f871bd36..6d7015a1 100644
--- a/lib/rack/multipart/generator.rb
+++ b/lib/rack/multipart/generator.rb
@@ -1,5 +1,6 @@
 # frozen_string_literal: true
 
+require_relative 'uploaded_file'
 
 module Rack
   module Multipart
diff --git a/test/spec_multipart.rb b/test/spec_multipart.rb
index 8683cbc2..8a214111 100644
--- a/test/spec_multipart.rb
+++ b/test/spec_multipart.rb
@@ -9,6 +9,7 @@ separate_testing do
   require_relative '../lib/rack/mock'
   require_relative '../lib/rack/query_parser'
   require_relative '../lib/rack/utils'
+  require_relative '../lib/rack/request'
 end
 
 describe Rack::Multipart do
diff --git a/test/spec_request.rb b/test/spec_request.rb
index 4786ebac..58e42372 100644
--- a/test/spec_request.rb
+++ b/test/spec_request.rb
@@ -14,6 +14,11 @@ end
 class RackRequestTest < Minitest::Spec
   it "copies the env when duping" do
     req = make_request(Rack::MockRequest.env_for("http://example.com:8080/"))
+
+    if req.delegate?
+      skip "delegate requests don't dup environments"
+    end
+
     refute_same req.env, req.dup.env
   end
 
@@ -1857,7 +1862,7 @@ EOF
       include Rack::Request::Helpers
       extend Forwardable
 
-      def_delegators :@req, :has_header?, :get_header, :fetch_header,
+      def_delegators :@req, :env, :has_header?, :get_header, :fetch_header,
         :each_header, :set_header, :add_header, :delete_header
 
       def_delegators :@req, :[], :[]=, :values_at
@@ -1867,8 +1872,6 @@ EOF
       end
 
       def delegate?; true; end
-
-      def env; @req.env.dup; end
     end
 
     def make_request(env)