Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

Don't omit "/" if it has QUERY_STRING. #5

Open
wants to merge 1 commit into
from

Conversation

Projects
None yet
2 participants
Contributor

hiratara commented Jan 27, 2012

RFC 1738 says, `If neither <path> nor <searchpart> is present, the "/" may also be omitted.'.

http://www.rfc-editor.org/rfc/rfc1738.txt

So we can't omit "/" if the URL has '?' and QUERY_STRINGs.

I thought that the following patch is better than this pull-req, but it makes t/old-base.t broken.

diff --git a/URI/http.pm b/URI/http.pm
index cb69822..8631e40 100644
--- a/URI/http.pm
+++ b/URI/http.pm
@@ -13,7 +13,7 @@ sub canonical
     my $other = $self->SUPER::canonical;

     my $slash_path = defined($other->authority) &&
-        !length($other->path) && !defined($other->query);
+        !length($other->path) && defined($other->query);

     if ($slash_path) {
        $other = $other->clone if $other == $self;
diff --git a/t/http.t b/t/http.t
index 2b8c44b..65e32cd 100644
--- a/t/http.t
+++ b/t/http.t
@@ -1,6 +1,6 @@
 #!perl -w

-print "1..15\n";
+print "1..17\n";

 use URI;

@@ -61,3 +61,12 @@ $u = URI->new("http://%77%77%77%2e%70%65%72%6c%2e%63%6f%6d/%7
 print "not " unless $u->canonical eq "http://www.perl.com/pub/a/2001/08/27/bjor
 print "ok 15\n";

+# RFC 1738: "/" can't be ommited when <searchpart> is present.
+$u = URI->new("http://localhost?p=1");
+print "not " unless $u->canonical eq "http://localhost/?p=1";
+print "ok 16\n";
+
+$u = URI->new("http://localhost");
+print "not " unless $u->canonical eq "http://localhost";
+print "ok 17\n";
+
Respect RFC 1738.
We can also omit "/" when <path> and <searchpart> are empty,
but it makes t/old-base.t fail.
Owner

gisle commented Feb 14, 2012

RFC 2396 does not agree on this AFAICT.

Contributor

hiratara commented Mar 26, 2012

RFC3986 says that RFC2396 was obsolete. So we should follow RFC3986(and RFC1738), shouldn't we ??

http://www.ietf.org/rfc/rfc3986.txt

Owner

gisle commented Mar 30, 2012

RFC3986:

URI           = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part     = "//" authority path-abempty
path-abempty  = *( "/" segment )

This does allow "http://localhost?p=1". Does compatiblity with other stuff break with this, or do you want to argue the aesthetics of of this as canonical form?

Owner

gisle commented Mar 30, 2012

We still have this inconsistency:

$ perl -MURI -le 'print URI->new("http://foo#bar")->canonical'
http://foo/#bar
$ perl -MURI -le 'print URI->new("http://foo?bar")->canonical'
http://foo?bar

It's better to be consistent, so one of these ought to change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment