三十五、逐行阅读Yii2.0.43_Yii框架文件yii\web\Request.php(2)

一、resolve方法,解析请求,返回路由和参数。

    /**
     * 解析请求,
     * 返回路由和参数
     */
    public function resolve()
    {
        //解析请求,返回路由和参数
        $result = Yii::$app->getUrlManager()
            ->parseRequest($this);

        if ($result !== false) {
            list($route, $params) = $result;

            if ($this->_queryParams === null) {
                // 保留数字键
                // 这里注意 使用 '+ ' 和 array_merge函数的区别
                $_GET = $params + $_GET;
            } else {
                $this->_queryParams = $params + $this->_queryParams;
            }

            //getQueryParams方法
            // 1. $this->_queryParams === null 返回 $_GET
            // 2. 否则,返回 $this->_queryParams
            return [$route, $this->getQueryParams()];
        }

        //404错误
        throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'));
    }

 二、filterHeaders方法,过滤头

    /**
     * 根据trustedHosts过滤头
     */
    protected function filterHeaders(HeaderCollection $headerCollection)
    {
        $trustedHeaders = $this->getTrustedHeaders();

        // 遍历过滤安全头
        foreach ($this->secureHeaders as $secureHeader) {
            if (!in_array($secureHeader, $trustedHeaders)) {
                $headerCollection->remove($secureHeader);
            }
        }
    }

三、getTrustedHeaders方法,返回信任头列表

    /**
     * 返回信任头列表
     */
    protected function getTrustedHeaders()
    {
        // 默认情况下不相信任何secureHeaders
        $trustedHeaders = [];

        // 检查主机
        if (!empty($this->trustedHosts)) {

            //ip验证器
            $validator = $this->getIpValidator();

            //客户端ip
            $ip = $this->getRemoteIP();

            foreach ($this->trustedHosts as $cidr => $headers) {
                if (!is_array($headers)) {
                    $cidr = $headers;
                    $headers = $this->secureHeaders;
                }

                //设置ip返回
                $validator->setRanges($cidr);

                //验证ip
                if ($validator->validate($ip)) {
                    $trustedHeaders = $headers;
                    break;
                }
            }
        }

        return $trustedHeaders;
    }

四、getIpValidator方法,返回IpValidator实例

    // 返回IpValidator实例
    protected function getIpValidator()
    {
        return new IpValidator();
    }

五、getHeaders方法,返回过滤后的头列表

    /**
     * 返回过滤后header集合
     */
    public function getHeaders()
    {
        if ($this->_headers === null) {
            
            //实例化
            $this->_headers = new HeaderCollection();
            
            if (function_exists('getallheaders')) {

                //getallheaders函数从当前请求中获取所有HTTP头。
                //getallheaders函数是apache_request_headers的别名
                $headers = getallheaders();

                foreach ($headers as $name => $value) {
                    //向集合中添加
                    $this->_headers->add($name, $value);
                }
            } elseif (function_exists('http_get_request_headers')) {
                //http_get_request_headers返回请求头的关联数组
                $headers = http_get_request_headers();

                foreach ($headers as $name => $value) {
                    $this->_headers->add($name, $value);
                }
            } else {
                // ['prefix' => length]
                $headerPrefixes = ['HTTP_' => 5, 'REDIRECT_HTTP_' => 14];

                foreach ($_SERVER as $name => $value) {
                    foreach ($headerPrefixes as $prefix => $length) {
                        if (strncmp($name, $prefix, $length) === 0) {
                            //下面一系列操作转化流程:HTTP_USER_AGENT
                            // 1. USER_AGENT
                            // 2. USER AGENT
                            // 3. user agent
                            // 4. User Agent
                            // 5. User-Agent
                            $name = str_replace(// 将' '替换成'-'
                                ' ', '-',
                                ucwords( // 将每个单词的首字母转换成大写
                                    strtolower(  // 转换成小写
                                        str_replace('_', ' ',  // 将 '-' 替换成 ' '
                                            substr($name, $length) // 获得子串
                                        )
                                    )
                                )
                            );

                            //添加到集合
                            $this->_headers->add($name, $value);

                            //跳出两层循环,继续下一次循环
                            continue 2;
                        }
                    }
                }
            }

            //过滤头,移除不安全的头
            $this->filterHeaders($this->_headers);
        }

        return $this->_headers;
    }

总结:

阅读了5个方法:

  • resolve方法,解析请求,返回路由和参数
  • filterHeaders方法,过滤头
  • getTrustedHeaders方法,返回信任头列表
  • getIpValidator方法,返回IpValidator实例
  • getHeaders方法,返回过滤后的头列表
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值