gjerokrsteski/pimf-framework

View on GitHub
core/Pimf/Environment.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
/**
 * Pimf
 *
 * @copyright Copyright (c)  Gjero Krsteski (http://krsteski.de)
 * @license   http://opensource.org/licenses/MIT MIT
 */
namespace Pimf;

/**
 * Server and execution environment information.
 *
 * @package Pimf
 * @author  Gjero Krsteski <gjero@krsteski.de>
 *
 * @property string X_REQUESTED_WITH       It is sent by the Ajax functions of most major Frameworks
 * @property string HTTP                   Is the application running under HTTP protocol?
 * @property string HTTPS                  Is the application running under HTTPS protocol?
 * @property string SERVER_PROTOCOL        Name and revision of the information protocol via which the page was
 *           requested; i.e. 'HTTP/1.0';
 * @property string CONTENT_LENGTH         The Content-Length
 * @property string CONTENT_TYPE           The Content-Type
 * @property string HOST                   The name of the server host under which the current script is executing.
 * @property string SERVER_NAME            The name of the server host under which the current script is executing.
 * @property string SERVER_PORT            Get the port
 * @property string PHP_SELF               Filename of the currently executing script.
 * @property string SCRIPT_NAME            Get Script Name (physical path)
 * @property string PATH_INFO              Get Path Info (virtual path)
 * @property string X_FORWARDED_FOR        Do on your machine is behind the proxy than us it instead of REMOTE_ADDR
 * @property string CLIENT_IP              Get the client ip address
 * @property string REMOTE_ADDR            The IP address from which the user is viewing the current page.
 * @property string HTTP_REFERER           Get Referer - it cannot really be trusted.
 * @property string USER_AGENT             Contents of the User-Agent from the current request, if there is one.
 * @property string HTTP_USER_AGENT        Contents of the User-Agent: header from the current request, if there is
 *           one.
 * @property string REQUEST_URI            The URI which was given in order to access this page; for instance,
 *           '/index.html'.
 * @property string REQUEST_METHOD         Which request method was used to access the page; i.e. 'GET', 'HEAD',
 *           'POST', 'PUT'.
 * @property string REDIRECT_URL           The URL to redirect the user agent to
 * @property string HTTP_IF_MODIFIED_SINCE Get request header from Apache even on PHP running as a CGI
 * @property string HTTP_IF_NONE_MATCH     Get request header from Apache even on PHP running as a CGI
 */
class Environment
{
    /**
     * @var Param
     */
    private $data;

    /**
     * @param array $server
     */
    public function __construct(array $server)
    {
        $this->data = new Param($server);
    }

    /**
     * @return Param
     */
    public function data()
    {
        return $this->data;
    }

    /**
     * @param $key
     *
     * @return string
     */
    public function __get($key)
    {
        return $this->data->get($key, null, false);
    }

    /**
     * Is this an AJAX request?
     *
     * @return bool
     */
    public function isAjax()
    {
        return $this->X_REQUESTED_WITH === 'XMLHttpRequest';
    }

    /**
     * Is the application running under HTTP protocol?
     *
     * @return bool
     */
    public function isHttp()
    {
        return (bool)$this->HTTP;
    }

    /**
     * Is the application running under HTTPS protocol?
     *
     * @return bool
     */
    public function isHttps()
    {
        return $this->HTTPS === 'on';
    }

    /**
     * Get Host
     *
     * @return string
     */
    public function getHost()
    {
        if ($this->HOST) {

            if (strpos($this->HOST, ':') !== false) {
                $hostParts = explode(':', $this->HOST);

                return $hostParts[0];
            }

            return $this->HOST;
        }

        return $this->SERVER_NAME;
    }

    /**
     * Get Host with Port
     *
     * @return string
     */
    public function getHostWithPort()
    {
        return '' . $this->getHost() . ':' . $this->SERVER_PORT;
    }

    /**
     * Physical path + virtual path
     *
     * @return string
     */
    public function getPath()
    {
        return $this->SCRIPT_NAME . $this->PATH_INFO;
    }

    /**
     * Get remote IP
     *
     * @return string
     */
    public function getIp()
    {
        if ($this->X_FORWARDED_FOR) {
            return $this->X_FORWARDED_FOR;
        }

        if ($this->CLIENT_IP) {
            return $this->CLIENT_IP;
        }

        if ($this->SERVER_NAME) {
            return gethostbyname($this->SERVER_NAME);
        }

        return $this->REMOTE_ADDR;
    }

    /**
     * Get User Agent
     *
     * @return string|null
     */
    public function getUserAgent()
    {
        if ($this->USER_AGENT) {
            return $this->USER_AGENT;
        }

        if ($this->HTTP_USER_AGENT) {
            return $this->HTTP_USER_AGENT;
        }

        return null;
    }

    /**
     * Gives you the current page URL
     *
     * @return string
     */
    public function getUrl()
    {
        $protocol = strpos(strtolower($this->PATH_INFO), 'https') === false ? 'http' : 'https';

        return $protocol . '://' . $this->getHost();
    }

    /**
     * Try to get a request header.
     *
     * @param string $header
     *
     * @return array
     */
    public function getRequestHeader($header)
    {
        $header = str_replace('-', '_', strtoupper($header));
        $value = $this->{'HTTP_' . $header};

        if (!$value) {
            $headers = $this->getRequestHeaders();
            $value = !empty($headers[$header]) ? $headers[$header] : null;
        }

        return $value;
    }

    /**
     * Try to determine all request headers
     *
     * @return array
     */
    public function getRequestHeaders()
    {
        $headers = array();

        foreach ($this->data->getAll() as $key => $value) {
            if ('HTTP_' === substr($key, 0, 5)) {
                $headers[substr($key, 5)] = $value;
            }
        }

        return $headers;
    }

}