<?php 
/** 
 * This file is part of Soloproyectos common library. 
 * 
 * @author  Gonzalo Chumillas <[email protected]> 
 * @license https://github.com/soloproyectos/php.common-libs/blob/master/LICENSE BSD 2-Clause License 
 * @link    https://github.com/soloproyectos/php.common-libs 
 */ 
namespace com\soloproyectos\common\http\request; 
use com\soloproyectos\common\arr\ArrHelper; 
use com\soloproyectos\common\text\TextHelper; 
 
/** 
 * Class HttpRequestConfig. 
 * 
 * @package Http 
 * @author  Gonzalo Chumillas <[email protected]> 
 * @license https://github.com/soloproyectos/php.common-libs/blob/master/LICENSE BSD 2-Clause License 
 * @link    https://github.com/soloproyectos/php.common-libs 
 */ 
class HttpRequestConfig 
{ 
    /** 
     * Associative array of HTTP options. 
     * See http://php.net/manual/en/context.http.php for more info. 
     * @var array of strings 
     */ 
    private $_options = array( 
        "header" => "Content-Type: application/x-www-form-urlencoded; charset=utf-8" 
    ); 
 
    /** 
     * Gets HTTP option. 
     * 
     * @param string $name Option name 
     * 
     * @return string 
     */ 
    public function getOption($name) 
    { 
        return ArrHelper::get($this->_options, $name); 
    } 
 
    /** 
     * Sets HTTP option. 
     * 
     * @param string $name  Option name 
     * @param string $value HTTP option 
     * 
     * @return void 
     */ 
    public function setOption($name, $value) 
    { 
        ArrHelper::set($this->_options, $name, $value); 
    } 
 
    /** 
     * Gets list of options. 
     * 
     * @return array of string 
     */ 
    public function getOptions() 
    { 
        return $this->_options; 
    } 
 
    /** 
     * Gets header key. 
     * 
     * @param string $name Header key 
     * 
     * @return string 
     */ 
    public function getHeaderKey($name) 
    { 
        $ret = ""; 
        $regexp = '/^\s*' . preg_quote($name) . '\s*\:(.*)/mi'; 
 
        if (preg_match($regexp, $this->getOption("header"), $matches)) { 
            $ret = trim($matches[1]); 
        } 
 
        return $ret; 
    } 
 
    /** 
     * Sets header key. 
     * 
     * @param string $name  Header key 
     * @param string $value Value 
     * 
     * @return void 
     */ 
    public function setHeaderKey($name, $value) 
    { 
        // fixes headers by replacing '\n' by '\r\n' 
        $header = $this->getOption("header"); 
        $header = str_replace(array("\r", "\n"), array("", "\r\n"), $header); 
 
        // replaces entry 
        $count = 0; 
        $regexp = '/^(\s*' . preg_quote($name) . '\s*)\:(.*)/mi'; 
        $header = preg_replace($regexp, "\$1: $value", $header, -1, $count); 
 
        // ... or appends entry 
        if ($count == 0) { 
            $header = TextHelper::concat("\r\n", $header, "$name: $value"); 
        } 
 
        $this->setOption("header", $header); 
    } 
 
    /** 
     * Gets the type of the Content-Type key. 
     * 
     * This function gets the type of the Content-Type key, ignoring other parameters, like the charset. 
     * 
     * @return string 
     */ 
    public function getContentType() 
    { 
        $options = explode(";", $this->getHeaderKey("Content-Type")); 
        return trim($options[0]); 
    } 
 
    /** 
     * Sets the type of the Content-Type key. 
     * 
     * This function sets the type of the Content-Type key, ignoring other parameters, like the charset. 
     * 
     * @param string $value Type of the Content-Type 
     * 
     * @return void 
     */ 
    public function setContentType($value) 
    { 
        $options = explode(";", $this->getHeaderKey("Content-Type")); 
        $options[0] = trim($value); 
        $this->setHeaderKey("Content-Type", implode(";", $options)); 
    } 
 
    /** 
     * Gets a Content-Type option. 
     * 
     * For example: 
     * ```php 
     * echo $config->getContentTypeOption("charset"); 
     * ``` 
     * 
     * @param string $name Option name 
     * 
     * @return string 
     */ 
    public function getContentTypeOption($name) 
    { 
        $ret = ""; 
 
        $contentType = $this->getHeaderKey("Content-Type"); 
        if (preg_match('/;\s*' . preg_quote($name) . '\s*\=(.*)$/i', $contentType, $matches)) { 
            $ret = trim($matches[1]); 
        } 
 
        return $ret; 
    } 
 
    /** 
     * Sets a Content-Type option 
     * 
     * For example: 
     * ```php 
     * $config->setContentTypeOption("charset", "iso-8859-1"); 
     * ``` 
     * 
     * @param string $name  Option name 
     * @param string $value Value 
     * 
     * @return void 
     */ 
    public function setContentTypeOption($name, $value) 
    { 
        // replaces entry 
        $count = 0; 
        $regexp = '/;\s*(' . preg_quote($name) . ')\s*\=\s*([^;]*)/i'; 
        $contentType = preg_replace( 
            $regexp, "; \$1=$value", $this->getHeaderKey("Content-Type"), -1, $count 
        ); 
 
        // ... or appends entry 
        if ($count == 0) { 
            $contentType .= "; $name=$value"; 
        } 
 
        $this->setHeaderKey("Content-Type", $contentType); 
    } 
} 
 
 |