Exemplo n.º 1
0
 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;
     }
 }
Exemplo n.º 2
0
 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();
 }
Exemplo n.º 3
0
 /**
  * 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();
 }
Exemplo n.º 4
0
 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.'));
     }
 }
Exemplo n.º 5
0
 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();
 }