Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.1001 diff -u -9 -p -r1.1001 common.inc --- includes/common.inc 30 Sep 2009 13:09:29 -0000 1.1001 +++ includes/common.inc 30 Sep 2009 16:18:20 -0000 @@ -514,20 +514,23 @@ function drupal_parse_url($url) { parse_str($query_parts[0], $options['query']); // Take over the fragment, if there is any. if (isset($query_parts[1])) { $options['fragment'] = $query_parts[1]; } } } // Internal URLs. else { - $parts = parse_url($url); - $options['path'] = $parts['path']; + // parse_url() does not support relative URLs, so make it absolute. E.g. the + // relative URL "foo/bar:1" isn't properly parsed. + $parts = parse_url('http://example.com/' . $url); + // Strip the leading slash that was just added. + $options['path'] = substr($parts['path'], 1); if (isset($parts['query'])) { parse_str($parts['query'], $options['query']); } if (isset($parts['fragment'])) { $options['fragment'] = $parts['fragment']; } } return $options; Index: modules/simpletest/tests/common.test =================================================================== RCS file: /cvs/drupal/drupal/modules/simpletest/tests/common.test,v retrieving revision 1.75 diff -u -9 -p -r1.75 common.test --- modules/simpletest/tests/common.test 29 Sep 2009 15:31:15 -0000 1.75 +++ modules/simpletest/tests/common.test 30 Sep 2009 16:18:22 -0000 @@ -88,18 +88,27 @@ class CommonURLUnitTest extends DrupalUn // Relative URL. $url = 'foo/bar?foo=bar&bar=baz&baz#foo'; $result = array( 'path' => 'foo/bar', 'query' => array('foo' => 'bar', 'bar' => 'baz', 'baz' => ''), 'fragment' => 'foo', ); $this->assertEqual(drupal_parse_url($url), $result, t('Relative URL parsed correctly.')); + // Relative URL that is known to confuse parse_url(). + $url = 'foo/bar:1'; + $result = array( + 'path' => 'foo/bar:1', + 'query' => array(), + 'fragment' => '', + ); + $this->assertEqual(drupal_parse_url($url), $result, t('Relative URL parsed correctly.')); + // Absolute URL. $url = '/foo/bar?foo=bar&bar=baz&baz#foo'; $result = array( 'path' => '/foo/bar', 'query' => array('foo' => 'bar', 'bar' => 'baz', 'baz' => ''), 'fragment' => 'foo', ); $this->assertEqual(drupal_parse_url($url), $result, t('Absolute URL parsed correctly.'));