diff options
author | tailor <cygnus@janrain.com> | 2006-01-02 20:16:54 +0000 |
---|---|---|
committer | tailor <cygnus@janrain.com> | 2006-01-02 20:16:54 +0000 |
commit | 383618d25d42207072bdb1b7e0765f98ee59cdc8 (patch) | |
tree | 1cc01b9ab02e784cc12c1abb9b2d9c25d30b3aff | |
parent | 7640a5e5c993d30ec6c6f830ff68016244d68e45 (diff) | |
download | php-openid-383618d25d42207072bdb1b7e0765f98ee59cdc8.zip php-openid-383618d25d42207072bdb1b7e0765f98ee59cdc8.tar.gz php-openid-383618d25d42207072bdb1b7e0765f98ee59cdc8.tar.bz2 |
[project @ Finished url parsing implementation in OIDUtil.]
-rw-r--r-- | Net/OpenID/OIDUtil.php | 75 |
1 files changed, 60 insertions, 15 deletions
diff --git a/Net/OpenID/OIDUtil.php b/Net/OpenID/OIDUtil.php index 3018fbf..3a23464 100644 --- a/Net/OpenID/OIDUtil.php +++ b/Net/OpenID/OIDUtil.php @@ -4,24 +4,46 @@ function Net_OpenID_log($message, $unused_level = 0) { trigger_error($message, E_USER_NOTICE); } -function Net_OpenID_appendArgs($url, $args) { - /* - if (is_array($args)) { - $args = $args->items(); - $args->sort(); +// 'http_build_query' is provided in PHP 5, but not in 4. +function Net_OpenID_http_build_query($data) { + $pairs = array(); + foreach ($data as $key => $value) { + if (is_array($value)) { + $pairs[] = urlencode($value[0])."=".urlencode($value[1]); + } else { + $pairs[] = urlencode($key)."=".urlencode($value); + } } - */ + return implode("&", $pairs); +} + +function Net_OpenID_appendArgs($url, $args) { if (count($args) == 0) { return $url; } + // Non-empty array; if it is an array of arrays, use multisort; + // otherwise use sort. + if (array_key_exists(0, $args) && + is_array($args[0])) { + // Do nothing here. + } else { + $keys = array_keys($args); + sort($keys); + $new_args = array(); + foreach ($keys as $key) { + $new_args[] = array($key, $args[$key]); + } + $args = $new_args; + } + $sep = '?'; if (strpos($url, '?') !== false) { $sep = '&'; } - return $url . $sep . http_build_query($args); + return $url . $sep . Net_OpenID_http_build_query($args); } function Net_OpenID_toBase64($s) { @@ -60,7 +82,7 @@ function Net_OpenID_quoteMinimal($s) { return implode('', $res); } -function urlunparse($scheme, $host, $port, $path, $query, $fragment) { +function Net_OpenID_urlunparse($scheme, $host, $port, $path, $query, $fragment) { if (!$scheme) { $scheme = 'http'; @@ -93,15 +115,36 @@ function urlunparse($scheme, $host, $port, $path, $query, $fragment) { return $result; } -function normalizeUrl($url) { +function Net_OpenID_normalizeUrl($url) { if ($url === null) { return null; } assert(is_string($url)); - $url = strip($url); - $parsed = urlparse($url); + $old_url = $url; + $url = trim($url); + + if (strpos($url, "://") === false) { + $url = "http://" . $url; + } + + $parsed = @parse_url($url); + + if ($parsed === false) { + return null; + } + + $defaults = array( + 'scheme' => '', + 'host' => '', + 'path' => '', + 'query' => '', + 'fragment' => '', + 'port' => '' + ); + + $parsed = array_merge($defaults, $parsed); if (($parsed['scheme'] == '') || ($parsed['host'] == '')) { @@ -113,16 +156,18 @@ function normalizeUrl($url) { $url = 'http://' + $url; $parsed = parse_url($url); + + $parsed = array_merge($defaults, $parsed); } - $tail = array_map(Net_OpenID_quoteMinimal, array($parsed['path'], - $parsed['query'], $parsed['fragment'])); + $tail = array_map('Net_OpenID_quoteMinimal', array($parsed['path'], + $parsed['query'], $parsed['fragment'])); if ($tail[0] == '') { $tail[0] = '/'; } - $url = urlunparse($parsed[0], $parsed['host'], $parsed['port'], - $tail[0], $tail[1], $tail[2]); + $url = Net_OpenID_urlunparse($parsed['scheme'], $parsed['host'], $parsed['port'], + $tail[0], $tail[1], $tail[2]); assert(is_string($url)); |