vendor/symfony/src/Symfony/Component/HttpFoundation/Request.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Symfony package.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Symfony\Component\HttpFoundation;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * Request represents an HTTP request.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 * @author Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
 * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
class Request
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    static protected $trustProxy = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
     * @var \Symfony\Component\HttpFoundation\ParameterBag
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    public $attributes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
     * @var \Symfony\Component\HttpFoundation\ParameterBag
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    public $request;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     * @var \Symfony\Component\HttpFoundation\ParameterBag
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    public $query;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
     * @var \Symfony\Component\HttpFoundation\ParameterBag
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    public $server;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
     * @var \Symfony\Component\HttpFoundation\ParameterBag
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    public $files;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
     * @var \Symfony\Component\HttpFoundation\ParameterBag
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    public $cookies;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
     * @var \Symfony\Component\HttpFoundation\HeaderBag
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    public $headers;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    protected $content;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    protected $languages;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    protected $charsets;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    protected $acceptableContentTypes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    protected $pathInfo;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    protected $requestUri;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    protected $baseUrl;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    protected $basePath;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    protected $method;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    protected $format;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    protected $session;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    static protected $formats;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
     * @param array  $query      The GET parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
     * @param array  $request    The POST parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
     * @param array  $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
     * @param array  $cookies    The COOKIE parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
     * @param array  $files      The FILES parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
     * @param array  $server     The SERVER parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
     * @param string $content    The raw body data
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
     * Sets the parameters for this request.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
     * This method also re-initializes all properties.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
     * @param array  $query      The GET parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
     * @param array  $request    The POST parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
     * @param array  $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
     * @param array  $cookies    The COOKIE parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
     * @param array  $files      The FILES parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
     * @param array  $server     The SERVER parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
     * @param string $content    The raw body data
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        $this->request = new ParameterBag($request);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        $this->query = new ParameterBag($query);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
        $this->attributes = new ParameterBag($attributes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
        $this->cookies = new ParameterBag($cookies);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        $this->files = new FileBag($files);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        $this->server = new ServerBag($server);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        $this->headers = new HeaderBag($this->server->getHeaders());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
        $this->content = $content;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
        $this->languages = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
        $this->charsets = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
        $this->acceptableContentTypes = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        $this->pathInfo = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        $this->requestUri = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        $this->baseUrl = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        $this->basePath = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
        $this->method = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        $this->format = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
     * Creates a new request with values from PHP's super globals.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
     * @return Request A new request
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    static public function createFromGlobals()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
        $request = new static($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
        if (0 === strpos($request->server->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
            && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE'))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        ) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
            parse_str($request->getContent(), $data);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
            $request->request = new ParameterBag($data);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
        return $request;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
     * Creates a Request based on a given URI and configuration.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
     * @param string $uri        The URI
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
     * @param string $method     The HTTP method
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
     * @param array  $parameters The request (GET) or query (POST) parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
     * @param array  $cookies    The request cookies ($_COOKIE)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
     * @param array  $files      The request files ($_FILES)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
     * @param array  $server     The server parameters ($_SERVER)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
     * @param string $content    The raw body data
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
     * @return Request A Request instance
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
    static public function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
        $defaults = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
            'SERVER_NAME'          => 'localhost',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
            'SERVER_PORT'          => 80,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
            'HTTP_HOST'            => 'localhost',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
            'HTTP_USER_AGENT'      => 'Symfony/2.X',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
            'HTTP_ACCEPT'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
            'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
            'HTTP_ACCEPT_CHARSET'  => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
            'REMOTE_ADDR'          => '127.0.0.1',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
            'SCRIPT_NAME'          => '',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
            'SCRIPT_FILENAME'      => '',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
            'SERVER_PROTOCOL'      => 'HTTP/1.1',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
            'REQUEST_TIME'         => time(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
        $components = parse_url($uri);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
        if (isset($components['host'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
            $defaults['SERVER_NAME'] = $components['host'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
            $defaults['HTTP_HOST'] = $components['host'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
        if (isset($components['scheme'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
            if ('https' === $components['scheme']) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
                $defaults['HTTPS'] = 'on';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
                $defaults['SERVER_PORT'] = 443;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
        if (isset($components['port'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
            $defaults['SERVER_PORT'] = $components['port'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
            $defaults['HTTP_HOST'] = $defaults['HTTP_HOST'].':'.$components['port'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
        if (!isset($components['path'])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
            $components['path'] = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
        if (in_array(strtoupper($method), array('POST', 'PUT', 'DELETE'))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
            $request = $parameters;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
            $query = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
            $defaults['CONTENT_TYPE'] = 'application/x-www-form-urlencoded';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
            $request = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
            $query = $parameters;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
            if (false !== $pos = strpos($uri, '?')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
                $qs = substr($uri, $pos + 1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
                parse_str($qs, $params);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
                $query = array_merge($params, $query);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        $queryString = isset($components['query']) ? html_entity_decode($components['query']) : '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        parse_str($queryString, $qs);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
        if (is_array($qs)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
            $query = array_replace($qs, $query);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
        $uri = $components['path'].($queryString ? '?'.$queryString : '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        $server = array_replace($defaults, $server, array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
            'REQUEST_METHOD'       => strtoupper($method),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
            'PATH_INFO'            => '',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
            'REQUEST_URI'          => $uri,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
            'QUERY_STRING'         => $queryString,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
        ));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
        return new static($query, $request, array(), $cookies, $files, $server, $content);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
     * Clones a request and overrides some of its parameters.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
     * @param array $query      The GET parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
     * @param array $request    The POST parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
     * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
     * @param array $cookies    The COOKIE parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
     * @param array $files      The FILES parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
     * @param array $server     The SERVER parameters
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
    public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
        $dup = clone $this;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
        if ($query !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
            $dup->query = new ParameterBag($query);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
        if ($request !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
            $dup->request = new ParameterBag($request);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
        if ($attributes !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
            $dup->attributes = new ParameterBag($attributes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
        if ($cookies !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
            $dup->cookies = new ParameterBag($cookies);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
        if ($files !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
            $dup->files = new FileBag($files);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
        if ($server !== null) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
            $dup->server = new ServerBag($server);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
            $dup->headers = new HeaderBag($dup->server->getHeaders());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
        $this->languages = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
        $this->charsets = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
        $this->acceptableContentTypes = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
        $this->pathInfo = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
        $this->requestUri = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
        $this->baseUrl = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
        $this->basePath = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
        $this->method = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
        $this->format = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
        return $dup;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
     * Clones the current request.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
     * Note that the session is not cloned as duplicated requests
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
     * are most of the time sub-requests of the main one.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    public function __clone()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
        $this->query      = clone $this->query;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
        $this->request    = clone $this->request;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
        $this->attributes = clone $this->attributes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
        $this->cookies    = clone $this->cookies;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
        $this->files      = clone $this->files;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
        $this->server     = clone $this->server;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
        $this->headers    = clone $this->headers;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
     * Returns the request as a string.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
     * @return string The request
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
    public function __toString()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
        return
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
            sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n".
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
            $this->headers."\r\n".
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
            $this->getContent();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
     * Overrides the PHP global variables according to this request instance.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
     * It overrides $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE, and $_FILES.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
    public function overrideGlobals()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
        $_GET = $this->query->all();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
        $_POST = $this->request->all();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
        $_SERVER = $this->server->all();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
        $_COOKIE = $this->cookies->all();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
        // FIXME: populate $_FILES
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
        foreach ($this->headers->all() as $key => $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
            $key = strtoupper(str_replace('-', '_', $key));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
            if (in_array($key, array('CONTENT_TYPE', 'CONTENT_LENGTH'))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
                $_SERVER[$key] = implode(', ', $value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
                $_SERVER['HTTP_'.$key] = implode(', ', $value);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
        // FIXME: should read variables_order and request_order
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
        // to know which globals to merge and in which order
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
        $_REQUEST = array_merge($_GET, $_POST);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
     * Trusts $_SERVER entries coming from proxies.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   362
     * You should only call this method if your application
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   363
     * is hosted behind a reverse proxy that you manage.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   364
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   365
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   366
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   367
    static public function trustProxyData()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   368
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   369
        self::$trustProxy = true;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   370
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   371
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   372
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   373
     * Gets a "parameter" value.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   374
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   375
     * This method is mainly useful for libraries that want to provide some flexibility.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   376
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   377
     * Order of precedence: GET, PATH, POST, COOKIE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   378
     * Avoid using this method in controllers:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   379
     *  * slow
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   380
     *  * prefer to get from a "named" source
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   381
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   382
     * @param string    $key        the key
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   383
     * @param mixed     $default    the default value
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   384
     * @param type      $deep       is parameter deep in multidimensional array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   385
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   386
     * @return mixed
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   387
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   388
    public function get($key, $default = null, $deep = false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   389
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   390
        return $this->query->get($key, $this->attributes->get($key, $this->request->get($key, $default, $deep), $deep), $deep);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   391
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   392
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   393
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   394
     * Gets the Session.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   395
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   396
     * @return Session|null The session
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   397
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   398
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   399
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   400
    public function getSession()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   401
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   402
        return $this->session;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   403
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   404
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   405
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   406
     * Whether the request contains a Session which was started in one of the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   407
     * previous requests.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   408
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   409
     * @return boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   410
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   411
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   412
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   413
    public function hasPreviousSession()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   414
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   415
        // the check for $this->session avoids malicious users trying to fake a session cookie with proper name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   416
        return $this->cookies->has(session_name()) && null !== $this->session;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   417
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   418
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   419
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   420
     * Whether the request contains a Session object.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   421
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   422
     * @return boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   423
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   424
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   425
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   426
    public function hasSession()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   427
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   428
        return null !== $this->session;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   429
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   430
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   431
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   432
     * Sets the Session.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   433
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   434
     * @param Session $session The Session
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   435
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   436
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   437
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   438
    public function setSession(Session $session)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   439
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   440
        $this->session = $session;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   441
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   442
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   443
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   444
     * Returns the client IP address.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   445
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   446
     * @param  Boolean $proxy Whether the current request has been made behind a proxy or not
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   447
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   448
     * @return string The client IP address
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   449
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   450
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   451
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   452
    public function getClientIp($proxy = false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   453
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   454
        if ($proxy) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   455
            if ($this->server->has('HTTP_CLIENT_IP')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   456
                return $this->server->get('HTTP_CLIENT_IP');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   457
            } elseif (self::$trustProxy && $this->server->has('HTTP_X_FORWARDED_FOR')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   458
                return $this->server->get('HTTP_X_FORWARDED_FOR');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   459
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   460
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   461
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   462
        return $this->server->get('REMOTE_ADDR');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   463
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   464
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   465
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   466
     * Returns current script name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   467
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   468
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   469
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   470
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   471
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   472
    public function getScriptName()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   473
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   474
        return $this->server->get('SCRIPT_NAME', $this->server->get('ORIG_SCRIPT_NAME', ''));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   475
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   476
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   477
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   478
     * Returns the path being requested relative to the executed script.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   479
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   480
     * The path info always starts with a /.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   481
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   482
     * Suppose this request is instantiated from /mysite on localhost:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   483
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   484
     *  * http://localhost/mysite              returns an empty string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   485
     *  * http://localhost/mysite/about        returns '/about'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   486
     *  * http://localhost/mysite/about?var=1  returns '/about'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   487
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   488
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   489
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   490
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   491
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   492
    public function getPathInfo()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   493
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   494
        if (null === $this->pathInfo) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   495
            $this->pathInfo = $this->preparePathInfo();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   496
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   497
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   498
        return $this->pathInfo;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   499
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   500
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   501
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   502
     * Returns the root path from which this request is executed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   503
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   504
     * Suppose that an index.php file instantiates this request object:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   505
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   506
     *  * http://localhost/index.php        returns an empty string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   507
     *  * http://localhost/index.php/page   returns an empty string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   508
     *  * http://localhost/web/index.php    return '/web'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   509
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   510
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   511
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   512
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   513
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   514
    public function getBasePath()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   515
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   516
        if (null === $this->basePath) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   517
            $this->basePath = $this->prepareBasePath();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   518
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   519
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   520
        return $this->basePath;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   521
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   522
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   523
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   524
     * Returns the root url from which this request is executed.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   525
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   526
     * The base URL never ends with a /.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   527
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   528
     * This is similar to getBasePath(), except that it also includes the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   529
     * script filename (e.g. index.php) if one exists.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   530
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   531
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   532
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   533
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   534
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   535
    public function getBaseUrl()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   536
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   537
        if (null === $this->baseUrl) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   538
            $this->baseUrl = $this->prepareBaseUrl();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   539
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   540
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   541
        return $this->baseUrl;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   542
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   543
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   544
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   545
     * Gets the request's scheme.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   546
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   547
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   548
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   549
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   550
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   551
    public function getScheme()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   552
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   553
        return $this->isSecure() ? 'https' : 'http';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   554
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   555
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   556
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   557
     * Returns the port on which the request is made.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   558
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   559
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   560
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   561
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   562
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   563
    public function getPort()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   564
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   565
        return $this->headers->get('X-Forwarded-Port') ?: $this->server->get('SERVER_PORT');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   566
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   567
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   568
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   569
     * Returns the HTTP host being requested.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   570
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   571
     * The port name will be appended to the host if it's non-standard.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   572
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   573
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   574
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   575
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   576
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   577
    public function getHttpHost()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   578
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   579
        $scheme = $this->getScheme();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   580
        $port   = $this->getPort();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   581
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   582
        if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   583
            return $this->getHost();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   584
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   585
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   586
        return $this->getHost().':'.$port;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   587
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   588
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   589
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   590
     * Returns the requested URI.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   591
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   592
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   593
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   594
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   595
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   596
    public function getRequestUri()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   597
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   598
        if (null === $this->requestUri) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   599
            $this->requestUri = $this->prepareRequestUri();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   600
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   601
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   602
        return $this->requestUri;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   603
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   604
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   605
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   606
     * Generates a normalized URI for the Request.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   607
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   608
     * @return string A normalized URI for the Request
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   609
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   610
     * @see getQueryString()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   611
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   612
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   613
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   614
    public function getUri()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   615
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   616
        $qs = $this->getQueryString();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   617
        if (null !== $qs) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   618
            $qs = '?'.$qs;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   619
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   620
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   621
        return $this->getScheme().'://'.$this->getHttpHost().$this->getBaseUrl().$this->getPathInfo().$qs;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   622
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   623
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   624
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   625
     * Generates a normalized URI for the given path.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   626
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   627
     * @param string $path A path to use instead of the current one
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   628
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   629
     * @return string The normalized URI for the path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   630
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   631
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   632
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   633
    public function getUriForPath($path)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   634
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   635
        return $this->getScheme().'://'.$this->getHttpHost().$this->getBaseUrl().$path;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   636
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   637
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   638
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   639
     * Generates the normalized query string for the Request.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   640
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   641
     * It builds a normalized query string, where keys/value pairs are alphabetized
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   642
     * and have consistent escaping.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   643
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   644
     * @return string A normalized query string for the Request
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   645
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   646
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   647
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   648
    public function getQueryString()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   649
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   650
        if (!$qs = $this->server->get('QUERY_STRING')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   651
            return null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   652
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   653
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   654
        $parts = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   655
        $order = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   656
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   657
        foreach (explode('&', $qs) as $segment) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   658
            if (false === strpos($segment, '=')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   659
                $parts[] = $segment;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   660
                $order[] = $segment;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   661
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   662
                $tmp = explode('=', rawurldecode($segment), 2);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   663
                $parts[] = rawurlencode($tmp[0]).'='.rawurlencode($tmp[1]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   664
                $order[] = $tmp[0];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   665
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   666
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   667
        array_multisort($order, SORT_ASC, $parts);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   668
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   669
        return implode('&', $parts);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   670
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   671
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   672
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   673
     * Checks whether the request is secure or not.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   674
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   675
     * @return Boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   676
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   677
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   678
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   679
    public function isSecure()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   680
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   681
        return (
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   682
            (strtolower($this->server->get('HTTPS')) == 'on' || $this->server->get('HTTPS') == 1)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   683
            ||
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   684
            (self::$trustProxy && strtolower($this->headers->get('SSL_HTTPS')) == 'on' || $this->headers->get('SSL_HTTPS') == 1)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   685
            ||
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   686
            (self::$trustProxy && strtolower($this->headers->get('X_FORWARDED_PROTO')) == 'https')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   687
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   688
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   689
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   690
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   691
     * Returns the host name.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   692
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   693
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   694
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   695
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   696
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   697
    public function getHost()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   698
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   699
        if (self::$trustProxy && $host = $this->headers->get('X_FORWARDED_HOST')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   700
            $elements = explode(',', $host);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   701
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   702
            $host = trim($elements[count($elements) - 1]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   703
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   704
            if (!$host = $this->headers->get('HOST')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   705
                if (!$host = $this->server->get('SERVER_NAME')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   706
                    $host = $this->server->get('SERVER_ADDR', '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   707
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   708
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   709
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   710
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   711
        // Remove port number from host
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   712
        $host = preg_replace('/:\d+$/', '', $host);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   713
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   714
        return trim($host);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   715
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   716
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   717
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   718
     * Sets the request method.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   719
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   720
     * @param string $method
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   721
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   722
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   723
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   724
    public function setMethod($method)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   725
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   726
        $this->method = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   727
        $this->server->set('REQUEST_METHOD', $method);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   728
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   729
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   730
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   731
     * Gets the request method.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   732
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   733
     * The method is always an uppercased string.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   734
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   735
     * @return string The request method
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   736
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   737
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   738
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   739
    public function getMethod()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   740
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   741
        if (null === $this->method) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   742
            $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   743
            if ('POST' === $this->method) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   744
                $this->method = strtoupper($this->headers->get('X-HTTP-METHOD-OVERRIDE', $this->request->get('_method', 'POST')));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   745
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   746
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   747
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   748
        return $this->method;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   749
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   750
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   751
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   752
     * Gets the mime type associated with the format.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   753
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   754
     * @param  string $format  The format
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   755
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   756
     * @return string The associated mime type (null if not found)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   757
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   758
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   759
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   760
    public function getMimeType($format)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   761
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   762
        if (null === static::$formats) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   763
            static::initializeFormats();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   764
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   765
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   766
        return isset(static::$formats[$format]) ? static::$formats[$format][0] : null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   767
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   768
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   769
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   770
     * Gets the format associated with the mime type.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   771
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   772
     * @param  string $mimeType  The associated mime type
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   773
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   774
     * @return string The format (null if not found)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   775
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   776
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   777
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   778
    public function getFormat($mimeType)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   779
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   780
        if (false !== $pos = strpos($mimeType, ';')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   781
            $mimeType = substr($mimeType, 0, $pos);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   782
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   783
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   784
        if (null === static::$formats) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   785
            static::initializeFormats();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   786
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   787
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   788
        foreach (static::$formats as $format => $mimeTypes) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   789
            if (in_array($mimeType, (array) $mimeTypes)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   790
                return $format;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   791
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   792
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   793
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   794
        return null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   795
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   796
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   797
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   798
     * Associates a format with mime types.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   799
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   800
     * @param string       $format     The format
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   801
     * @param string|array $mimeTypes  The associated mime types (the preferred one must be the first as it will be used as the content type)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   802
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   803
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   804
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   805
    public function setFormat($format, $mimeTypes)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   806
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   807
        if (null === static::$formats) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   808
            static::initializeFormats();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   809
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   810
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   811
        static::$formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   812
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   813
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   814
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   815
     * Gets the request format.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   816
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   817
     * Here is the process to determine the format:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   818
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   819
     *  * format defined by the user (with setRequestFormat())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   820
     *  * _format request parameter
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   821
     *  * $default
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   822
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   823
     * @param string  $default     The default format
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   824
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   825
     * @return string The request format
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   826
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   827
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   828
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   829
    public function getRequestFormat($default = 'html')
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   830
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   831
        if (null === $this->format) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   832
            $this->format = $this->get('_format', $default);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   833
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   834
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   835
        return $this->format;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   836
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   837
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   838
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   839
     * Sets the request format.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   840
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   841
     * @param string $format The request format.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   842
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   843
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   844
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   845
    public function setRequestFormat($format)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   846
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   847
        $this->format = $format;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   848
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   849
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   850
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   851
     * Checks whether the method is safe or not.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   852
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   853
     * @return Boolean
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   854
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   855
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   856
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   857
    public function isMethodSafe()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   858
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   859
        return in_array($this->getMethod(), array('GET', 'HEAD'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   860
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   861
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   862
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   863
     * Returns the request body content.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   864
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   865
     * @param  Boolean $asResource If true, a resource will be returned
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   866
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   867
     * @return string|resource The request body content or a resource to read the body stream.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   868
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   869
    public function getContent($asResource = false)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   870
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   871
        if (false === $this->content || (true === $asResource && null !== $this->content)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   872
            throw new \LogicException('getContent() can only be called once when using the resource return type.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   873
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   874
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   875
        if (true === $asResource) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   876
            $this->content = false;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   877
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   878
            return fopen('php://input', 'rb');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   879
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   880
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   881
        if (null === $this->content) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   882
            $this->content = file_get_contents('php://input');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   883
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   884
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   885
        return $this->content;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   886
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   887
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   888
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   889
     * Gets the Etags.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   890
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   891
     * @return array The entity tags
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   892
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   893
    public function getETags()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   894
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   895
        return preg_split('/\s*,\s*/', $this->headers->get('if_none_match'), null, PREG_SPLIT_NO_EMPTY);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   896
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   897
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   898
    public function isNoCache()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   899
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   900
        return $this->headers->hasCacheControlDirective('no-cache') || 'no-cache' == $this->headers->get('Pragma');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   901
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   902
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   903
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   904
     * Returns the preferred language.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   905
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   906
     * @param  array  $locales  An array of ordered available locales
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   907
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   908
     * @return string The preferred locale
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   909
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   910
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   911
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   912
    public function getPreferredLanguage(array $locales = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   913
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   914
        $preferredLanguages = $this->getLanguages();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   915
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   916
        if (null === $locales) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   917
            return isset($preferredLanguages[0]) ? $preferredLanguages[0] : null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   918
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   919
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   920
        if (!$preferredLanguages) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   921
            return $locales[0];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   922
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   923
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   924
        $preferredLanguages = array_values(array_intersect($preferredLanguages, $locales));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   925
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   926
        return isset($preferredLanguages[0]) ? $preferredLanguages[0] : $locales[0];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   927
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   928
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   929
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   930
     * Gets a list of languages acceptable by the client browser.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   931
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   932
     * @return array Languages ordered in the user browser preferences
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   933
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   934
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   935
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   936
    public function getLanguages()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   937
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   938
        if (null !== $this->languages) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   939
            return $this->languages;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   940
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   941
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   942
        $languages = $this->splitHttpAcceptHeader($this->headers->get('Accept-Language'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   943
        $this->languages = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   944
        foreach ($languages as $lang => $q) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   945
            if (strstr($lang, '-')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   946
                $codes = explode('-', $lang);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   947
                if ($codes[0] == 'i') {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   948
                    // Language not listed in ISO 639 that are not variants
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   949
                    // of any listed language, which can be registered with the
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   950
                    // i-prefix, such as i-cherokee
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   951
                    if (count($codes) > 1) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   952
                        $lang = $codes[1];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   953
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   954
                } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   955
                    for ($i = 0, $max = count($codes); $i < $max; $i++) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   956
                        if ($i == 0) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   957
                            $lang = strtolower($codes[0]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   958
                        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   959
                            $lang .= '_'.strtoupper($codes[$i]);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   960
                        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   961
                    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   962
                }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   963
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   964
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   965
            $this->languages[] = $lang;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   966
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   967
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   968
        return $this->languages;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   969
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   970
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   971
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   972
     * Gets a list of charsets acceptable by the client browser.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   973
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   974
     * @return array List of charsets in preferable order
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   975
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   976
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   977
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   978
    public function getCharsets()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   979
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   980
        if (null !== $this->charsets) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   981
            return $this->charsets;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   982
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   983
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   984
        return $this->charsets = array_keys($this->splitHttpAcceptHeader($this->headers->get('Accept-Charset')));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   985
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   986
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   987
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   988
     * Gets a list of content types acceptable by the client browser
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   989
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   990
     * @return array List of content types in preferable order
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   991
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   992
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   993
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   994
    public function getAcceptableContentTypes()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   995
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   996
        if (null !== $this->acceptableContentTypes) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   997
            return $this->acceptableContentTypes;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   998
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   999
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1000
        return $this->acceptableContentTypes = array_keys($this->splitHttpAcceptHeader($this->headers->get('Accept')));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1001
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1002
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1003
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1004
     * Returns true if the request is a XMLHttpRequest.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1005
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1006
     * It works if your JavaScript library set an X-Requested-With HTTP header.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1007
     * It is known to work with Prototype, Mootools, jQuery.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1008
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1009
     * @return Boolean true if the request is an XMLHttpRequest, false otherwise
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1010
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1011
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1012
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1013
    public function isXmlHttpRequest()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1014
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1015
        return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1016
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1017
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1018
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1019
     * Splits an Accept-* HTTP header.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1020
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1021
     * @param string $header  Header to split
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1022
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1023
    public function splitHttpAcceptHeader($header)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1024
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1025
        if (!$header) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1026
            return array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1027
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1028
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1029
        $values = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1030
        foreach (array_filter(explode(',', $header)) as $value) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1031
            // Cut off any q-value that might come after a semi-colon
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1032
            if ($pos = strpos($value, ';')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1033
                $q     = (float) trim(substr($value, strpos($value, '=') + 1));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1034
                $value = trim(substr($value, 0, $pos));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1035
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1036
                $q = 1;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1037
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1038
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1039
            if (0 < $q) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1040
                $values[trim($value)] = $q;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1041
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1042
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1043
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1044
        arsort($values);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1045
        reset($values);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1046
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1047
        return $values;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1048
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1049
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1050
    /*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1051
     * The following methods are derived from code of the Zend Framework (1.10dev - 2010-01-24)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1052
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1053
     * Code subject to the new BSD license (http://framework.zend.com/license/new-bsd).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1054
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1055
     * Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1056
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1057
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1058
    protected function prepareRequestUri()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1059
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1060
        $requestUri = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1061
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1062
        if ($this->headers->has('X_REWRITE_URL')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1063
            // check this first so IIS will catch
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1064
            $requestUri = $this->headers->get('X_REWRITE_URL');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1065
        } elseif ($this->server->get('IIS_WasUrlRewritten') == '1' && $this->server->get('UNENCODED_URL') != '') {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1066
            // IIS7 with URL Rewrite: make sure we get the unencoded url (double slash problem)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1067
            $requestUri = $this->server->get('UNENCODED_URL');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1068
        } elseif ($this->server->has('REQUEST_URI')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1069
            $requestUri = $this->server->get('REQUEST_URI');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1070
            // HTTP proxy reqs setup request uri with scheme and host [and port] + the url path, only use url path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1071
            $schemeAndHttpHost = $this->getScheme().'://'.$this->getHttpHost();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1072
            if (strpos($requestUri, $schemeAndHttpHost) === 0) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1073
                $requestUri = substr($requestUri, strlen($schemeAndHttpHost));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1074
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1075
        } elseif ($this->server->has('ORIG_PATH_INFO')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1076
            // IIS 5.0, PHP as CGI
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1077
            $requestUri = $this->server->get('ORIG_PATH_INFO');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1078
            if ($this->server->get('QUERY_STRING')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1079
                $requestUri .= '?'.$this->server->get('QUERY_STRING');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1080
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1081
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1082
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1083
        return $requestUri;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1084
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1085
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1086
    protected function prepareBaseUrl()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1087
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1088
        $filename = basename($this->server->get('SCRIPT_FILENAME'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1089
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1090
        if (basename($this->server->get('SCRIPT_NAME')) === $filename) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1091
            $baseUrl = $this->server->get('SCRIPT_NAME');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1092
        } elseif (basename($this->server->get('PHP_SELF')) === $filename) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1093
            $baseUrl = $this->server->get('PHP_SELF');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1094
        } elseif (basename($this->server->get('ORIG_SCRIPT_NAME')) === $filename) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1095
            $baseUrl = $this->server->get('ORIG_SCRIPT_NAME'); // 1and1 shared hosting compatibility
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1096
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1097
            // Backtrack up the script_filename to find the portion matching
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1098
            // php_self
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1099
            $path    = $this->server->get('PHP_SELF', '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1100
            $file    = $this->server->get('SCRIPT_FILENAME', '');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1101
            $segs    = explode('/', trim($file, '/'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1102
            $segs    = array_reverse($segs);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1103
            $index   = 0;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1104
            $last    = count($segs);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1105
            $baseUrl = '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1106
            do {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1107
                $seg     = $segs[$index];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1108
                $baseUrl = '/'.$seg.$baseUrl;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1109
                ++$index;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1110
            } while (($last > $index) && (false !== ($pos = strpos($path, $baseUrl))) && (0 != $pos));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1111
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1112
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1113
        // Does the baseUrl have anything in common with the request_uri?
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1114
        $requestUri = $this->getRequestUri();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1115
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1116
        if ($baseUrl && 0 === strpos($requestUri, $baseUrl)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1117
            // full $baseUrl matches
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1118
            return $baseUrl;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1119
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1120
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1121
        if ($baseUrl && 0 === strpos($requestUri, dirname($baseUrl))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1122
            // directory portion of $baseUrl matches
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1123
            return rtrim(dirname($baseUrl), '/');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1124
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1125
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1126
        $truncatedRequestUri = $requestUri;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1127
        if (($pos = strpos($requestUri, '?')) !== false) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1128
            $truncatedRequestUri = substr($requestUri, 0, $pos);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1129
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1130
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1131
        $basename = basename($baseUrl);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1132
        if (empty($basename) || !strpos($truncatedRequestUri, $basename)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1133
            // no match whatsoever; set it blank
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1134
            return '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1135
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1136
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1137
        // If using mod_rewrite or ISAPI_Rewrite strip the script filename
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1138
        // out of baseUrl. $pos !== 0 makes sure it is not matching a value
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1139
        // from PATH_INFO or QUERY_STRING
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1140
        if ((strlen($requestUri) >= strlen($baseUrl)) && ((false !== ($pos = strpos($requestUri, $baseUrl))) && ($pos !== 0))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1141
            $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1142
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1143
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1144
        return rtrim($baseUrl, '/');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1145
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1146
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1147
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1148
     * Prepares base path.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1149
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1150
     * @return string base path
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1151
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1152
    protected function prepareBasePath()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1153
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1154
        $filename = basename($this->server->get('SCRIPT_FILENAME'));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1155
        $baseUrl = $this->getBaseUrl();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1156
        if (empty($baseUrl)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1157
            return '';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1158
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1159
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1160
        if (basename($baseUrl) === $filename) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1161
            $basePath = dirname($baseUrl);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1162
        } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1163
            $basePath = $baseUrl;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1164
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1165
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1166
        if ('\\' === DIRECTORY_SEPARATOR) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1167
            $basePath = str_replace('\\', '/', $basePath);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1168
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1169
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1170
        return rtrim($basePath, '/');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1171
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1172
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1173
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1174
     * Prepares path info.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1175
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1176
     * @return string path info
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1177
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1178
    protected function preparePathInfo()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1179
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1180
        $baseUrl = $this->getBaseUrl();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1181
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1182
        if (null === ($requestUri = $this->getRequestUri())) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1183
            return '/';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1184
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1185
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1186
        $pathInfo = '/';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1187
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1188
        // Remove the query string from REQUEST_URI
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1189
        if ($pos = strpos($requestUri, '?')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1190
            $requestUri = substr($requestUri, 0, $pos);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1191
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1192
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1193
        if ((null !== $baseUrl) && (false === ($pathInfo = substr($requestUri, strlen($baseUrl))))) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1194
            // If substr() returns false then PATH_INFO is set to an empty string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1195
            return '/';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1196
        } elseif (null === $baseUrl) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1197
            return $requestUri;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1198
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1199
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1200
        return (string) $pathInfo;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1201
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1202
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1203
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1204
     * Initializes HTTP request formats.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1205
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1206
    static protected function initializeFormats()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1207
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1208
        static::$formats = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1209
            'html' => array('text/html', 'application/xhtml+xml'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1210
            'txt'  => array('text/plain'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1211
            'js'   => array('application/javascript', 'application/x-javascript', 'text/javascript'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1212
            'css'  => array('text/css'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1213
            'json' => array('application/json', 'application/x-json'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1214
            'xml'  => array('text/xml', 'application/xml', 'application/x-xml'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1215
            'rdf'  => array('application/rdf+xml'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1216
            'atom' => array('application/atom+xml'),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1217
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1218
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
  1219
}