2015-08-27 12:03:05 -07:00
< ? php
namespace GuzzleHttp\Psr7 ;
use Psr\Http\Message\StreamInterface ;
/**
* Trait implementing functionality common to requests and responses .
*/
trait MessageTrait
{
2016-07-18 09:07:48 -07:00
/** @var array Map of all registered headers, as original name => array of values */
2015-08-27 12:03:05 -07:00
private $headers = [];
2016-07-18 09:07:48 -07:00
/** @var array Map of lowercase header name => original name at registration */
private $headerNames = [];
2015-08-27 12:03:05 -07:00
/** @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 ()
{
2016-07-18 09:07:48 -07:00
return $this -> headers ;
2015-08-27 12:03:05 -07:00
}
public function hasHeader ( $header )
{
2016-07-18 09:07:48 -07:00
return isset ( $this -> headerNames [ strtolower ( $header )]);
2015-08-27 12:03:05 -07:00
}
public function getHeader ( $header )
{
2016-07-18 09:07:48 -07:00
$header = strtolower ( $header );
if ( ! isset ( $this -> headerNames [ $header ])) {
return [];
}
$header = $this -> headerNames [ $header ];
return $this -> headers [ $header ];
2015-08-27 12:03:05 -07:00
}
public function getHeaderLine ( $header )
{
return implode ( ', ' , $this -> getHeader ( $header ));
}
public function withHeader ( $header , $value )
{
if ( ! is_array ( $value )) {
2016-07-18 09:07:48 -07:00
$value = [ $value ];
2015-08-27 12:03:05 -07:00
}
2016-07-18 09:07:48 -07:00
$value = $this -> trimHeaderValues ( $value );
$normalized = strtolower ( $header );
2015-08-27 12:03:05 -07:00
2016-07-18 09:07:48 -07:00
$new = clone $this ;
if ( isset ( $new -> headerNames [ $normalized ])) {
unset ( $new -> headers [ $new -> headerNames [ $normalized ]]);
}
$new -> headerNames [ $normalized ] = $header ;
$new -> headers [ $header ] = $value ;
2015-08-27 12:03:05 -07:00
return $new ;
}
public function withAddedHeader ( $header , $value )
{
2016-07-18 09:07:48 -07:00
if ( ! is_array ( $value )) {
$value = [ $value ];
2015-08-27 12:03:05 -07:00
}
2016-07-18 09:07:48 -07:00
$value = $this -> trimHeaderValues ( $value );
$normalized = strtolower ( $header );
2015-08-27 12:03:05 -07:00
$new = clone $this ;
2016-07-18 09:07:48 -07:00
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 ;
}
2015-08-27 12:03:05 -07:00
return $new ;
}
public function withoutHeader ( $header )
{
2016-07-18 09:07:48 -07:00
$normalized = strtolower ( $header );
if ( ! isset ( $this -> headerNames [ $normalized ])) {
2015-08-27 12:03:05 -07:00
return $this ;
}
2016-07-18 09:07:48 -07:00
$header = $this -> headerNames [ $normalized ];
2015-08-27 12:03:05 -07:00
2016-07-18 09:07:48 -07:00
$new = clone $this ;
unset ( $new -> headers [ $header ], $new -> headerNames [ $normalized ]);
2015-08-27 12:03:05 -07:00
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 )
{
2016-07-18 09:07:48 -07:00
$this -> headerNames = $this -> headers = [];
2015-08-27 12:03:05 -07:00
foreach ( $headers as $header => $value ) {
if ( ! is_array ( $value )) {
2016-07-18 09:07:48 -07:00
$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 );
2015-08-27 12:03:05 -07:00
} else {
2016-07-18 09:07:48 -07:00
$this -> headerNames [ $normalized ] = $header ;
$this -> headers [ $header ] = $value ;
2015-08-27 12:03:05 -07:00
}
}
}
2016-07-18 09:07:48 -07:00
/**
* 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 );
}
2015-08-27 12:03:05 -07:00
}