| 
<?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);
 }
 }
 
 |