keith has asked for the wisdom of the Perl Monks concerning the following question:

I need to "pack" a URL into a URL as one of the parameters to a script. For example:

http://cgi3.ebay.com/aw-cgi/eBayISAPI.dll?MfcISAPICommand=SignInWelcom +e&userid=userid&pass=pass&keepMeSignInOption=1&ru=http%3A%2F%2Fcontac +t.ebay.com%2Faw-cgi%2FeBayISAPI.dll%3FReturnUserEmail%26requested%3Du +ser%26de%3Doff%26iid%3D1733367971%26frm%3D284%26acceptcookie%3D1%26lo +ginconfirmed%3D1%26pass%3D%7B_pass_%7D%26userid%3D
If you look deep into the URL, you see the parameter "ru". That parameter has to be an encoded url.

I know that string as a literal would work fine.

So what's my problem?

I want the "ru" parameter as a separate, readable string in perl, so developers don't kick themselves when they look at my uncommented.

Code:
$main_request = "http://cgi3.ebay.com/aw-cgi/eBayISAPI.dll?MfcISAPICom +mand=SignInWelcome&userid=userid&pass=pass&keepMeSignInOption=1&ru="; $ru = "http://encode_this/"; # Encode $ru ????? $main_request += $ru; # Send $main_request
Thanks for the help.

-Keith

Replies are listed 'Best First'.
•Re: Packing a URL into a URL
by merlyn (Sage) on May 29, 2002 at 03:34 UTC
    Just use URI as it was intended:
    $main = 'http://cgi3.ebay.com/aw-cgi/eBayISAPI.dll'; $ru = "http://encode_this/"; use URI; my $uri = URI->new($main); $uri->query_form( qw(MfcISAPICommand SignInWelcome userid userid pass pass keepMeSignI +nOption 1), ru => $ru ); print $uri->as_string;
    which generates
    http://cgi3.ebay.com/aw-cgi/eBayISAPI.dll?MfcISAPICommand=SignInWelcom +e&userid=userid&pass=pass&keepMeSignInOption=1&ru=http%3A%2F%2Fencode +_this%2F

    -- Randal L. Schwartz, Perl hacker

Re: Packing a URL into a URL
by Zaxo (Archbishop) on May 29, 2002 at 02:30 UTC
    Here you go
    #!/usr/bin/perl -w use strict; use URI::Escape; use HTTP::Request; my $ru = uri_escape("http://foo.org/cgi-bin/bar.cgi?baz = qu ux;foo=di +m"); my $v=new HTTP::Request(url=>"http://foo.org/cgi-bin/bar.cgi?ru=$ru"); print $v->url, $/; =pod prints: http://foo.org/cgi-bin/bar.cgi?ru=http%3A%2F%2Ffoo.org%2Fcgi-bin%2Fbar +.cgi%3Fbaz%20%3D%20qu%20ux%3Bfoo%3Ddim call, say: $cgi->redirect( uri_unescape($cgi->param('ru')); to use the url =cut

    Update: I hasten to point out the the uri_unescape() suggestion in pod is insecure if you care where the redirect goes or whether it is an url at all. Repaired a couple of pasteos.

    After Compline,
    Zaxo

      Zaxo, I compiled your code to the up until the "=pod" line. You say:
      prints: http://foo.org/cgi-bin/bar.cgi?ru=http%3A%2F%2Ffoo.org%2Fcgi-bin%2Fbar +.cgi%3Fbaz%20%3D%20qu%20ux%3Bfoo%3Ddim

      But, this is what it prints on my machine:
      http://foo.org/cgi-bin/bar.cgi?ru=http://foo.org/cgi-bin/bar.cgi?baz%2 +0=%20qu%20ux;foo=dim

      Only spaces are encoded.........?

      Not sure why you're getting different results, but I can tell you hoe to adjust what gets escaped. &uri_escape can take a second argument, a string which specifies a character class to escape. "^A-Za-z" will escape everything but ASCII alphabetics.

      From the command line mine does ( with versions):

      $ perl -MURI::Escape -MHTTP::Request -e'my $ru=uri_escape("http://foo. +org/cgi-bin/bar.cgi?baz = qu ux;foo=dim");$v=new HTTP::Request(url=>" +http://foo.org/cgi-bin/bar.cgi?ru=$ru");print $v->url,$/,"URI::Escape + v",$URI::Escape::VERSION,$/,"Perl v",$],$/' http://foo.org/cgi-bin/bar.cgi?ru=http%3A%2F%2Ffoo.org%2Fcgi-bin%2Fbar +.cgi%3Fbaz%20%3D%20qu%20ux%3Bfoo%3Ddim URI::Escape v3.20 Perl v5.006001 $
      on Linux. I wonder if the difference is in defaults selected at build?

      After Compline,
      Zaxo

        The results are different because of different versions of URI::Escape.

          Jenda