From d789efba44327e4251d839bb4062135def670099 Mon Sep 17 00:00:00 2001 From: Stephane Bellity Date: Thu, 6 Feb 2014 01:37:10 +0100 Subject: [PATCH] Merge op params and query string params in GET operations Currently, params passed in GET operation are not available via Rack::Request params. --- lib/batch_api/operation/rack.rb | 13 ++++++++++--- spec/lib/operation/rack_spec.rb | 14 +++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/batch_api/operation/rack.rb b/lib/batch_api/operation/rack.rb index de45cac..a35ce6f 100644 --- a/lib/batch_api/operation/rack.rb +++ b/lib/batch_api/operation/rack.rb @@ -44,7 +44,7 @@ def execute # manually and feels clunky and brittle, but is mostly likely fine, though # there are one or two environment parameters not yet adjusted. def process_env - path, qs = @url.split("?") + uri = URI.parse @url # Headers headrs = (@headers || {}).inject({}) do |heads, (k, v)| @@ -58,15 +58,22 @@ def process_env # path and query string @env["REQUEST_URI"] = @env["REQUEST_URI"].gsub(/#{BatchApi.config.endpoint}.*/, @url) - @env["REQUEST_PATH"] = path + @env["REQUEST_PATH"] = uri.path @env["ORIGINAL_FULLPATH"] = @env["PATH_INFO"] = @url + if @method == 'get' + get_params = ::Rack::Utils.parse_nested_query(uri.query).merge(@params) + qs = CGI.escape(::Rack::Utils.build_nested_query(get_params)) + else + qs = uri.query + end + @env["rack.request.query_string"] = qs @env["QUERY_STRING"] = qs # parameters @env["rack.request.form_hash"] = @params - @env["rack.request.query_hash"] = @method == "get" ? @params : nil + @env["rack.request.query_hash"] = @method == "get" ? get_params : nil end end end diff --git a/spec/lib/operation/rack_spec.rb b/spec/lib/operation/rack_spec.rb index 3a5f026..86b8110 100644 --- a/spec/lib/operation/rack_spec.rb +++ b/spec/lib/operation/rack_spec.rb @@ -13,6 +13,9 @@ # for env, see bottom of file - it's long let(:operation) { BatchApi::Operation::Rack.new(op_params, env, app) } let(:app) { stub("application", call: [200, {}, ["foo"]]) } + let(:op_uri) { URI.parse(operation.url) } + let(:op_query_string) { op_uri.query } + let(:op_query_params) { ::Rack::Utils.parse_nested_query(op_query_string) } describe "accessors" do [ @@ -108,7 +111,7 @@ it "updates the REQUEST_PATH with the path component (w/o params)" do key = "REQUEST_PATH" processed_env[key].should_not == env[key] - processed_env[key].should == op_params["url"].split("?").first + processed_env[key].should == op_uri.path end it "updates the original fullpath" do @@ -126,13 +129,13 @@ it "updates the rack query string" do key = "rack.request.query_string" processed_env[key].should_not == env[key] - processed_env[key].should == op_params["url"].split("?").last + processed_env[key].should == op_query_string end it "updates the QUERY_STRING" do key = "QUERY_STRING" processed_env[key].should_not == env[key] - processed_env[key].should == op_params["url"].split("?").last + processed_env[key].should == op_query_string end it "updates the form hash" do @@ -144,10 +147,11 @@ context "query_hash" do it "sets it to params for a GET" do operation.method = "get" - processed_env = operation.tap {|o| o.process_env}.env + processed_env = operation.tap {|o| o.process_env }.env + get_params = op_query_params.merge(op_params['params']) key = "rack.request.query_hash" processed_env[key].should_not == env[key] - processed_env[key].should == op_params["params"] + processed_env[key].should == get_params end it "sets it to nil for a POST" do