1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace Facebook\WebDriver\Net; 4*04fd306cSNickeau 5*04fd306cSNickeauuse Exception; 6*04fd306cSNickeauuse Facebook\WebDriver\Exception\TimeoutException; 7*04fd306cSNickeau 8*04fd306cSNickeauclass URLChecker 9*04fd306cSNickeau{ 10*04fd306cSNickeau const POLL_INTERVAL_MS = 500; 11*04fd306cSNickeau const CONNECT_TIMEOUT_MS = 500; 12*04fd306cSNickeau 13*04fd306cSNickeau public function waitUntilAvailable($timeout_in_ms, $url) 14*04fd306cSNickeau { 15*04fd306cSNickeau $end = microtime(true) + $timeout_in_ms / 1000; 16*04fd306cSNickeau 17*04fd306cSNickeau while ($end > microtime(true)) { 18*04fd306cSNickeau if ($this->getHTTPResponseCode($url) === 200) { 19*04fd306cSNickeau return $this; 20*04fd306cSNickeau } 21*04fd306cSNickeau usleep(self::POLL_INTERVAL_MS); 22*04fd306cSNickeau } 23*04fd306cSNickeau 24*04fd306cSNickeau throw new TimeoutException(sprintf( 25*04fd306cSNickeau 'Timed out waiting for %s to become available after %d ms.', 26*04fd306cSNickeau $url, 27*04fd306cSNickeau $timeout_in_ms 28*04fd306cSNickeau )); 29*04fd306cSNickeau } 30*04fd306cSNickeau 31*04fd306cSNickeau public function waitUntilUnavailable($timeout_in_ms, $url) 32*04fd306cSNickeau { 33*04fd306cSNickeau $end = microtime(true) + $timeout_in_ms / 1000; 34*04fd306cSNickeau 35*04fd306cSNickeau while ($end > microtime(true)) { 36*04fd306cSNickeau if ($this->getHTTPResponseCode($url) !== 200) { 37*04fd306cSNickeau return $this; 38*04fd306cSNickeau } 39*04fd306cSNickeau usleep(self::POLL_INTERVAL_MS); 40*04fd306cSNickeau } 41*04fd306cSNickeau 42*04fd306cSNickeau throw new TimeoutException(sprintf( 43*04fd306cSNickeau 'Timed out waiting for %s to become unavailable after %d ms.', 44*04fd306cSNickeau $url, 45*04fd306cSNickeau $timeout_in_ms 46*04fd306cSNickeau )); 47*04fd306cSNickeau } 48*04fd306cSNickeau 49*04fd306cSNickeau private function getHTTPResponseCode($url) 50*04fd306cSNickeau { 51*04fd306cSNickeau $ch = curl_init(); 52*04fd306cSNickeau curl_setopt($ch, CURLOPT_URL, $url); 53*04fd306cSNickeau curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 54*04fd306cSNickeau // The PHP doc indicates that CURLOPT_CONNECTTIMEOUT_MS constant is added in cURL 7.16.2 55*04fd306cSNickeau // available since PHP 5.2.3. 56*04fd306cSNickeau if (!defined('CURLOPT_CONNECTTIMEOUT_MS')) { 57*04fd306cSNickeau define('CURLOPT_CONNECTTIMEOUT_MS', 156); // default value for CURLOPT_CONNECTTIMEOUT_MS 58*04fd306cSNickeau } 59*04fd306cSNickeau curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, self::CONNECT_TIMEOUT_MS); 60*04fd306cSNickeau 61*04fd306cSNickeau $code = null; 62*04fd306cSNickeau 63*04fd306cSNickeau try { 64*04fd306cSNickeau curl_exec($ch); 65*04fd306cSNickeau $info = curl_getinfo($ch); 66*04fd306cSNickeau $code = $info['http_code']; 67*04fd306cSNickeau } catch (Exception $e) { 68*04fd306cSNickeau } 69*04fd306cSNickeau curl_close($ch); 70*04fd306cSNickeau 71*04fd306cSNickeau return $code; 72*04fd306cSNickeau } 73*04fd306cSNickeau} 74