184 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace GuzzleHttp\Psr7;
 | 
						|
 | 
						|
use Psr\Http\Message\StreamInterface;
 | 
						|
 | 
						|
/**
 | 
						|
 * Trait implementing functionality common to requests and responses.
 | 
						|
 */
 | 
						|
trait MessageTrait
 | 
						|
{
 | 
						|
    /** @var array Map of all registered headers, as original name => array of values */
 | 
						|
    private $headers = [];
 | 
						|
 | 
						|
    /** @var array Map of lowercase header name => original name at registration */
 | 
						|
    private $headerNames  = [];
 | 
						|
 | 
						|
    /** @var string */
 | 
						|
    private $protocol = '1.1';
 | 
						|
 | 
						|
    /** @var StreamInterface */
 | 
						|
    private $stream;
 | 
						|
 | 
						|
    public function getProtocolVersion()
 | 
						|
    {
 | 
						|
        return $this->protocol;
 | 
						|
    }
 | 
						|
 | 
						|
    public function withProtocolVersion($version)
 | 
						|
    {
 | 
						|
        if ($this->protocol === $version) {
 | 
						|
            return $this;
 | 
						|
        }
 | 
						|
 | 
						|
        $new = clone $this;
 | 
						|
        $new->protocol = $version;
 | 
						|
        return $new;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getHeaders()
 | 
						|
    {
 | 
						|
        return $this->headers;
 | 
						|
    }
 | 
						|
 | 
						|
    public function hasHeader($header)
 | 
						|
    {
 | 
						|
        return isset($this->headerNames[strtolower($header)]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getHeader($header)
 | 
						|
    {
 | 
						|
        $header = strtolower($header);
 | 
						|
 | 
						|
        if (!isset($this->headerNames[$header])) {
 | 
						|
            return [];
 | 
						|
        }
 | 
						|
 | 
						|
        $header = $this->headerNames[$header];
 | 
						|
 | 
						|
        return $this->headers[$header];
 | 
						|
    }
 | 
						|
 | 
						|
    public function getHeaderLine($header)
 | 
						|
    {
 | 
						|
        return implode(', ', $this->getHeader($header));
 | 
						|
    }
 | 
						|
 | 
						|
    public function withHeader($header, $value)
 | 
						|
    {
 | 
						|
        if (!is_array($value)) {
 | 
						|
            $value = [$value];
 | 
						|
        }
 | 
						|
 | 
						|
        $value = $this->trimHeaderValues($value);
 | 
						|
        $normalized = strtolower($header);
 | 
						|
 | 
						|
        $new = clone $this;
 | 
						|
        if (isset($new->headerNames[$normalized])) {
 | 
						|
            unset($new->headers[$new->headerNames[$normalized]]);
 | 
						|
        }
 | 
						|
        $new->headerNames[$normalized] = $header;
 | 
						|
        $new->headers[$header] = $value;
 | 
						|
 | 
						|
        return $new;
 | 
						|
    }
 | 
						|
 | 
						|
    public function withAddedHeader($header, $value)
 | 
						|
    {
 | 
						|
        if (!is_array($value)) {
 | 
						|
            $value = [$value];
 | 
						|
        }
 | 
						|
 | 
						|
        $value = $this->trimHeaderValues($value);
 | 
						|
        $normalized = strtolower($header);
 | 
						|
 | 
						|
        $new = clone $this;
 | 
						|
        if (isset($new->headerNames[$normalized])) {
 | 
						|
            $header = $this->headerNames[$normalized];
 | 
						|
            $new->headers[$header] = array_merge($this->headers[$header], $value);
 | 
						|
        } else {
 | 
						|
            $new->headerNames[$normalized] = $header;
 | 
						|
            $new->headers[$header] = $value;
 | 
						|
        }
 | 
						|
 | 
						|
        return $new;
 | 
						|
    }
 | 
						|
 | 
						|
    public function withoutHeader($header)
 | 
						|
    {
 | 
						|
        $normalized = strtolower($header);
 | 
						|
 | 
						|
        if (!isset($this->headerNames[$normalized])) {
 | 
						|
            return $this;
 | 
						|
        }
 | 
						|
 | 
						|
        $header = $this->headerNames[$normalized];
 | 
						|
 | 
						|
        $new = clone $this;
 | 
						|
        unset($new->headers[$header], $new->headerNames[$normalized]);
 | 
						|
 | 
						|
        return $new;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getBody()
 | 
						|
    {
 | 
						|
        if (!$this->stream) {
 | 
						|
            $this->stream = stream_for('');
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->stream;
 | 
						|
    }
 | 
						|
 | 
						|
    public function withBody(StreamInterface $body)
 | 
						|
    {
 | 
						|
        if ($body === $this->stream) {
 | 
						|
            return $this;
 | 
						|
        }
 | 
						|
 | 
						|
        $new = clone $this;
 | 
						|
        $new->stream = $body;
 | 
						|
        return $new;
 | 
						|
    }
 | 
						|
 | 
						|
    private function setHeaders(array $headers)
 | 
						|
    {
 | 
						|
        $this->headerNames = $this->headers = [];
 | 
						|
        foreach ($headers as $header => $value) {
 | 
						|
            if (!is_array($value)) {
 | 
						|
                $value = [$value];
 | 
						|
            }
 | 
						|
 | 
						|
            $value = $this->trimHeaderValues($value);
 | 
						|
            $normalized = strtolower($header);
 | 
						|
            if (isset($this->headerNames[$normalized])) {
 | 
						|
                $header = $this->headerNames[$normalized];
 | 
						|
                $this->headers[$header] = array_merge($this->headers[$header], $value);
 | 
						|
            } else {
 | 
						|
                $this->headerNames[$normalized] = $header;
 | 
						|
                $this->headers[$header] = $value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Trims whitespace from the header values.
 | 
						|
     *
 | 
						|
     * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field.
 | 
						|
     *
 | 
						|
     * header-field = field-name ":" OWS field-value OWS
 | 
						|
     * OWS          = *( SP / HTAB )
 | 
						|
     *
 | 
						|
     * @param string[] $values Header values
 | 
						|
     *
 | 
						|
     * @return string[] Trimmed header values
 | 
						|
     *
 | 
						|
     * @see https://tools.ietf.org/html/rfc7230#section-3.2.4
 | 
						|
     */
 | 
						|
    private function trimHeaderValues(array $values)
 | 
						|
    {
 | 
						|
        return array_map(function ($value) {
 | 
						|
            return trim($value, " \t");
 | 
						|
        }, $values);
 | 
						|
    }
 | 
						|
}
 |