blob: 07a9ad8962fb4daa0844a74883c07bba02356037 [file] [log] [blame]
<?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);
?>