Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^2: Relative URI

by ikegami (Patriarch)
on Apr 21, 2011 at 23:58 UTC ( [id://900739]=note: print w/replies, xml ) Need Help??


in reply to Re: Relative URI
in thread Relative URI

He expects http://a.b.c/d/../e/ to be the same as http://a.b.c/e/.

use strict; use warnings; use Test::More tests => 1; use URI qw( ); my $base1 = URI->new("http://a.b.c/d/../e/"); my $base2 = URI->new_abs("../e/", URI->new("http://a.b.c/d/")); my $uri = URI->new("http://a.b.c/y"); is($uri->rel($base1), $uri->rel($base2)); 1;
1..1 not ok 1 # Failed test at a.pl line 12. # got: '../../../y' # expected: '../y' # Looks like you failed 1 test of 1.

I don't see anything in http://cpansearch.perl.org/src/GAAS/URI-1.58/t/abs.t that covers this case.

The equality definitely doesn't hold up in file systems (due to links both soft and hard), but ../../../y is much less likely to be correct.

Update: Improved test a bit.

Replies are listed 'Best First'.
Re^3: Relative URI
by JavaFan (Canon) on Apr 22, 2011 at 00:12 UTC
    He expects http://a.b.c/d/../e/ to be the same as http://a.b.c/e/.
    If I read section 5.2 of RFC 3986 correctly, the OP quite rightly expects that to be.

      There is a violation of 5.2 elsewhere, though.

      use strict; use warnings; use Test::More tests => 1; use URI qw( ); # if defined(R.scheme) then # T.scheme = R.scheme; # T.authority = R.authority; # T.path = remove_dot_segments(R.path); # T.query = R.query; is( URI->new_abs('http://a.b.c/d/../e/', 'http://a.b.c/'), 'http://a.b +.c/e/' ); 1;
      1..1 not ok 1 # Failed test at a.pl line 8. # got: 'http://a.b.c/d/../e/' # expected: 'http://a.b.c/e/' # Looks like you failed 1 test of 1.

      I would except cannonical to implement 6.2.2.3. It does implement other similar rules.

      use strict; use warnings; use Test::More tests => 6; use URI qw( ); is( URI->new('hTtP://a.b.c/' )->canonical, 'http://a.b.c/', 'R +FC 3986, 6.2.2.1' ); is( URI->new('http://a.b.c/d/../e/')->canonical, 'http://a.b.c/e/', 'R +FC 3986, 6.2.2.3' ); is( URI->new('http://a.b.c' )->canonical, 'http://a.b.c/', 'R +FC 3986, 6.2.3' ); is( URI->new('http://a.b.c:' )->canonical, 'http://a.b.c/', 'R +FC 3986, 6.2.3' ); is( URI->new('http://a.b.c:/' )->canonical, 'http://a.b.c/', 'R +FC 3986, 6.2.3' ); is( URI->new('http://a.b.c:80/' )->canonical, 'http://a.b.c/', 'R +FC 3986, 6.2.3' ); 1;
      1..6 ok 1 - RFC 3986, 6.2.2.1 not ok 2 - RFC 3986, 6.2.2.3 # Failed test 'RFC 3986, 6.2.2.3' # at a.pl line 10. # got: 'http://a.b.c/d/../e/' # expected: 'http://a.b.c/e/' ok 3 - RFC 3986, 6.2.3 ok 4 - RFC 3986, 6.2.3 ok 5 - RFC 3986, 6.2.3 ok 6 - RFC 3986, 6.2.3 # Looks like you failed 1 test of 6.

      5.2 describes how to make an absolute uri from a (possibly) relative URL.

      In that context, "/d/../e/" is equivalent to "/e/", but the module already does that correctly.

      Update: 6.2.2.3 seems more relevant here.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://900739]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (2)
As of 2024-04-19 21:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found