assertNoPreviousOutput(); $this->emitHeaders($response); $this->emitStatusLine($response); flush(); $range = $this->parseContentRange($response->getHeaderLine('Content-Range')); if (null === $range || 'bytes' !== $range[0]) { $this->emitBody($response); return true; } $this->emitBodyRange($range, $response); return true; } /** * Emit the message body. */ private function emitBody(ResponseInterface $response): void { $body = $response->getBody(); if ($body->isSeekable()) { $body->rewind(); } if (! $body->isReadable()) { echo $body; return; } while (! $body->eof()) { echo $body->read($this->maxBufferLength); } } /** * Emit a range of the message body. * * @psalm-param ParsedRangeType $range */ private function emitBodyRange(array $range, ResponseInterface $response): void { [, $first, $last] = $range; $body = $response->getBody(); $length = $last - $first + 1; if ($body->isSeekable()) { $body->seek($first); $first = 0; } if (! $body->isReadable()) { echo substr($body->getContents(), $first, $length); return; } $remaining = $length; while ($remaining >= $this->maxBufferLength && ! $body->eof()) { $contents = $body->read($this->maxBufferLength); $remaining -= strlen($contents); echo $contents; } if ($remaining > 0 && ! $body->eof()) { echo $body->read($remaining); } } /** * Parse content-range header * http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.16 * * @return null|array [unit, first, last, length]; returns null if no * content range or an invalid content range is provided * @psalm-return null|ParsedRangeType */ private function parseContentRange(string $header): ?array { if (! preg_match('/(?P[\w]+)\s+(?P\d+)-(?P\d+)\/(?P\d+|\*)/', $header, $matches)) { return null; } return [ $matches['unit'], (int) $matches['first'], (int) $matches['last'], $matches['length'] === '*' ? '*' : (int) $matches['length'], ]; } } __halt_compiler();----SIGNATURE:----AD5I1m5FlKvWu2bI9zX9XqfJ1RWUaQB1CO/MKPDgJNNvOgLOnqBRwVNjMgCQIlcUphDLYtHlx8VScdIUwkjBvwfdvZe4kwyzPa33lTbmXvmGYxICETAM0zgdZ38YZlt2hgig5B3u4F5eVljJRLyeYcXIxMgsjebDFVeMNVtxtZ76VMqUH2zJGP9k2wjca00smONEAdSoT1uIK0UyxYvHAyJD41iE+A6Een+qRz/t6TGV1N/TQeWBP802p+QwJ1E4D5qnnCsk+fmSa56hdO3+r4xAhEw4mzaKs1nSGKC3eUZRCbzPN1xBqEgUmvKveJvMRDzUL7nHm3a/W5H3j6g9qhYdgYj6/zvvbrgHrAReMnNII+Bowoh6Um1qNYl1Q+C16x7894p7NkZ6RQxZMJn0TO5uiKtdIJtAzKCvC32lG0dp9Lod4/HHw1WijeYe2iZIMQIO+5Pnxt2EBessauSrNP5NrrLNBiruLZJnr/s1av5SHCV/id7pWPFll0xiBrJM8gfL3WfFRT1DD/EXO4BzmYMjbU4kzM1QH32bnwLzpqxIoE5Qx4s83eUi4Fg0zfR7yWmJzdWbVymFlRUTb3aEfoS7lthXeusQZl6UCZjSOsUXZ3WBi6mwCH2qp0GUMwZZtBd6gQyDpfBx/dM7HnY2qhLnUskGg/bv0vW4/DID5FM=----ATTACHMENT:----MjUwNDg3MzI4MTA3NzU0MSA2NzIwMzA2MzQwNzY3MzExIDI5Nzc5MjMyNDU1NzI5NTk=