fix: viewport before page load, 60ms->60s timeout, viewport cap, generic errors

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-21 11:49:49 +02:00
parent cc30d2288e
commit 8590465c6a

View File

@@ -40,6 +40,13 @@ switch ($url[0]) {
echo 'Invalid viewport format. Use WIDTHxHEIGHT (e.g., 1024x768)'; echo 'Invalid viewport format. Use WIDTHxHEIGHT (e.g., 1024x768)';
exit; exit;
} }
$vpParts = array_map('intval', explode('x', $viewport));
if ($vpParts[0] > 3840 || $vpParts[1] > 2160) {
header('HTTP/1.0 400 Bad Request');
echo 'Viewport exceeds maximum (3840x2160)';
exit;
}
$js = $_REQUEST['js'] == 'false' ? false : true; $js = $_REQUEST['js'] == 'false' ? false : true;
$serverUrl = 'http://localhost:4444'; $serverUrl = 'http://localhost:4444';
@@ -49,45 +56,34 @@ switch ($url[0]) {
$capabilities = DesiredCapabilities::chrome(); $capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(\Facebook\WebDriver\Chrome\ChromeOptions::CAPABILITY, $options); $capabilities->setCapability(\Facebook\WebDriver\Chrome\ChromeOptions::CAPABILITY, $options);
//disable javascript if $js is false
if (!$js) if (!$js)
$capabilities->setCapability('javascriptEnabled', false); $capabilities->setCapability('javascriptEnabled', false);
$driver = null; $driver = null;
$error = null; $error = null;
try { try {
$driver = RemoteWebDriver::create($serverUrl, $capabilities, 30000, 60); $driver = RemoteWebDriver::create($serverUrl, $capabilities, 30000, 60000);
$driver->manage()->window()->setSize(new \Facebook\WebDriver\WebDriverDimension($vpParts[0], $vpParts[1]));
$driver->get($target); $driver->get($target);
//hide scroll bars
$driver->executeScript('document.body.style.overflow = "hidden";'); $driver->executeScript('document.body.style.overflow = "hidden";');
if ($viewport) { addToLog($ip . ' Requested ' . $target . ' viewport=' . $viewport . ' js=' . ($js ? 'enabled' : 'disabled'));
$viewport = explode('x', $viewport);
$driver->manage()->window()->setSize(new \Facebook\WebDriver\WebDriverDimension($viewport[0], $viewport[1]));
} else {
$viewport = [1024, 768];
$driver->manage()->window()->setSize(new \Facebook\WebDriver\WebDriverDimension($viewport[0], $viewport[1]));
}
$viewportLabel = is_array($viewport) ? implode('x', $viewport) : (string) $viewport;
addToLog("$ip\tRequested $target with viewport " . $viewportLabel . " and js " . ($js ? 'enabled' : 'disabled'));
// take screenshot and send to user
$screenshot = $driver->takeScreenshot(); $screenshot = $driver->takeScreenshot();
header('Content-Type: image/png'); header('Content-Type: image/png');
header('Content-Length: ' . strlen($screenshot)); header('Content-Length: ' . strlen($screenshot));
echo $screenshot; echo $screenshot;
} catch (Exception $e) { } catch (Exception $e) {
$error = $e->getMessage(); $error = $e->getMessage();
addToLog("$ip\tRequested $target but resulted in error:\t" . $error); addToLog($ip . ' Error requesting ' . $target . ': ' . $error);
} finally { } finally {
if ($driver instanceof \Facebook\WebDriver\Remote\RemoteWebDriver) { if ($driver instanceof RemoteWebDriver) {
try { $driver->quit(); } catch (Exception $q) {} try { $driver->quit(); } catch (Exception $q) {}
} }
} }
if ($error !== null) { if ($error !== null) {
header('HTTP/1.0 500 Internal Server Error'); header('HTTP/1.0 500 Internal Server Error');
echo 'Error: ' . $error; echo 'Screenshot failed';
} }
break; break;