Skip to content

Commit 2063d6b

Browse files
committed
feat: add form_pairs support for Rack 3.2 compat
1 parent 5a9d3c7 commit 2063d6b

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

src/main/ruby/rack/handler/servlet/servlet_env.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

src/spec/ruby/rack/handler/servlet_spec.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,15 @@ def servlet.create_env(servlet_env)
956956
"name" => ["Ferko Suska", "Jozko Hruska"], "formula" => "a + b == 42%!"
957957
})
958958

959+
if rack_request.respond_to?(:form_pairs) # Rack 3.2+
960+
# POST name/value pairs, preserving duplicate (raw, un-nested) names,
961+
# available even though the servlet input stream was already consumed
962+
expect(rack_request.form_pairs).to match_array([
963+
[ 'name[]', 'Ferko Suska' ], [ 'name[]', 'Jozko Hruska' ],
964+
[ 'age', '30' ], [ 'formula', 'a + b == 42%!' ]
965+
])
966+
end
967+
959968
expect(rack_request.query_string).to eq 'foo=bad&foo=bar&bar=huu&age=33'
960969
expect(rack_request.request_method).to eq 'POST'
961970
expect(rack_request.path_info).to eq '/path'

0 commit comments

Comments
 (0)