public function current() { if ($this->isLastChunk) { return $this->applyChunkEncoding(''); } elseif (($current = $this->iterator->current()) === '') { return null; } elseif (is_string($current)) { return $this->applyChunkEncoding($current); } elseif ($current instanceof Promise) { $future = new Future(); $current->when(function ($error, $result) use($future) { if ($error) { $future->fail($error); } elseif (is_string($result)) { $future->succeed($this->applyChunkEncoding($result)); } else { $future->fail(new \DomainException(sprintf('Only string/Promise elements may be chunked; %s provided', gettype($result)))); } }); return $future->promise(); } else { // @TODO How to react to an invalid type returned from an iterator? return null; } }
private function generateNaiveHeaders() { $future = new Future(); $this->generateNaiveLength()->when(function ($error, $result) use($future) { if ($error) { $future->fail($error); } else { $future->succeed(['Content-Length' => $result]); } }); return $future->promise(); }
/** * Write iterator content to the socket. * * @param Reactor $reactor * @param resource $socket * @param mixed $iterator * @throws \DomainException On invalid iterator element. * @return \After\Promise */ public function write(Reactor $reactor, $socket, $iterator) { if (!$iterator->valid()) { return new Success(); } $this->reactor = $reactor; $this->socket = $socket; $this->iterator = $iterator; $this->future = $future = new Future(); $this->writeNextElement(); return $future->promise(); }
private function checkoutNewSocket($uri, $options) { if ($this->allowsNewConnection($uri) || $this->needsRebind) { $future = new Future($this->reactor); $this->initializeNewConnection($future, $uri, $options); $this->needsRebind = false; return $future->promise(); } elseif (count($this->queuedSocketRequests) < $this->opMaxQueuedSockets) { $future = new Future($this->reactor); $this->queuedSocketRequests[$uri][] = [$future, $options]; return $future->promise(); } else { return new Failure(new TooBusyException('Request rejected: too busy. Try upping the OP_MAX_QUEUE_SIZE setting.')); } }
private function sumMultipartFieldLengths(Reactor $reactor, array $fields) { $lengths = []; foreach ($fields as $field) { if (is_string($field)) { $lengths[] = strlen($field); } else { $lengths[] = $field->getLength($reactor); } } $future = new Future(); \After\all($lengths)->when(function ($error, $result) use($future) { if ($error) { $future->fail($error); } else { $future->succeed(array_sum($result)); } }); return $future->promise(); }