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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user