2015-08-17 17:00:26 -07:00
< ? php
2015-08-27 12:03:05 -07:00
namespace GuzzleHttp\Psr7 ;
2015-08-17 17:00:26 -07:00
2015-08-27 12:03:05 -07:00
use Psr\Http\Message\StreamInterface ;
2015-08-17 17:00:26 -07:00
/**
* Provides a buffer stream that can be written to to fill a buffer , and read
* from to remove bytes from the buffer .
*
* This stream returns a " hwm " metadata value that tells upstream consumers
* what the configured high water mark of the stream is , or the maximum
* preferred size of the buffer .
*/
class BufferStream implements StreamInterface
{
private $hwm ;
private $buffer = '' ;
/**
* @ param int $hwm High water mark , representing the preferred maximum
* buffer size . If the size of the buffer exceeds the high
* water mark , then calls to write will continue to succeed
* but will return false to inform writers to slow down
* until the buffer has been drained by reading from it .
*/
public function __construct ( $hwm = 16384 )
{
$this -> hwm = $hwm ;
}
public function __toString ()
{
return $this -> getContents ();
}
public function getContents ()
{
$buffer = $this -> buffer ;
$this -> buffer = '' ;
return $buffer ;
}
public function close ()
{
$this -> buffer = '' ;
}
public function detach ()
{
$this -> close ();
}
public function getSize ()
{
return strlen ( $this -> buffer );
}
public function isReadable ()
{
return true ;
}
public function isWritable ()
{
return true ;
}
public function isSeekable ()
{
return false ;
}
2015-08-27 12:03:05 -07:00
public function rewind ()
{
$this -> seek ( 0 );
}
2015-08-17 17:00:26 -07:00
public function seek ( $offset , $whence = SEEK_SET )
{
2015-08-27 12:03:05 -07:00
throw new \RuntimeException ( 'Cannot seek a BufferStream' );
2015-08-17 17:00:26 -07:00
}
public function eof ()
{
return strlen ( $this -> buffer ) === 0 ;
}
public function tell ()
{
2015-08-27 12:03:05 -07:00
throw new \RuntimeException ( 'Cannot determine the position of a BufferStream' );
2015-08-17 17:00:26 -07:00
}
/**
* Reads data from the buffer .
*/
public function read ( $length )
{
$currentLength = strlen ( $this -> buffer );
if ( $length >= $currentLength ) {
// No need to slice the buffer because we don't have enough data.
$result = $this -> buffer ;
$this -> buffer = '' ;
} else {
// Slice up the result to provide a subset of the buffer.
$result = substr ( $this -> buffer , 0 , $length );
$this -> buffer = substr ( $this -> buffer , $length );
}
return $result ;
}
/**
* Writes data to the buffer .
*/
public function write ( $string )
{
$this -> buffer .= $string ;
2015-08-27 12:03:05 -07:00
// TODO: What should happen here?
2015-08-17 17:00:26 -07:00
if ( strlen ( $this -> buffer ) >= $this -> hwm ) {
return false ;
}
return strlen ( $string );
}
public function getMetadata ( $key = null )
{
if ( $key == 'hwm' ) {
return $this -> hwm ;
}
return $key ? null : [];
}
}