Mercurial > hg > isophonics-drupal-site
diff core/tests/Drupal/FunctionalJavascriptTests/WebDriverCurlService.php @ 17:129ea1e6d783
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:21:36 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/tests/Drupal/FunctionalJavascriptTests/WebDriverCurlService.php Thu Feb 28 13:21:36 2019 +0000 @@ -0,0 +1,110 @@ +<?php + +namespace Drupal\FunctionalJavascriptTests; + +use WebDriver\Service\CurlService; +use WebDriver\Exception\CurlExec; +use WebDriver\Exception as WebDriverException; + +/** + * Provides a curl service to interact with Selenium driver. + * + * Extends WebDriver\Service\CurlService to solve problem with race conditions, + * when multiple processes requests. + */ +class WebDriverCurlService extends CurlService { + + /** + * {@inheritdoc} + */ + public function execute($requestMethod, $url, $parameters = NULL, $extraOptions = []) { + $extraOptions += [ + CURLOPT_FAILONERROR => TRUE, + ]; + $retries = 0; + while ($retries < 10) { + try { + $customHeaders = [ + 'Content-Type: application/json;charset=UTF-8', + 'Accept: application/json;charset=UTF-8', + ]; + + $curl = curl_init($url); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); + + switch ($requestMethod) { + case 'GET': + break; + + case 'POST': + if ($parameters && is_array($parameters)) { + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($parameters)); + } + else { + $customHeaders[] = 'Content-Length: 0'; + } + + // Suppress "Expect: 100-continue" header automatically added by + // cURL that causes a 1 second delay if the remote server does not + // support Expect. + $customHeaders[] = 'Expect:'; + + curl_setopt($curl, CURLOPT_POST, TRUE); + break; + + case 'DELETE': + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE'); + break; + + case 'PUT': + if ($parameters && is_array($parameters)) { + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($parameters)); + } + else { + $customHeaders[] = 'Content-Length: 0'; + } + + // Suppress "Expect: 100-continue" header automatically added by + // cURL that causes a 1 second delay if the remote server does not + // support Expect. + $customHeaders[] = 'Expect:'; + + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT'); + break; + } + + foreach ($extraOptions as $option => $value) { + curl_setopt($curl, $option, $value); + } + + curl_setopt($curl, CURLOPT_HTTPHEADER, $customHeaders); + + $rawResult = trim(curl_exec($curl)); + + $info = curl_getinfo($curl); + $info['request_method'] = $requestMethod; + + if (array_key_exists(CURLOPT_FAILONERROR, $extraOptions) && $extraOptions[CURLOPT_FAILONERROR] && CURLE_GOT_NOTHING !== ($errno = curl_errno($curl)) && $error = curl_error($curl)) { + curl_close($curl); + + throw WebDriverException::factory(WebDriverException::CURL_EXEC, sprintf("Curl error thrown for http %s to %s%s\n\n%s", $requestMethod, $url, $parameters && is_array($parameters) ? ' with params: ' . json_encode($parameters) : '', $error)); + } + + curl_close($curl); + + $result = json_decode($rawResult, TRUE); + if (isset($result['status']) && $result['status'] === WebDriverException::STALE_ELEMENT_REFERENCE) { + usleep(100000); + $retries++; + continue; + } + return [$rawResult, $info]; + } + catch (CurlExec $exception) { + $retries++; + } + } + throw WebDriverException::factory(WebDriverException::CURL_EXEC, sprintf("Curl error thrown for http %s to %s%s\n\n%s", $requestMethod, $url, $parameters && is_array($parameters) ? ' with params: ' . json_encode($parameters) : '', $error)); + } + +}