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