summaryrefslogtreecommitdiff
path: root/program/include/rcmail.php
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2014-08-13 19:15:12 +0200
committerThomas Bruederli <thomas@roundcube.net>2014-08-13 19:15:12 +0200
commit06fdaf88cb1a355e445294beba4a89d0209ac71e (patch)
tree53ce0a305a69773169b00bbeae92069d20d3403c /program/include/rcmail.php
parent48e340a82938a83ff337eadb7d6d64c2b13acffe (diff)
Extend rcmail::url() to produce absolute and fully qualified URLs
Diffstat (limited to 'program/include/rcmail.php')
-rw-r--r--program/include/rcmail.php45
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;
}
/**