function WebkitPdf()
{
if (empty($_REQUEST['url'])) {
- $this->h404();
+ $this->h404("missing url");
}
require_once 'System.php';
- $xvfb =
+ $timeout= System::which('timeout');
+ if (empty($timeout)) {
+ $this->h404("missing timeout");
+ }
+
+ $xvfb = System::which('xvfb-run');
+ if (empty($xvfb)) {
+ $this->h404("missing xvfb");
+ }
+
+ $webkitpdf = System::which('webkitpdf');
+ if (empty($webkitpdf )) {
+ $this->h404("missing webkitpdf (compile it..)");
+ }
+ // max delay 20 seconds.? bit generous..
+ $delay = empty($_REQUEST['delay']) ? 1 : max(20,$_REQUEST['delay']);
+
+ //?? allow injections?
+ // not yet..
+
+ $outpr = tempnam(ini_get('session.save_path'), 'webkitTMP');
+ unlink($outpr);
+ $out = $outpr .'.pdf';
+
+ // can take 2-5 minutes...
+
+ $cmd = "timeout 300s $xvfb --auto-servernum $webkitpdf " .
+ " --url " . escapeshellarg($_REQUEST['url']) . ' ' .
+ " --pdf " . $out . ' ';
+
+ $res = `$cmd`;
+
+ if (!file_exists($out)) {
+ $this->h404("Failed to create file $cmd ==> $res");
+ }
+
+ header('Content-type: application/octet-stream');
+
+ header("Expires: ");
+ header("Cache-Control: must-revalidate, post-check=0,pre-check=0");
+ header("Pragma: public");
+ header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT");
+
+ //header('Content-length: '. filesize($out));
+ header('Content-Disposition: attachment; filename="' . htmlspecialchars(basename($out)). '"');
+ ini_set('display_errors', 0);
+
+ $fh = fopen($out, 'rb');
+ fpassthru($fh);
+
+ fclose($fh);
+
+
+ unlink($out);
+ exit;
+
+
+ }
+
+ function h404($msg)
+ {
+ header("HTTP/1.0 404 Not Found");
+ echo htmlspecialchars($msg);
+ exit;
}
}
\ No newline at end of file