예제 #1
0
 public function __invoke(RequestInterface $request, array $options)
 {
     if (!$this->queue) {
         throw new \OutOfBoundsException('Mock queue is empty');
     }
     if (isset($options['delay'])) {
         usleep($options['delay'] * 1000);
     }
     $this->lastRequest = $request;
     $this->lastOptions = $options;
     $response = array_shift($this->queue);
     if (is_callable($response)) {
         $response = $response($request, $options);
     }
     $response = $response instanceof \Exception ? new RejectedPromise($response) : \GuzzleHttp\Promise\promise_for($response);
     return $response->then(function ($value) use($request, $options) {
         $this->invokeStats($request, $options, $value);
         if ($this->onFulfilled) {
             call_user_func($this->onFulfilled, $value);
         }
         return $value;
     }, function ($reason) use($request, $options) {
         $this->invokeStats($request, $options, null, $reason);
         if ($this->onRejected) {
             call_user_func($this->onRejected, $reason);
         }
         return new RejectedPromise($reason);
     });
 }
예제 #2
0
 public function testReturnsPromiseForThennable()
 {
     $p = new Thennable();
     $wrapped = \GuzzleHttp\Promise\promise_for($p);
     $this->assertNotSame($p, $wrapped);
     $this->assertInstanceOf('GuzzleHttp\\Promise\\PromiseInterface', $wrapped);
     $p->resolve('foo');
     P\queue()->run();
     $this->assertEquals('foo', $wrapped->wait());
 }
 public function __invoke(RequestInterface $request, array $options)
 {
     if (!$this->queue) {
         throw new \OutOfBoundsException('Mock queue is empty');
     }
     if (isset($options['delay'])) {
         usleep($options['delay'] * 1000);
     }
     $this->lastRequest = $request;
     $this->lastOptions = $options;
     $response = array_shift($this->queue);
     if (isset($options['on_headers'])) {
         if (!is_callable($options['on_headers'])) {
             throw new \InvalidArgumentException('on_headers must be callable');
         }
         try {
             $options['on_headers']($response);
         } catch (\Exception $e) {
             $msg = 'An error was encountered during the on_headers event';
             $response = new RequestException($msg, $request, $response, $e);
         }
     }
     if (is_callable($response)) {
         $response = call_user_func($response, $request, $options);
     }
     $response = $response instanceof \Exception ? new RejectedPromise($response) : \GuzzleHttp\Promise\promise_for($response);
     return $response->then(function ($value) use($request, $options) {
         $this->invokeStats($request, $options, $value);
         if ($this->onFulfilled) {
             call_user_func($this->onFulfilled, $value);
         }
         if (isset($options['sink'])) {
             $contents = (string) $value->getBody();
             $sink = $options['sink'];
             if (is_resource($sink)) {
                 fwrite($sink, $contents);
             } elseif (is_string($sink)) {
                 file_put_contents($sink, $contents);
             } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) {
                 $sink->write($contents);
             }
         }
         return $value;
     }, function ($reason) use($request, $options) {
         $this->invokeStats($request, $options, null, $reason);
         if ($this->onRejected) {
             call_user_func($this->onRejected, $reason);
         }
         return new RejectedPromise($reason);
     });
 }
예제 #4
0
 private function handler($method, $path, $response, $request, $options)
 {
     $response = $response instanceof \Exception ? new RejectedPromise($response) : \GuzzleHttp\Promise\promise_for($response);
     return $response->then(function ($value) use($request, $method, $path, $options) {
         $this->invokeStats($request, $options, $value);
         // custom handle response.
         if ($handler = $this->responseCallable->find($method, $path)) {
             return $handler($value, $request, $this->originalResource, $options);
         }
         return $value;
     }, function ($reason) use($request, $options) {
         $this->invokeStats($request, $options, null, $reason);
         return new RejectedPromise($reason);
     });
 }
예제 #5
0
 public function __invoke(RequestInterface $request, array $options)
 {
     if (!$this->queue) {
         throw new \OutOfBoundsException('Mock queue is empty');
     }
     if (isset($options[RequestOptions::DELAY])) {
         usleep($options[RequestOptions::DELAY] * 1000);
     }
     $this->lastRequest = $request;
     $this->lastOptions = $options;
     $response = array_shift($this->queue);
     if (is_callable($response)) {
         $response = $response($request, $options);
     }
     $response = $response instanceof \Exception ? new RejectedPromise($response) : \GuzzleHttp\Promise\promise_for($response);
     return $response->then(function ($value) use($request, $options) {
         $this->invokeStats($request, $options, $value);
         if ($this->onFulfilled) {
             call_user_func($this->onFulfilled, $value);
         }
         if (isset($options[RequestOptions::SINK])) {
             $contents = (string) $value->getBody();
             $sink = $options[RequestOptions::SINK];
             if (is_resource($sink)) {
                 fwrite($sink, $contents);
             } elseif (is_string($sink)) {
                 file_put_contents($sink, $contents);
             } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) {
                 $sink->write($contents);
             }
         }
         return $value;
     }, function ($reason) use($request, $options) {
         $this->invokeStats($request, $options, null, $reason);
         if ($this->onRejected) {
             call_user_func($this->onRejected, $reason);
         }
         return new RejectedPromise($reason);
     });
 }
예제 #6
0
 public function __invoke(RequestInterface $request, array $options)
 {
     if (isset($options['delay'])) {
         usleep($options['delay'] * 1000);
     }
     if (file_exists($this->getFullFilePath($request))) {
         $responseData = file_get_contents($this->getFullFilePath($request));
         $response = Psr7\parse_response($responseData);
     } else {
         $curlHandler = new CurlHandler();
         $response = $curlHandler->__invoke($request, $options);
     }
     $response = $response instanceof \Exception ? new RejectedPromise($response) : \GuzzleHttp\Promise\promise_for($response);
     return $response->then(function ($value) use($request, $options) {
         // record the response
         $this->record($request, $value, null, $options);
         return $value;
     }, function ($reason) use($request, $options) {
         // record the response
         $this->record($request, null, $reason, $options);
         return $reason;
     });
 }
예제 #7
0
 public function deleteAsync()
 {
     if (is_null($this->getKeyName())) {
         throw new Exception('No primary key defined on model.');
     }
     if ($this->exists) {
         $descriptor = $this->newDescriptor();
         return $this->performDeleteOnModel($descriptor)->then(function ($result) {
             $this->exists = false;
             return true;
         });
     }
     return \GuzzleHttp\Promise\promise_for(true);
 }
예제 #8
0
 /**
  * Handles a request to convert it to a response.
  *
  * Exceptions are not caught.
  *
  * @param Request $request A Request instance
  * @param int     $type    The type of the request (one of HttpKernelInterface::MASTER_REQUEST or HttpKernelInterface::SUB_REQUEST)
  *
  * @return PromiseInterface
  *
  * @throws \LogicException       If one of the listener does not behave as expected
  * @throws NotFoundHttpException When controller cannot be found
  */
 private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
 {
     $this->requestStack->push($request);
     // request
     $event = new GetResponseEvent($this, $request, $type);
     $this->dispatcher->dispatch(KernelEvents::REQUEST, $event);
     if ($event->hasResponse()) {
         return \GuzzleHttp\Promise\promise_for($this->filterResponse($event->getResponse(), $request, $type));
     }
     // load controller
     if (false === ($controller = $this->resolver->getController($request))) {
         throw new NotFoundHttpException(sprintf('Unable to find the controller for path "%s". The route is wrongly configured.', $request->getPathInfo()));
     }
     $event = new FilterControllerEvent($this, $controller, $request, $type);
     $this->dispatcher->dispatch(KernelEvents::CONTROLLER, $event);
     $controller = $event->getController();
     // controller arguments
     $arguments = $this->resolver->getArguments($request, $controller);
     // call controller
     $response = call_user_func_array($controller, $arguments);
     // view
     $response = \GuzzleHttp\Promise\promise_for($response);
     return $response->then(function ($response) use($request, $type) {
         if (!$response instanceof Response) {
             $event = new GetResponseForControllerResultEvent($this, $request, $type, $response);
             $this->dispatcher->dispatch(KernelEvents::VIEW, $event);
             if ($event->hasResponse()) {
                 $response = $event->getResponse();
             }
             if (!$response instanceof Response) {
                 $msg = sprintf('The controller must return a response (%s given).', $this->varToString($response));
                 // the user may have forgotten to return something
                 if (null === $response) {
                     $msg .= ' Did you forget to add a return statement somewhere in your controller?';
                 }
                 throw new \LogicException($msg);
             }
         }
         return $this->filterResponse($response, $request, $type);
     });
 }
 public function testRetriesWhenBodyCanBeRewound()
 {
     $callHandler = $called = false;
     $fn = function ($r, $options) use(&$callHandler) {
         $callHandler = true;
         return \GuzzleHttp\Promise\promise_for(new Psr7\Response());
     };
     $bd = Psr7\FnStream::decorate(Psr7\stream_for('test'), ['tell' => function () {
         return 1;
     }, 'rewind' => function () use(&$called) {
         $called = true;
     }]);
     $factory = new Handler\CurlFactory(1);
     $req = new Psr7\Request('PUT', Server::$url, [], $bd);
     $easy = $factory->create($req, []);
     $res = Handler\CurlFactory::finish($fn, $easy, $factory);
     $res = $res->wait();
     $this->assertTrue($callHandler);
     $this->assertTrue($called);
     $this->assertEquals('200', $res->getStatusCode());
 }
예제 #10
0
 function getManyOneAsync($ids)
 {
     $tasks = [];
     foreach ($ids as $id) {
         $endpoint = $this->getOneEndpoint($id);
         $tasks[] = $this->clientCallAsync('get', $endpoint);
     }
     $items = $this->waitForManyPromises($tasks);
     return \GuzzleHttp\Promise\promise_for($this->processManyOneResponse($items));
 }