def call(env)
env['REQUEST_URI'] = env['PATH_INFO'] if env['rack.test']
uri_components = env['REQUEST_URI'].split('/')
matrix_params = {}
uri_components.each do |component|
sub_components, value = component.split(/\;(\w+)\=/), nil
next unless sub_components.first
while param=sub_components.pop do
if value
matrix_params[sub_components.first] ||= {}
matrix_params[sub_components.first].merge!(
param => value
)
value=nil
next
else
value = param
end
end
end
env['rack.request.form_hash'].merge!(matrix_params) if env['rack.request.form_hash']
if env['REQUEST_METHOD']!='POST' and not matrix_params.keys.empty?
env['REQUEST_PATH'], env['PATH_INFO'] = env['REQUEST_URI'].gsub(/;([^\/]*)/, '').gsub(/\?(.*)$/, '')
env['PATH_INFO'] = env['REQUEST_PATH']
env['QUERY_STRING'].gsub!(/;([^\/]*)/, '')
new_params = matrix_params.collect do |component, params|
params.collect { |k,v| "#{component}[#{k}]=#{CGI::escape(v.to_s)}" }
end.flatten
env['QUERY_STRING'] += '&' if not env['QUERY_STRING'].empty?
env['QUERY_STRING'] += "#{new_params.join('&')}"
end
@app.call(env)
end