Example #1
0
 /**
  * @param UriInterface $url
  * @param string       $extensionUrl
  * @param Session      $session
  *
  * @return Promise
  *
  * @rejects RequestException
  * @rejects FtpCredentialsRequiredException
  * @rejects FtpCredentialsErrorException
  */
 public function installExtensionFromUrlAsync(UriInterface $url, $extensionUrl, Session $session)
 {
     return $this->client->getAsync($url->withQuery(\GuzzleHttp\Psr7\build_query(['q' => 'admin/modules/install'])), [RequestOptions::COOKIES => $session->getCookieJar(), RequestOptions::AUTH => $session->getAuthData()])->then(function (ResponseInterface $response) use($url, $extensionUrl, $session) {
         $crawler = new Crawler((string) $response->getBody(), (string) $url);
         try {
             $form = $crawler->filter('form#update-manager-install-form')->form(['project_url' => $extensionUrl]);
         } catch (\Exception $e) {
             throw new InstallExtensionException(InstallExtensionException::FORM_NOT_FOUND);
         }
         return $this->client->requestAsync($form->getMethod(), $form->getUri(), [RequestOptions::COOKIES => $session->getCookieJar(), RequestOptions::AUTH => $session->getAuthData(), RequestOptions::HEADERS => ['referer' => $form->getUri()], RequestOptions::FORM_PARAMS => $form->getPhpValues(), ClientOptions::FTP_CREDENTIALS => $session->getFtpCredentials()]);
     })->then(function (ResponseInterface $response) use($session) {
         // Drupal uses batch processing when installing extensions, so follow the regular user steps.
         // Example: <meta http-equiv="Refresh" content="(\d+); URL=http://drupal-1.dev.localhost/authorize.php?batch=1&amp;id=3&amp;op=do_nojs" />
         // Send requests while we're getting HTTP-EQUIV refresh.
         $generateRequest = function (ResponseInterface $response) use($session) {
             if (!preg_match('<meta http-equiv="Refresh" content="(\\d+); URL=([^"]+)"\\s*/?>', (string) $response->getBody(), $matches)) {
                 return new FulfilledPromise(null);
             }
             return $this->client->getAsync(html_entity_decode($matches[2]), [RequestOptions::COOKIES => $session->getCookieJar(), RequestOptions::AUTH => $session->getAuthData(), RequestOptions::DELAY => (int) $matches[1] * 1000]);
         };
         // Dynamic iterator that allows us to push requests as responses are received.
         $promises = new \ArrayIterator([$generateRequest($response)]);
         return \GuzzleHttp\Promise\each_limit_all($promises, 1, function (ResponseInterface $response = null) use($promises, $generateRequest) {
             if ($response !== null) {
                 $promises->append($generateRequest($response));
             }
             // Resolve to null when there are no more responses generated, or more specifically, we get FulfilledPromise(null) from above.
         });
     });
 }