summary refs log tree commit
diff options
context:
space:
mode:
authorJeremy Evans <code@jeremyevans.net>2022-04-13 12:43:04 -0700
committerJeremy Evans <code@jeremyevans.net>2022-04-13 15:35:02 -0700
commitcd4b3c934a8681f5d15053295b7dc34d56b2ccad (patch)
tree6d8023046a1864b203139e1ae55d7949a9f3bca8
parent7849def2962ebc1f551c7bb6ad88c697c1740715 (diff)
downloadrack-cd4b3c934a8681f5d15053295b7dc34d56b2ccad.tar.gz
Remove autoloads of Multipart::UploadedFile and Multipart::Generator
With this and the webrick handler autoload removal, rack is autoload
free if you do not require rack itself, and only require the parts
of rack you are using.

Take care to avoid the circular requires when switching from
autoload to require_relative.

Move Multipart::Parser specific constants into multipart/parser.rb.

MULTIPART_BOUNDARY is used also in Multipart::Generator, so leave
that in multipart.rb.

Move require_relative calls to avoid circular require warnings.
-rw-r--r--lib/rack/multipart.rb31
-rw-r--r--lib/rack/multipart/generator.rb4
-rw-r--r--lib/rack/multipart/parser.rb29
-rw-r--r--lib/rack/multipart/uploaded_file.rb3
4 files changed, 35 insertions, 32 deletions
diff --git a/lib/rack/multipart.rb b/lib/rack/multipart.rb
index 5f4e3bf4..f88e4fd2 100644
--- a/lib/rack/multipart.rb
+++ b/lib/rack/multipart.rb
@@ -8,35 +8,7 @@ module Rack
   #
   # Usually, Rack::Request#POST takes care of calling this.
   module Multipart
-    autoload :UploadedFile, 'rack/multipart/uploaded_file'
-    autoload :Generator, 'rack/multipart/generator'
-
-    EOL = "\r\n"
     MULTIPART_BOUNDARY = "AaB03x"
-    MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni
-    TOKEN = /[^\s()<>,;:\\"\/\[\]?=]+/
-    CONDISP = /content-disposition:\s*#{TOKEN}\s*/i
-    VALUE = /"(?:\\"|[^"])*"|#{TOKEN}/
-    BROKEN_QUOTED = /^#{CONDISP}.*;\s*filename="(.*?)"(?:\s*$|\s*;\s*#{TOKEN}=)/i
-    BROKEN_UNQUOTED = /^#{CONDISP}.*;\s*filename=(#{TOKEN})/i
-    MULTIPART_CONTENT_TYPE = /content-type: (.*)#{EOL}/ni
-    MULTIPART_CONTENT_DISPOSITION = /content-disposition:.*;\s*name=(#{VALUE})/ni
-    MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
-    # Updated definitions from RFC 2231
-    ATTRIBUTE_CHAR = %r{[^ \t\v\n\r)(><@,;:\\"/\[\]?='*%]}
-    ATTRIBUTE = /#{ATTRIBUTE_CHAR}+/
-    SECTION = /\*[0-9]+/
-    REGULAR_PARAMETER_NAME = /#{ATTRIBUTE}#{SECTION}?/
-    REGULAR_PARAMETER = /(#{REGULAR_PARAMETER_NAME})=(#{VALUE})/
-    EXTENDED_OTHER_NAME = /#{ATTRIBUTE}\*[1-9][0-9]*\*/
-    EXTENDED_OTHER_VALUE = /%[0-9a-fA-F]{2}|#{ATTRIBUTE_CHAR}/
-    EXTENDED_OTHER_PARAMETER = /(#{EXTENDED_OTHER_NAME})=(#{EXTENDED_OTHER_VALUE}*)/
-    EXTENDED_INITIAL_NAME = /#{ATTRIBUTE}(?:\*0)?\*/
-    EXTENDED_INITIAL_VALUE = /[a-zA-Z0-9\-]*'[a-zA-Z0-9\-]*'#{EXTENDED_OTHER_VALUE}*/
-    EXTENDED_INITIAL_PARAMETER = /(#{EXTENDED_INITIAL_NAME})=(#{EXTENDED_INITIAL_VALUE})/
-    EXTENDED_PARAMETER = /#{EXTENDED_INITIAL_PARAMETER}|#{EXTENDED_OTHER_PARAMETER}/
-    DISPPARM = /;\s*(?:#{REGULAR_PARAMETER}|#{EXTENDED_PARAMETER})\s*/
-    RFC2183 = /^#{CONDISP}(#{DISPPARM})+$/i
 
     class << self
       def parse_multipart(env, params = Rack::Utils.default_query_parser)
@@ -60,9 +32,10 @@ module Rack
         Generator.new(params, first).dump
       end
     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 fdad3406..f871bd36 100644
--- a/lib/rack/multipart/generator.rb
+++ b/lib/rack/multipart/generator.rb
@@ -1,10 +1,12 @@
 # frozen_string_literal: true
 
-require_relative '../multipart'
 
 module Rack
   module Multipart
     class Generator
+
+      require_relative '../multipart' unless defined?(Rack::Multipart)
+
       def initialize(params, first = true)
         @params, @first = params, first
 
diff --git a/lib/rack/multipart/parser.rb b/lib/rack/multipart/parser.rb
index 9f2346a6..8c5f0a10 100644
--- a/lib/rack/multipart/parser.rb
+++ b/lib/rack/multipart/parser.rb
@@ -3,7 +3,6 @@
 require 'strscan'
 
 require_relative '../utils'
-require_relative '../multipart' unless defined?(Rack::Multipart)
 
 module Rack
   module Multipart
@@ -13,7 +12,35 @@ module Rack
     # that ends early.
     class EmptyContentError < ::EOFError; end
 
+    EOL = "\r\n"
+    MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni
+    TOKEN = /[^\s()<>,;:\\"\/\[\]?=]+/
+    CONDISP = /Content-Disposition:\s*#{TOKEN}\s*/i
+    VALUE = /"(?:\\"|[^"])*"|#{TOKEN}/
+    BROKEN_QUOTED = /^#{CONDISP}.*;\s*filename="(.*?)"(?:\s*$|\s*;\s*#{TOKEN}=)/i
+    BROKEN_UNQUOTED = /^#{CONDISP}.*;\s*filename=(#{TOKEN})/i
+    MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni
+    MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*;\s*name=(#{VALUE})/ni
+    MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni
+    # Updated definitions from RFC 2231
+    ATTRIBUTE_CHAR = %r{[^ \t\v\n\r)(><@,;:\\"/\[\]?='*%]}
+    ATTRIBUTE = /#{ATTRIBUTE_CHAR}+/
+    SECTION = /\*[0-9]+/
+    REGULAR_PARAMETER_NAME = /#{ATTRIBUTE}#{SECTION}?/
+    REGULAR_PARAMETER = /(#{REGULAR_PARAMETER_NAME})=(#{VALUE})/
+    EXTENDED_OTHER_NAME = /#{ATTRIBUTE}\*[1-9][0-9]*\*/
+    EXTENDED_OTHER_VALUE = /%[0-9a-fA-F]{2}|#{ATTRIBUTE_CHAR}/
+    EXTENDED_OTHER_PARAMETER = /(#{EXTENDED_OTHER_NAME})=(#{EXTENDED_OTHER_VALUE}*)/
+    EXTENDED_INITIAL_NAME = /#{ATTRIBUTE}(?:\*0)?\*/
+    EXTENDED_INITIAL_VALUE = /[a-zA-Z0-9\-]*'[a-zA-Z0-9\-]*'#{EXTENDED_OTHER_VALUE}*/
+    EXTENDED_INITIAL_PARAMETER = /(#{EXTENDED_INITIAL_NAME})=(#{EXTENDED_INITIAL_VALUE})/
+    EXTENDED_PARAMETER = /#{EXTENDED_INITIAL_PARAMETER}|#{EXTENDED_OTHER_PARAMETER}/
+    DISPPARM = /;\s*(?:#{REGULAR_PARAMETER}|#{EXTENDED_PARAMETER})\s*/
+    RFC2183 = /^#{CONDISP}(#{DISPPARM})+$/i
+
     class Parser
+      require_relative '../multipart' unless defined?(Rack::Multipart)
+
       BUFSIZE = 1_048_576
       TEXT_PLAIN = "text/plain"
       TEMPFILE_FACTORY = lambda { |filename, content_type|
diff --git a/lib/rack/multipart/uploaded_file.rb b/lib/rack/multipart/uploaded_file.rb
index a8db0931..1134704b 100644
--- a/lib/rack/multipart/uploaded_file.rb
+++ b/lib/rack/multipart/uploaded_file.rb
@@ -2,11 +2,12 @@
 
 require 'tempfile'
 require 'fileutils'
-require_relative '../multipart'
 
 module Rack
   module Multipart
     class UploadedFile
+      require_relative '../multipart' unless defined?(Rack::Multipart)
+
       # The filename, *not* including the path, of the "uploaded" file
       attr_reader :original_filename