| 
<?php/**
 * This file is part of the PHP Generics package.
 *
 * @package Generics
 */
 namespace Generics\Client;
 
 use Generics\Util\Arrays;
 
 /**
 * This trait provides common http(s) header functionality
 *
 * @author Maik Greubel <[email protected]>
 */
 trait HttpHeadersTrait
 {
 
 /**
 * Headers
 *
 * @var array
 */
 private $headers;
 
 /**
 * The response status code
 *
 * @var int
 */
 private $responseCode;
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\HttpStream::setHeader()
 * @return HttpClient
 */
 public function setHeader($headerName, $headerValue)
 {
 $this->headers[$headerName] = $headerValue;
 }
 
 /**
 * Reset the headers
 */
 public function resetHeaders()
 {
 $this->headers = array();
 }
 
 /**
 *
 * {@inheritdoc}
 * @see \Generics\Streams\HttpStream::getHeaders()
 */
 public function getHeaders(): array
 {
 return $this->headers;
 }
 
 /**
 * Retrieve the response status code
 *
 * @return int
 */
 public function getResponseCode(): int
 {
 return $this->responseCode;
 }
 
 /**
 * Adjust the headers by injecting default values for missing keys.
 */
 private function adjustHeaders($requestType)
 {
 if (! array_key_exists('Accept', $this->headers) && $requestType != 'HEAD') {
 $this->setHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
 }
 
 if (! array_key_exists('Accept-Language', $this->headers) && $requestType != 'HEAD') {
 $this->setHeader('Accept-Language', 'en-US;q=0.7,en;q=0.3');
 }
 
 if (! array_key_exists('User-Agent', $this->headers) && $requestType != 'HEAD') {
 $this->setHeader('User-Agent', 'phpGenerics 1.0');
 }
 
 if (! array_key_exists('Connection', $this->headers) || strlen($this->headers['Connection']) == 0) {
 $this->adjustConnectionHeader($requestType);
 }
 
 if (! array_key_exists('Accept-Encoding', $this->headers)) {
 if (function_exists('gzinflate')) {
 $encoding = 'gzip, deflate';
 } else {
 $encoding = 'identity';
 }
 $this->setHeader('Accept-Encoding', $encoding);
 }
 }
 
 /**
 * Depending on request type the connection header is either
 * set to keep-alive or close
 *
 * @param string $requestType
 */
 private function adjustConnectionHeader($requestType)
 {
 if ($requestType == 'HEAD') {
 $this->setHeader('Connection', 'close');
 } else {
 $this->setHeader('Connection', 'keep-alive');
 }
 }
 
 /**
 * Try to parse line as header and add the results to local header list
 *
 * @param string $line
 */
 private function addParsedHeader($line)
 {
 if (strpos($line, ':') === false) {
 $this->responseCode = HttpStatus::parseStatus($line)->getCode();
 } else {
 $line = trim($line);
 list ($headerName, $headerValue) = explode(':', $line, 2);
 $this->headers[$headerName] = trim($headerValue);
 }
 }
 
 /**
 * Adjust number of bytes to read according content length header
 *
 * @param int $numBytes
 * @return int
 */
 private function adjustNumbytes($numBytes): int
 {
 if (isset($this->headers['Content-Length'])) {
 // Try to read the whole payload at once
 $numBytes = intval($this->headers['Content-Length']);
 }
 
 return $numBytes;
 }
 
 /**
 * Retrieve content type from headers
 *
 * @return string
 */
 private function getContentEncoding(): string
 {
 return $this->getHeader('Content-Encoding');
 }
 
 /**
 * Retrieve an given header
 *
 * @param string $name
 * @return string
 */
 private function getHeader(string $name): string
 {
 $result = "";
 
 if (Arrays::hasElement($this->headers, $name)) {
 $result = $this->headers[$name];
 }
 
 return $result;
 }
 }
 
 |