Subversion Repositories php-qbpwcf

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
 
3
namespace GuzzleHttp\Psr7;
4
 
5
use Psr\Http\Message\StreamInterface;
6
 
7
/**
8
 * Provides a buffer stream that can be written to to fill a buffer, and read
9
 * from to remove bytes from the buffer.
10
 *
11
 * This stream returns a "hwm" metadata value that tells upstream consumers
12
 * what the configured high water mark of the stream is, or the maximum
13
 * preferred size of the buffer.
14
 */
15
class BufferStream implements StreamInterface
16
{
17
    private $hwm;
18
    private $buffer = '';
19
 
20
    /**
21
     * @param int $hwm High water mark, representing the preferred maximum
22
     *                 buffer size. If the size of the buffer exceeds the high
23
     *                 water mark, then calls to write will continue to succeed
24
     *                 but will return false to inform writers to slow down
25
     *                 until the buffer has been drained by reading from it.
26
     */
27
    public function __construct($hwm = 16384)
28
    {
29
        $this->hwm = $hwm;
30
    }
31
 
32
    public function __toString()
33
    {
34
        return $this->getContents();
35
    }
36
 
37
    public function getContents()
38
    {
39
        $buffer = $this->buffer;
40
        $this->buffer = '';
41
 
42
        return $buffer;
43
    }
44
 
45
    public function close()
46
    {
47
        $this->buffer = '';
48
    }
49
 
50
    public function detach()
51
    {
52
        $this->close();
53
 
54
        return null;
55
    }
56
 
57
    public function getSize()
58
    {
59
        return strlen($this->buffer);
60
    }
61
 
62
    public function isReadable()
63
    {
64
        return true;
65
    }
66
 
67
    public function isWritable()
68
    {
69
        return true;
70
    }
71
 
72
    public function isSeekable()
73
    {
74
        return false;
75
    }
76
 
77
    public function rewind()
78
    {
79
        $this->seek(0);
80
    }
81
 
82
    public function seek($offset, $whence = SEEK_SET)
83
    {
84
        throw new \RuntimeException('Cannot seek a BufferStream');
85
    }
86
 
87
    public function eof()
88
    {
89
        return strlen($this->buffer) === 0;
90
    }
91
 
92
    public function tell()
93
    {
94
        throw new \RuntimeException('Cannot determine the position of a BufferStream');
95
    }
96
 
97
    /**
98
     * Reads data from the buffer.
99
     */
100
    public function read($length)
101
    {
102
        $currentLength = strlen($this->buffer);
103
 
104
        if ($length >= $currentLength) {
105
            // No need to slice the buffer because we don't have enough data.
106
            $result = $this->buffer;
107
            $this->buffer = '';
108
        } else {
109
            // Slice up the result to provide a subset of the buffer.
110
            $result = substr($this->buffer, 0, $length);
111
            $this->buffer = substr($this->buffer, $length);
112
        }
113
 
114
        return $result;
115
    }
116
 
117
    /**
118
     * Writes data to the buffer.
119
     */
120
    public function write($string)
121
    {
122
        $this->buffer .= $string;
123
 
124
        // TODO: What should happen here?
125
        if (strlen($this->buffer) >= $this->hwm) {
126
            return false;
127
        }
128
 
129
        return strlen($string);
130
    }
131
 
132
    public function getMetadata($key = null)
133
    {
134
        if ($key == 'hwm') {
135
            return $this->hwm;
136
        }
137
 
138
        return $key ? null : [];
139
    }
140
}