diff options
author | Thomas Bruederli <thomas@roundcube.net> | 2014-08-13 19:15:12 +0200 |
---|---|---|
committer | Thomas Bruederli <thomas@roundcube.net> | 2014-08-13 19:15:12 +0200 |
commit | 06fdaf88cb1a355e445294beba4a89d0209ac71e (patch) | |
tree | 53ce0a305a69773169b00bbeae92069d20d3403c /program | |
parent | 48e340a82938a83ff337eadb7d6d64c2b13acffe (diff) |
Extend rcmail::url() to produce absolute and fully qualified URLs
Diffstat (limited to 'program')
-rw-r--r-- | program/include/rcmail.php | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/program/include/rcmail.php b/program/include/rcmail.php index ceb369af8..bb2346f5e 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -789,11 +789,13 @@ class rcmail extends rcube /** * Build a valid URL to this instance of Roundcube * - * @param mixed Either a string with the action or url parameters as key-value pairs + * @param mixed Either a string with the action or url parameters as key-value pairs + * @param boolean Build an URL absolute to document root + * @param boolean Create fully qualified URL including http(s):// and hostname * * @return string Valid application URL */ - public function url($p) + public function url($p, $absolute = false, $full = false) { if (!is_array($p)) { if (strpos($p, 'http') === 0) { @@ -803,14 +805,15 @@ class rcmail extends rcube $p = array('_action' => @func_get_arg(0)); } - $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task); - $p['_task'] = $task; - unset($p['task']); + $pre = array(); + $task = $p['_task'] ?: ($p['task'] ?: $this->task); + $pre['_task'] = $task; + unset($p['task'], $p['_task']); - $url = './' . $this->filename; + $url = $this->filename; $delm = '?'; - foreach (array_reverse($p) as $key => $val) { + foreach (array_merge($pre, $p) as $key => $val) { if ($val !== '' && $val !== null) { $par = $key[0] == '_' ? $key : '_'.$key; $url .= $delm.urlencode($par).'='.urlencode($val); @@ -818,7 +821,33 @@ class rcmail extends rcube } } - return $url; + if ($absolute || $full) { + $prefix = ''; + + // prepend protocol://hostname:port + if ($full) { + $schema = 'http'; + $default_port = 80; + if (rcube_utils::https_check()) { + $schema = 'https'; + $default_port = 443; + } + $prefix = $schema . '://' . preg_replace('/:\d+$/', '', $_SERVER['HTTP_HOST']); + if ($_SERVER['SERVER_PORT'] != $default_port) { + $prefix .= ':' . $_SERVER['SERVER_PORT']; + } + } + + // add base path to this Roundcube installation + $base_path = preg_replace('![^/]+$!', '', strval($_SERVER['SCRIPT_NAME'])); + if ($base_path == '') $base_path = '/'; + $prefix .= $base_path; + } + else { + $prefix = './'; + } + + return $prefix . $url; } /** |