private function buildOutgoingStream(Message $message, float $timeout = 0) : \Generator
{
$body = $message->getBody();
if ($body instanceof SeekableStream && $body->isOpen()) {
yield from $body->seek(0);
}
if (!$body->isReadable()) {
if ($message instanceof Request) {
switch ($message->getMethod()) {
case 'POST':
case 'PUT':
return $message->withHeader('Content-Length', 0);
default:
// No content length header required on other methods.
return $message;
}
}
return $message->withHeader('Content-Length', 0);
}
$contentEncoding = strtolower($message->getHeader('Content-Encoding'));
if ('' !== $contentEncoding) {
switch ($contentEncoding) {
case 'deflate':
$stream = new ZlibEncoder(ZlibEncoder::DEFLATE, $this->compressionLevel, $this->hwm);
break;
case 'gzip':
$stream = new ZlibEncoder(ZlibEncoder::GZIP, $this->compressionLevel, $this->hwm);
break;
default:
throw new MessageException(Response::BAD_REQUEST, sprintf('Unsupported content encoding set: %s', $contentEncoding));
}
$coroutine = new Coroutine(Stream\pipe($body, $stream, true, 0, null, $timeout));
$coroutine->done(null, [$stream, 'close']);
$message = $message->withBody($stream)->withoutHeader('Content-Length');
}
if ($message->getProtocolVersion() === '1.1' && !$message->hasHeader('Content-Length')) {
$stream = new ChunkedEncoder($this->hwm);
$coroutine = new Coroutine(Stream\pipe($message->getBody(), $stream, true, 0, null, $timeout));
$coroutine->done(null, [$stream, 'close']);
return $message->withBody($stream)->withHeader('Transfer-Encoding', 'chunked');
}
return $message;
}