1 <?php 2 require_once 'portabilityLayer.php'; 3 4 // This script acts as a stateful proxy for retrieving files. When the state is set to 5 // offline, it simulates a network error with a nonsense response. 6 7 if (!sys_get_temp_dir()) { 8 echo "FAIL: No temp dir was returned.\n"; 9 exit(); 10 } 11 12 function setState($newState, $file) 13 { 14 file_put_contents($file, $newState); 15 } 16 17 function getState($file) 18 { 19 if (!file_exists($file)) { 20 return "Uninitialized"; 21 } 22 return file_get_contents($file); 23 } 24 25 function contentType($path) 26 { 27 if (preg_match("/\.html$/", $path)) 28 return "text/html"; 29 if (preg_match("/\.manifest$/", $path)) 30 return "text/cache-manifest"; 31 if (preg_match("/\.js$/", $path)) 32 return "text/javascript"; 33 if (preg_match("/\.xml$/", $path)) 34 return "application/xml"; 35 if (preg_match("/\.xhtml$/", $path)) 36 return "application/xhtml+xml"; 37 if (preg_match("/\.svg$/", $path)) 38 return "application/svg+xml"; 39 if (preg_match("/\.xsl$/", $path)) 40 return "application/xslt+xml"; 41 if (preg_match("/\.gif$/", $path)) 42 return "image/gif"; 43 if (preg_match("/\.jpg$/", $path)) 44 return "image/jpeg"; 45 if (preg_match("/\.png$/", $path)) 46 return "image/png"; 47 return "text/plain"; 48 } 49 50 function generateNoCacheHTTPHeader() 51 { 52 header("Expires: Thu, 01 Dec 2003 16:00:00 GMT"); 53 header("Cache-Control: no-cache, no-store, must-revalidate"); 54 header("Pragma: no-cache"); 55 } 56 57 function generateResponse($path) 58 { 59 global $stateFile; 60 $state = getState($stateFile); 61 if ($state == "Offline") { 62 # Simulate a network error by replying with a nonsense response. 63 header('HTTP/1.1 307 Temporary Redirect'); 64 header('Location: ' . $_SERVER['REQUEST_URI']); # Redirect to self. 65 header('Content-Length: 1'); 66 header('Content-Length: 5', false); # Multiple content-length headers, some network stacks can detect this condition faster. 67 echo "Intentionally incorrect response."; 68 } else { 69 // A little securuty checking can't hurt. 70 if (strstr($path, "..")) 71 exit; 72 73 if ($path[0] == '/') 74 $path = '..' . $path; 75 76 generateNoCacheHTTPHeader(); 77 78 if (file_exists($path)) { 79 header("Last-Modified: " . gmdate("D, d M Y H:i:s T", filemtime($path))); 80 header("Content-Type: " . contentType($path)); 81 82 print file_get_contents($path); 83 } else { 84 header('HTTP/1.1 404 Not Found'); 85 } 86 } 87 } 88 89 function handleIncreaseResourceCountCommand($path) 90 { 91 $resourceCountFile = sys_get_temp_dir() . "/resource-count"; 92 $resourceCount = getState($resourceCountFile); 93 $pieces = explode(" ", $resourceCount); 94 $count = 0; 95 if (count($pieces) == 2 && $pieces[0] == $path) { 96 $count = 1 + $pieces[1]; 97 } else { 98 $count = 1; 99 } 100 file_put_contents($resourceCountFile, $path . " " . $count); 101 generateResponse($path); 102 } 103 104 function handleResetResourceCountCommand() 105 { 106 $resourceCountFile = sys_get_temp_dir() . "/resource-count"; 107 file_put_contents($resourceCountFile, 0); 108 generateNoCacheHTTPHeader(); 109 header('HTTP/1.1 200 OK'); 110 } 111 112 function handleGetResourceCountCommand($path) 113 { 114 $resourceCountFile = sys_get_temp_dir() . "/resource-count"; 115 $resourceCount = getState($resourceCountFile); 116 $pieces = explode(" ", $resourceCount); 117 generateNoCacheHTTPHeader(); 118 header('HTTP/1.1 200 OK'); 119 if (count($pieces) == 2 && $pieces[0] == $path) { 120 echo $pieces[1]; 121 } else { 122 echo 0; 123 } 124 } 125 126 function handleStartResourceRequestsLog() 127 { 128 $resourceLogFile = sys_get_temp_dir() . "/resource-log"; 129 file_put_contents($resourceLogFile, ""); 130 } 131 132 function handleClearResourceRequestsLog() 133 { 134 $resourceLogFile = sys_get_temp_dir() . "/resource-log"; 135 file_put_contents($resourceLogFile, ""); 136 } 137 138 function handleGetResourceRequestsLog() 139 { 140 $resourceLogFile = sys_get_temp_dir() . "/resource-log"; 141 142 generateNoCacheHTTPHeader(); 143 header("Content-Type: text/plain"); 144 145 print file_get_contents($resourceLogFile); 146 } 147 148 function handleLogResourceRequest($path) 149 { 150 $resourceLogFile = sys_get_temp_dir() . "/resource-log"; 151 152 $newData = "\n".$path; 153 // Documentation says that appends are atomic. 154 file_put_contents($resourceLogFile, $newData, FILE_APPEND); 155 generateResponse($path); 156 } 157 158 $stateFile = sys_get_temp_dir() . "/network-simulator-state"; 159 $command = $_GET['command']; 160 if ($command) { 161 if ($command == "connect") 162 setState("Online", $stateFile); 163 else if ($command == "disconnect") 164 setState("Offline", $stateFile); 165 else if ($command == "increase-resource-count") 166 handleIncreaseResourceCountCommand($_GET['path']); 167 else if ($command == "reset-resource-count") 168 handleResetResourceCountCommand(); 169 else if ($command == "get-resource-count") 170 handleGetResourceCountCommand($_GET['path']); 171 else if ($command == "start-resource-request-log") 172 handleStartResourceRequestsLog(); 173 else if ($command == "clear-resource-request-log") 174 handleClearResourceRequestsLog(); 175 else if ($command == "get-resource-request-log") 176 handleGetResourceRequestsLog(); 177 else if ($command == "log-resource-request") 178 handleLogResourceRequest($_GET['path']); 179 else 180 echo "Unknown command: " . $command . "\n"; 181 exit(); 182 } 183 184 $requestedPath = $_GET['path']; 185 generateResponse($requestedPath); 186 ?> 187