I have a some code that embeds a return_to
URL into a redirect (like OpenID) that I want to test:
def test_uses_referrer_for_return_to
expected_return_to = 'http://test.com/foo'
@request.env['HTTP_REFERER'] = expected_return_to
get :fazbot
# @response.redirected_to looks like http://service.com?...&return_to=[URI-encoded version of URL above]&...
encoded_return_to = (something_here)[:return_to]
assert_equal expected_return_to, URI.unencode(encoded_return_to)
end
It's a Rails ActionController::TestCase
, so I have access to all sorts of helper methods; I just can't find the right one.
Of course I could use URI.parse
to get the params part of the URL, then split it on /&|?/
and then split again on '='
, but I'm hoping this is already done for me. Plus, what if I miss some obscure rule in URL escaping or parameter parsing? There has to be something in ActionPack
or ActiveSupport
to do this, but I can't find it.
Thanks :)
You want Addressable for this.
It'll automatically handle all the escaping rules for you, and it has some other useful features, like not throwing exceptions for perfectly valid but obscure URIs like the built-in URI parser.
CGI::parse(querystring)
will parse a querystring into a hash. Then,CGI::unescape(string)
will undo any URL-encoding in the value.Alternatively, you can use
Rack::Utils.parse_query
andRack::Utils.unescape
if you're on a recent Rack-based version of Rails, and want to be super-modern.I'm not aware of any Rails-specific helper methods that wrap these utility functions, but they're pretty simple to use, and CGI or Rack is already loaded in the Rails environment anyway.