xref: /plugin/combo/vendor/php-webdriver/webdriver/lib/Net/URLChecker.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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