GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( c73de3...97c43c )
by Robert
13:22
created

UrlManager::getBaseUrl()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3.0123

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.4285
c 0
b 0
f 0
ccs 8
cts 9
cp 0.8889
cc 3
eloc 8
nc 3
nop 0
crap 3.0123
1
<?php
2
/**
3
 * @link http://www.yiiframework.com/
4
 * @copyright Copyright (c) 2008 Yii Software LLC
5
 * @license http://www.yiiframework.com/license/
6
 */
7
8
namespace yii\web;
9
10
use Yii;
11
use yii\base\Component;
12
use yii\base\InvalidConfigException;
13
use yii\caching\Cache;
14
use yii\helpers\Url;
15
16
/**
17
 * UrlManager handles HTTP request parsing and creation of URLs based on a set of rules.
18
 *
19
 * UrlManager is configured as an application component in [[\yii\base\Application]] by default.
20
 * You can access that instance via `Yii::$app->urlManager`.
21
 *
22
 * You can modify its configuration by adding an array to your application config under `components`
23
 * as it is shown in the following example:
24
 *
25
 * ```php
26
 * 'urlManager' => [
27
 *     'enablePrettyUrl' => true,
28
 *     'rules' => [
29
 *         // your rules go here
30
 *     ],
31
 *     // ...
32
 * ]
33
 * ```
34
 *
35
 * Rules are classes implementing the [[UrlRuleInterface]], by default that is [[UrlRule]].
36
 * For nesting rules, there is also a [[GroupUrlRule]] class.
37
 *
38
 * For more details and usage information on UrlManager, see the [guide article on routing](guide:runtime-routing).
39
 *
40
 * @property string $baseUrl The base URL that is used by [[createUrl()]] to prepend to created URLs.
41
 * @property string $hostInfo The host info (e.g. `http://www.example.com`) that is used by
42
 * [[createAbsoluteUrl()]] to prepend to created URLs.
43
 * @property string $scriptUrl The entry script URL that is used by [[createUrl()]] to prepend to created
44
 * URLs.
45
 *
46
 * @author Qiang Xue <[email protected]>
47
 * @since 2.0
48
 */
49
class UrlManager extends Component
50
{
51
    /**
52
     * @var bool whether to enable pretty URLs. Instead of putting all parameters in the query
53
     * string part of a URL, pretty URLs allow using path info to represent some of the parameters
54
     * and can thus produce more user-friendly URLs, such as "/news/Yii-is-released", instead of
55
     * "/index.php?r=news%2Fview&id=100".
56
     */
57
    public $enablePrettyUrl = false;
58
    /**
59
     * @var bool whether to enable strict parsing. If strict parsing is enabled, the incoming
60
     * requested URL must match at least one of the [[rules]] in order to be treated as a valid request.
61
     * Otherwise, the path info part of the request will be treated as the requested route.
62
     * This property is used only when [[enablePrettyUrl]] is `true`.
63
     */
64
    public $enableStrictParsing = false;
65
    /**
66
     * @var array the rules for creating and parsing URLs when [[enablePrettyUrl]] is `true`.
67
     * This property is used only if [[enablePrettyUrl]] is `true`. Each element in the array
68
     * is the configuration array for creating a single URL rule. The configuration will
69
     * be merged with [[ruleConfig]] first before it is used for creating the rule object.
70
     *
71
     * A special shortcut format can be used if a rule only specifies [[UrlRule::pattern|pattern]]
72
     * and [[UrlRule::route|route]]: `'pattern' => 'route'`. That is, instead of using a configuration
73
     * array, one can use the key to represent the pattern and the value the corresponding route.
74
     * For example, `'post/<id:\d+>' => 'post/view'`.
75
     *
76
     * For RESTful routing the mentioned shortcut format also allows you to specify the
77
     * [[UrlRule::verb|HTTP verb]] that the rule should apply for.
78
     * You can do that  by prepending it to the pattern, separated by space.
79
     * For example, `'PUT post/<id:\d+>' => 'post/update'`.
80
     * You may specify multiple verbs by separating them with comma
81
     * like this: `'POST,PUT post/index' => 'post/create'`.
82
     * The supported verbs in the shortcut format are: GET, HEAD, POST, PUT, PATCH and DELETE.
83
     * Note that [[UrlRule::mode|mode]] will be set to PARSING_ONLY when specifying verb in this way
84
     * so you normally would not specify a verb for normal GET request.
85
     *
86
     * Here is an example configuration for RESTful CRUD controller:
87
     *
88
     * ```php
89
     * [
90
     *     'dashboard' => 'site/index',
91
     *
92
     *     'POST <controller:[\w-]+>s' => '<controller>/create',
93
     *     '<controller:[\w-]+>s' => '<controller>/index',
94
     *
95
     *     'PUT <controller:[\w-]+>/<id:\d+>'    => '<controller>/update',
96
     *     'DELETE <controller:[\w-]+>/<id:\d+>' => '<controller>/delete',
97
     *     '<controller:[\w-]+>/<id:\d+>'        => '<controller>/view',
98
     * ];
99
     * ```
100
     *
101
     * Note that if you modify this property after the UrlManager object is created, make sure
102
     * you populate the array with rule objects instead of rule configurations.
103
     */
104
    public $rules = [];
105
    /**
106
     * @var string the URL suffix used when [[enablePrettyUrl]] is `true`.
107
     * For example, ".html" can be used so that the URL looks like pointing to a static HTML page.
108
     * This property is used only if [[enablePrettyUrl]] is `true`.
109
     */
110
    public $suffix;
111
    /**
112
     * @var bool whether to show entry script name in the constructed URL. Defaults to `true`.
113
     * This property is used only if [[enablePrettyUrl]] is `true`.
114
     */
115
    public $showScriptName = true;
116
    /**
117
     * @var string the GET parameter name for route. This property is used only if [[enablePrettyUrl]] is `false`.
118
     */
119
    public $routeParam = 'r';
120
    /**
121
     * @var Cache|string the cache object or the application component ID of the cache object.
122
     * Compiled URL rules will be cached through this cache object, if it is available.
123
     *
124
     * After the UrlManager object is created, if you want to change this property,
125
     * you should only assign it with a cache object.
126
     * Set this property to `false` if you do not want to cache the URL rules.
127
     */
128
    public $cache = 'cache';
129
    /**
130
     * @var array the default configuration of URL rules. Individual rule configurations
131
     * specified via [[rules]] will take precedence when the same property of the rule is configured.
132
     */
133
    public $ruleConfig = ['class' => 'yii\web\UrlRule'];
134
    /**
135
     * @var UrlNormalizer|array|string|false the configuration for [[UrlNormalizer]] used by this UrlManager.
136
     * The default value is `false`, which means normalization will be skipped.
137
     * If you wish to enable URL normalization, you should configure this property manually.
138
     * For example:
139
     *
140
     * ```php
141
     * [
142
     *     'class' => 'yii\web\UrlNormalizer',
143
     *     'collapseSlashes' => true,
144
     *     'normalizeTrailingSlash' => true,
145
     * ]
146
     * ```
147
     *
148
     * @since 2.0.10
149
     */
150
    public $normalizer = false;
151
152
    /**
153
     * @var string the cache key for cached rules
154
     * @since 2.0.8
155
     */
156
    protected $cacheKey = __CLASS__;
157
158
    private $_baseUrl;
159
    private $_scriptUrl;
160
    private $_hostInfo;
161
    private $_ruleCache;
162
163
164
    /**
165
     * Initializes UrlManager.
166
     */
167 157
    public function init()
168
    {
169 157
        parent::init();
170
171 157
        if ($this->normalizer !== false) {
172 3
            $this->normalizer = Yii::createObject($this->normalizer);
173 3
            if (!$this->normalizer instanceof UrlNormalizer) {
174
                throw new InvalidConfigException('`' . get_class($this) . '::normalizer` should be an instance of `' . UrlNormalizer::className() . '` or its DI compatible configuration.');
175
            }
176 3
        }
177
178 157
        if (!$this->enablePrettyUrl || empty($this->rules)) {
179 88
            return;
180
        }
181 70
        if (is_string($this->cache)) {
182
            $this->cache = Yii::$app->get($this->cache, false);
183
        }
184 70
        if ($this->cache instanceof Cache) {
185
            $cacheKey = $this->cacheKey;
186
            $hash = md5(json_encode($this->rules));
187
            if (($data = $this->cache->get($cacheKey)) !== false && isset($data[1]) && $data[1] === $hash) {
188
                $this->rules = $data[0];
189
            } else {
190
                $this->rules = $this->buildRules($this->rules);
191
                $this->cache->set($cacheKey, [$this->rules, $hash]);
192
            }
193
        } else {
194 70
            $this->rules = $this->buildRules($this->rules);
195
        }
196 70
    }
197
198
    /**
199
     * Adds additional URL rules.
200
     *
201
     * This method will call [[buildRules()]] to parse the given rule declarations and then append or insert
202
     * them to the existing [[rules]].
203
     *
204
     * Note that if [[enablePrettyUrl]] is `false`, this method will do nothing.
205
     *
206
     * @param array $rules the new rules to be added. Each array element represents a single rule declaration.
207
     * Please refer to [[rules]] for the acceptable rule format.
208
     * @param bool $append whether to add the new rules by appending them to the end of the existing rules.
209
     */
210
    public function addRules($rules, $append = true)
211
    {
212
        if (!$this->enablePrettyUrl) {
213
            return;
214
        }
215
        $rules = $this->buildRules($rules);
216
        if ($append) {
217
            $this->rules = array_merge($this->rules, $rules);
218
        } else {
219
            $this->rules = array_merge($rules, $this->rules);
220
        }
221
    }
222
223
    /**
224
     * Builds URL rule objects from the given rule declarations.
225
     * @param array $rules the rule declarations. Each array element represents a single rule declaration.
226
     * Please refer to [[rules]] for the acceptable rule formats.
227
     * @return UrlRuleInterface[] the rule objects built from the given rule declarations
228
     * @throws InvalidConfigException if a rule declaration is invalid
229
     */
230 70
    protected function buildRules($rules)
231
    {
232 70
        $compiledRules = [];
233 70
        $verbs = 'GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS';
234 70
        foreach ($rules as $key => $rule) {
235 70
            if (is_string($rule)) {
236 65
                $rule = ['route' => $rule];
237 65
                if (preg_match("/^((?:($verbs),)*($verbs))\\s+(.*)$/", $key, $matches)) {
238 1
                    $rule['verb'] = explode(',', $matches[1]);
239
                    // rules that do not apply for GET requests should not be use to create urls
240 1
                    if (!in_array('GET', $rule['verb'])) {
241 1
                        $rule['mode'] = UrlRule::PARSING_ONLY;
242 1
                    }
243 1
                    $key = $matches[4];
244 1
                }
245 65
                $rule['pattern'] = $key;
246 65
            }
247 70
            if (is_array($rule)) {
248 70
                $rule = Yii::createObject(array_merge($this->ruleConfig, $rule));
249 70
            }
250 70
            if (!$rule instanceof UrlRuleInterface) {
251
                throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
252
            }
253 70
            $compiledRules[] = $rule;
254 70
        }
255 70
        return $compiledRules;
256
    }
257
258
    /**
259
     * Parses the user request.
260
     * @param Request $request the request component
261
     * @return array|bool the route and the associated parameters. The latter is always empty
262
     * if [[enablePrettyUrl]] is `false`. `false` is returned if the current request cannot be successfully parsed.
263
     */
264 16
    public function parseRequest($request)
265
    {
266 16
        if ($this->enablePrettyUrl) {
267
            /* @var $rule UrlRule */
268 13
            foreach ($this->rules as $rule) {
269 9
                $result = $rule->parseRequest($this, $request);
270 9
                if (YII_DEBUG) {
271 9
                    Yii::trace([
272 9
                        'rule' => method_exists($rule, '__toString') ? $rule->__toString() : get_class($rule),
273 9
                        'match' => $result !== false,
274
                        'parent' => null
275 9
                    ], __METHOD__);
276 9
                }
277 9
                if ($result !== false) {
278 9
                    return $result;
279
                }
280 13
            }
281
282 11
            if ($this->enableStrictParsing) {
283 4
                return false;
284
            }
285
286 7
            Yii::trace('No matching URL rules. Using default URL parsing logic.', __METHOD__);
287
288 7
            $suffix = (string) $this->suffix;
289 7
            $pathInfo = $request->getPathInfo();
290 7
            $normalized = false;
291 7
            if ($this->normalizer !== false) {
292 1
                $pathInfo = $this->normalizer->normalizePathInfo($pathInfo, $suffix, $normalized);
293 1
            }
294 7
            if ($suffix !== '' && $pathInfo !== '') {
295 4
                $n = strlen($this->suffix);
296 4
                if (substr_compare($pathInfo, $this->suffix, -$n, $n) === 0) {
297 4
                    $pathInfo = substr($pathInfo, 0, -$n);
298 4
                    if ($pathInfo === '') {
299
                        // suffix alone is not allowed
300
                        return false;
301
                    }
302 4
                } else {
303
                    // suffix doesn't match
304 4
                    return false;
305
                }
306 4
            }
307
308 7
            if ($normalized) {
309
                // pathInfo was changed by normalizer - we need also normalize route
310 1
                return $this->normalizer->normalizeRoute([$pathInfo, []]);
311
            } else {
312 6
                return [$pathInfo, []];
313
            }
314
        } else {
315 3
            Yii::trace('Pretty URL not enabled. Using default URL parsing logic.', __METHOD__);
316 3
            $route = $request->getQueryParam($this->routeParam, '');
317 3
            if (is_array($route)) {
318 3
                $route = '';
319 3
            }
320
321 3
            return [(string) $route, []];
322
        }
323
    }
324
325
    /**
326
     * Creates a URL using the given route and query parameters.
327
     *
328
     * You may specify the route as a string, e.g., `site/index`. You may also use an array
329
     * if you want to specify additional query parameters for the URL being created. The
330
     * array format must be:
331
     *
332
     * ```php
333
     * // generates: /index.php?r=site%2Findex&param1=value1&param2=value2
334
     * ['site/index', 'param1' => 'value1', 'param2' => 'value2']
335
     * ```
336
     *
337
     * If you want to create a URL with an anchor, you can use the array format with a `#` parameter.
338
     * For example,
339
     *
340
     * ```php
341
     * // generates: /index.php?r=site%2Findex&param1=value1#name
342
     * ['site/index', 'param1' => 'value1', '#' => 'name']
343
     * ```
344
     *
345
     * The URL created is a relative one. Use [[createAbsoluteUrl()]] to create an absolute URL.
346
     *
347
     * Note that unlike [[\yii\helpers\Url::toRoute()]], this method always treats the given route
348
     * as an absolute route.
349
     *
350
     * @param string|array $params use a string to represent a route (e.g. `site/index`),
351
     * or an array to represent a route with query parameters (e.g. `['site/index', 'param1' => 'value1']`).
352
     * @return string the created URL
353
     */
354 124
    public function createUrl($params)
355
    {
356 124
        $params = (array) $params;
357 124
        $anchor = isset($params['#']) ? '#' . $params['#'] : '';
358 124
        unset($params['#'], $params[$this->routeParam]);
359
360 124
        $route = trim($params[0], '/');
361 124
        unset($params[0]);
362
363 124
        $baseUrl = $this->showScriptName || !$this->enablePrettyUrl ? $this->getScriptUrl() : $this->getBaseUrl();
364
365 124
        if ($this->enablePrettyUrl) {
366 78
            $cacheKey = $route . '?';
367 78
            foreach ($params as $key => $value) {
368 78
                if ($value !== null) {
369 78
                    $cacheKey .= $key . '&';
370 78
                }
371 78
            }
372
373 78
            $url = $this->getUrlFromCache($cacheKey, $route, $params);
374
375 78
            if ($url === false) {
376 78
                $cacheable = true;
377 78
                foreach ($this->rules as $rule) {
378
                    /* @var $rule UrlRule */
379 62
                    if (!empty($rule->defaults) && $rule->mode !== UrlRule::PARSING_ONLY) {
380
                        // if there is a rule with default values involved, the matching result may not be cached
381 12
                        $cacheable = false;
382 12
                    }
383 62
                    if (($url = $rule->createUrl($this, $route, $params)) !== false) {
384 61
                        if ($cacheable) {
385 49
                            $this->setRuleToCache($cacheKey, $rule);
386 49
                        }
387 61
                        break;
388
                    }
389 78
                }
390 78
            }
391
392 78
            if ($url !== false) {
393 61
                if (strpos($url, '://') !== false) {
394 8
                    if ($baseUrl !== '' && ($pos = strpos($url, '/', 8)) !== false) {
395 3
                        return substr($url, 0, $pos) . $baseUrl . substr($url, $pos) . $anchor;
396
                    } else {
397 5
                        return $url . $baseUrl . $anchor;
398
                    }
399 53
                } elseif (strpos($url, '//') === 0) {
400 4
                    if ($baseUrl !== '' && ($pos = strpos($url, '/', 2)) !== false) {
401 3
                        return substr($url, 0, $pos) . $baseUrl . substr($url, $pos) . $anchor;
402
                    } else {
403 4
                        return $url . $baseUrl . $anchor;
404
                    }
405
                } else {
406 49
                    return "$baseUrl/{$url}{$anchor}";
407
                }
408
            }
409
410 57
            if ($this->suffix !== null) {
411 16
                $route .= $this->suffix;
412 16
            }
413 57
            if (!empty($params) && ($query = http_build_query($params)) !== '') {
414 49
                $route .= '?' . $query;
415 49
            }
416
417 57
            return "$baseUrl/{$route}{$anchor}";
418
        } else {
419 46
            $url = "$baseUrl?{$this->routeParam}=" . urlencode($route);
420 46
            if (!empty($params) && ($query = http_build_query($params)) !== '') {
421 36
                $url .= '&' . $query;
422 36
            }
423
424 46
            return $url . $anchor;
425
        }
426
    }
427
428
    /**
429
     * Get URL from internal cache if exists
430
     * @param string $cacheKey generated cache key to store data.
431
     * @param string $route the route (e.g. `site/index`).
432
     * @param array $params rule params.
433
     * @return bool|string the created URL
434
     * @see createUrl()
435
     * @since 2.0.8
436
     */
437 78
    protected function getUrlFromCache($cacheKey, $route, $params)
438
    {
439 78
        if (!empty($this->_ruleCache[$cacheKey])) {
440 49
            foreach ($this->_ruleCache[$cacheKey] as $rule) {
441
                /* @var $rule UrlRule */
442 49
                if (($url = $rule->createUrl($this, $route, $params)) !== false) {
443 49
                    return $url;
444
                }
445
            }
446
        } else {
447 78
            $this->_ruleCache[$cacheKey] = [];
448
        }
449 78
        return false;
450
    }
451
452
    /**
453
     * Store rule (e.g. [[UrlRule]]) to internal cache
454
     * @param $cacheKey
455
     * @param UrlRuleInterface $rule
456
     * @since 2.0.8
457
     */
458 49
    protected function setRuleToCache($cacheKey, UrlRuleInterface $rule)
459
    {
460 49
        $this->_ruleCache[$cacheKey][] = $rule;
461 49
    }
462
463
    /**
464
     * Creates an absolute URL using the given route and query parameters.
465
     *
466
     * This method prepends the URL created by [[createUrl()]] with the [[hostInfo]].
467
     *
468
     * Note that unlike [[\yii\helpers\Url::toRoute()]], this method always treats the given route
469
     * as an absolute route.
470
     *
471
     * @param string|array $params use a string to represent a route (e.g. `site/index`),
472
     * or an array to represent a route with query parameters (e.g. `['site/index', 'param1' => 'value1']`).
473
     * @param string|null $scheme the scheme to use for the URL (either `http`, `https` or empty string
474
     * for protocol-relative URL).
475
     * If not specified the scheme of the current request will be used.
476
     * @return string the created URL
477
     * @see createUrl()
478
     */
479 58
    public function createAbsoluteUrl($params, $scheme = null)
480
    {
481 58
        $params = (array) $params;
482 58
        $url = $this->createUrl($params);
483 58
        if (strpos($url, '://') === false) {
484 54
            $hostInfo = $this->getHostInfo();
485 54
            if (strpos($url, '//') === 0) {
486 4
                $url = substr($hostInfo, 0, strpos($hostInfo, '://')) . ':' . $url;
487 4
            } else {
488 54
                $url = $hostInfo . $url;
489
            }
490 54
        }
491
492 58
        return Url::ensureScheme($url, $scheme);
493
    }
494
495
    /**
496
     * Returns the base URL that is used by [[createUrl()]] to prepend to created URLs.
497
     * It defaults to [[Request::baseUrl]].
498
     * This is mainly used when [[enablePrettyUrl]] is `true` and [[showScriptName]] is `false`.
499
     * @return string the base URL that is used by [[createUrl()]] to prepend to created URLs.
500
     * @throws InvalidConfigException if running in console application and [[baseUrl]] is not configured.
501
     */
502 39
    public function getBaseUrl()
503
    {
504 39
        if ($this->_baseUrl === null) {
505 1
            $request = Yii::$app->getRequest();
506 1
            if ($request instanceof Request) {
507 1
                $this->_baseUrl = $request->getBaseUrl();
508 1
            } else {
509
                throw new InvalidConfigException('Please configure UrlManager::baseUrl correctly as you are running a console application.');
510
            }
511 1
        }
512
513 39
        return $this->_baseUrl;
514
    }
515
516
    /**
517
     * Sets the base URL that is used by [[createUrl()]] to prepend to created URLs.
518
     * This is mainly used when [[enablePrettyUrl]] is `true` and [[showScriptName]] is `false`.
519
     * @param string $value the base URL that is used by [[createUrl()]] to prepend to created URLs.
520
     */
521 108
    public function setBaseUrl($value)
522
    {
523 108
        $this->_baseUrl = $value === null ? null : rtrim($value, '/');
524 108
    }
525
526
    /**
527
     * Returns the entry script URL that is used by [[createUrl()]] to prepend to created URLs.
528
     * It defaults to [[Request::scriptUrl]].
529
     * This is mainly used when [[enablePrettyUrl]] is `false` or [[showScriptName]] is `true`.
530
     * @return string the entry script URL that is used by [[createUrl()]] to prepend to created URLs.
531
     * @throws InvalidConfigException if running in console application and [[scriptUrl]] is not configured.
532
     */
533 86
    public function getScriptUrl()
534
    {
535 86
        if ($this->_scriptUrl === null) {
536 12
            $request = Yii::$app->getRequest();
537 12
            if ($request instanceof Request) {
538 12
                $this->_scriptUrl = $request->getScriptUrl();
539 12
            } else {
540
                throw new InvalidConfigException('Please configure UrlManager::scriptUrl correctly as you are running a console application.');
541
            }
542 12
        }
543
544 86
        return $this->_scriptUrl;
545
    }
546
547
    /**
548
     * Sets the entry script URL that is used by [[createUrl()]] to prepend to created URLs.
549
     * This is mainly used when [[enablePrettyUrl]] is `false` or [[showScriptName]] is `true`.
550
     * @param string $value the entry script URL that is used by [[createUrl()]] to prepend to created URLs.
551
     */
552 116
    public function setScriptUrl($value)
553
    {
554 116
        $this->_scriptUrl = $value;
555 116
    }
556
557
    /**
558
     * Returns the host info that is used by [[createAbsoluteUrl()]] to prepend to created URLs.
559
     * @return string the host info (e.g. `http://www.example.com`) that is used by [[createAbsoluteUrl()]] to prepend to created URLs.
560
     * @throws InvalidConfigException if running in console application and [[hostInfo]] is not configured.
561
     */
562 56
    public function getHostInfo()
563
    {
564 56
        if ($this->_hostInfo === null) {
565 7
            $request = Yii::$app->getRequest();
566 7
            if ($request instanceof \yii\web\Request) {
567 7
                $this->_hostInfo = $request->getHostInfo();
568 7
            } else {
569
                throw new InvalidConfigException('Please configure UrlManager::hostInfo correctly as you are running a console application.');
570
            }
571 7
        }
572
573 56
        return $this->_hostInfo;
574
    }
575
576
    /**
577
     * Sets the host info that is used by [[createAbsoluteUrl()]] to prepend to created URLs.
578
     * @param string $value the host info (e.g. "http://www.example.com") that is used by [[createAbsoluteUrl()]] to prepend to created URLs.
579
     */
580 105
    public function setHostInfo($value)
581
    {
582 105
        $this->_hostInfo = $value === null ? null : rtrim($value, '/');
583 105
    }
584
}
585