@@ -49,6 +49,8 @@ def load_env_key(env, key)
4949 FORM_INPUT = "rack.request.form_input" . freeze
5050 # @private
5151 FORM_HASH = "rack.request.form_hash" . freeze
52+ # @private
53+ FORM_PAIRS = "rack.request.form_pairs" . freeze # Rack 3.2+
5254
5355 # @private
5456 POST_PARAM_METHODS = [ 'POST' , 'PUT' , 'DELETE' ] . freeze
@@ -59,6 +61,7 @@ def load_parameters
5961 get_only = ! POST_PARAM_METHODS . include? ( @servlet_env . getMethod )
6062 # we only need to really do this for POSTs but we'll handle all
6163 query_params , form_params = query_parser . make_params , query_parser . make_params
64+ form_pairs = [ ] # raw (un-nested) POST name/value pairs for Rack 3.2+
6265 # NOTE: HttpServletRequest#getParameterMap merges query-string and
6366 # (POST) body parameters and exposes *every* raw value per name -
6467 # including repeated names that do not end with '[]' and names that
@@ -84,11 +87,13 @@ def load_parameters
8487 end
8588 store_parameter ( query_params , key , get_vals )
8689 store_parameter ( form_params , key , post_vals )
90+ post_vals . each { |v | form_pairs << [ key , v ] }
8791 else
8892 store_parameter ( query_params , key , val )
8993 end
9094 else # POST param :
9195 store_parameter ( form_params , key , val )
96+ val . each { |v | form_pairs << [ key , v ] }
9297 end
9398 end
9499 # Rack::Request#GET
@@ -98,6 +103,8 @@ def load_parameters
98103 # TODO should recreate the input e.g. multipart/form-data ...
99104 @env [ FORM_INPUT ] = @env [ 'rack.input' ]
100105 @env [ FORM_HASH ] = form_params . to_h
106+ # Rack::Request#form_pairs (Rack 3.2+, ignored by older Rack)
107+ @env [ FORM_PAIRS ] = form_pairs
101108 end
102109
103110 def []( key )
0 commit comments