summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--includes/common.inc7
-rw-r--r--modules/simpletest/tests/common.test9
2 files changed, 14 insertions, 2 deletions
diff --git a/includes/common.inc b/includes/common.inc
index ec5d34cda..51918f062 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -520,8 +520,11 @@ function drupal_parse_url($url) {
}
// 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']);
}
diff --git a/modules/simpletest/tests/common.test b/modules/simpletest/tests/common.test
index 32857bf11..123fc1b85 100644
--- a/modules/simpletest/tests/common.test
+++ b/modules/simpletest/tests/common.test
@@ -94,6 +94,15 @@ class CommonURLUnitTest extends DrupalUnitTestCase {
);
$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(