| <?php |
| require_once 'portabilityLayer.php'; |
| |
| // This script acts as a stateful proxy for retrieving files. When the state is set to |
| // offline, it simulates a network error with a nonsense response. |
| |
| if (!sys_get_temp_dir()) { |
| header("HTTP/1.1 500 Internal Server Error"); |
| echo "FAIL: No temp dir was returned.\n"; |
| exit(); |
| } |
| |
| if (!isset($_GET['test'])) { |
| header("HTTP/1.1 500 Internal Server Error"); |
| echo "test parameter must be specified for a unique test name\n"; |
| exit(); |
| } |
| |
| function tempPathBase() |
| { |
| return sys_get_temp_dir() . "/" . $_GET['test']; |
| } |
| |
| function setState($newState, $file) |
| { |
| file_put_contents($file, $newState); |
| } |
| |
| function getState($file) |
| { |
| if (!file_exists($file)) { |
| return "Uninitialized"; |
| } |
| return file_get_contents($file); |
| } |
| |
| function contentType($path) |
| { |
| if (preg_match("/\.html$/", $path)) |
| return "text/html"; |
| if (preg_match("/\.manifest$/", $path)) |
| return "text/cache-manifest"; |
| if (preg_match("/\.js$/", $path)) |
| return "text/javascript"; |
| if (preg_match("/\.xml$/", $path)) |
| return "application/xml"; |
| if (preg_match("/\.xhtml$/", $path)) |
| return "application/xhtml+xml"; |
| if (preg_match("/\.svg$/", $path)) |
| return "application/svg+xml"; |
| if (preg_match("/\.xsl$/", $path)) |
| return "application/xslt+xml"; |
| if (preg_match("/\.gif$/", $path)) |
| return "image/gif"; |
| if (preg_match("/\.jpg$/", $path)) |
| return "image/jpeg"; |
| if (preg_match("/\.png$/", $path)) |
| return "image/png"; |
| return "text/plain"; |
| } |
| |
| function generateNoCacheHTTPHeader() |
| { |
| header("Expires: Thu, 01 Dec 2003 16:00:00 GMT"); |
| header("Cache-Control: no-cache, no-store, must-revalidate"); |
| header("Pragma: no-cache"); |
| } |
| |
| function generateResponse($path) |
| { |
| global $stateFile; |
| $state = getState($stateFile); |
| if ($state == "Offline") { |
| # Simulate a network error by replying with a nonsense response. |
| header('HTTP/1.1 307 Temporary Redirect'); |
| header('Location: ' . $_SERVER['REQUEST_URI']); # Redirect to self. |
| header('Content-Length: 1'); |
| header('Content-Length: 5', false); # Multiple content-length headers, some network stacks can detect this condition faster. |
| echo "Intentionally incorrect response."; |
| } else { |
| // A little securuty checking can't hurt. |
| if (strstr($path, "..")) |
| exit; |
| |
| if ($path[0] == '/') |
| $path = '..' . $path; |
| |
| if (!$_GET['allow-caching']) |
| generateNoCacheHTTPHeader(); |
| |
| if (file_exists($path)) { |
| header("Last-Modified: " . gmdate("D, d M Y H:i:s T", filemtime($path))); |
| header("Content-Type: " . contentType($path)); |
| |
| print file_get_contents($path); |
| } else { |
| header('HTTP/1.1 404 Not Found'); |
| } |
| } |
| } |
| |
| function handleIncreaseResourceCountCommand($path) |
| { |
| $resourceCountFile = tempPathBase() . "-count"; |
| $resourceCount = getState($resourceCountFile); |
| $pieces = explode(" ", $resourceCount); |
| $count = 0; |
| if (count($pieces) == 2 && $pieces[0] == $path) { |
| $count = 1 + $pieces[1]; |
| } else { |
| $count = 1; |
| } |
| file_put_contents($resourceCountFile, $path . " " . $count); |
| generateResponse($path); |
| } |
| |
| function handleResetResourceCountCommand() |
| { |
| $resourceCountFile = tempPathBase() . "-count"; |
| file_put_contents($resourceCountFile, 0); |
| generateNoCacheHTTPHeader(); |
| header('HTTP/1.1 200 OK'); |
| } |
| |
| function handleGetResourceCountCommand($path) |
| { |
| $resourceCountFile = tempPathBase() . "-count"; |
| $resourceCount = getState($resourceCountFile); |
| $pieces = explode(" ", $resourceCount); |
| generateNoCacheHTTPHeader(); |
| header('HTTP/1.1 200 OK'); |
| if (count($pieces) == 2 && $pieces[0] == $path) { |
| echo $pieces[1]; |
| } else { |
| echo 0; |
| } |
| } |
| |
| function handleStartResourceRequestsLog() |
| { |
| $resourceLogFile = tempPathBase() . "-log"; |
| file_put_contents($resourceLogFile, ""); |
| } |
| |
| function handleClearResourceRequestsLog() |
| { |
| $resourceLogFile = tempPathBase() . "-log"; |
| file_put_contents($resourceLogFile, ""); |
| } |
| |
| function handleGetResourceRequestsLog() |
| { |
| $resourceLogFile = tempPathBase() . "-log"; |
| |
| generateNoCacheHTTPHeader(); |
| header("Content-Type: text/plain"); |
| |
| print file_get_contents($resourceLogFile); |
| } |
| |
| function handleLogResourceRequest($path) |
| { |
| $resourceLogFile = tempPathBase() . "-log"; |
| |
| $newData = "\n".$path; |
| // Documentation says that appends are atomic. |
| file_put_contents($resourceLogFile, $newData, FILE_APPEND); |
| } |
| |
| $stateFile = tempPathBase() . "-state"; |
| $command = $_GET['command']; |
| if ($command) { |
| if ($command == "connect") |
| setState("Online", $stateFile); |
| else if ($command == "disconnect") |
| setState("Offline", $stateFile); |
| else if ($command == "increase-resource-count") |
| handleIncreaseResourceCountCommand($_GET['path']); |
| else if ($command == "reset-resource-count") |
| handleResetResourceCountCommand(); |
| else if ($command == "get-resource-count") |
| handleGetResourceCountCommand($_GET['path']); |
| else if ($command == "start-resource-request-log") |
| handleStartResourceRequestsLog(); |
| else if ($command == "clear-resource-request-log") |
| handleClearResourceRequestsLog(); |
| else if ($command == "get-resource-request-log") |
| handleGetResourceRequestsLog(); |
| else if ($command == "log-resource-request") |
| handleLogResourceRequest($_GET['path']); |
| else |
| echo "Unknown command: " . $command . "\n"; |
| exit(); |
| } |
| |
| $requestedPath = $_GET['path']; |
| generateResponse($requestedPath); |
| ?> |