$value) { if (substr($name, 0, 5) == 'HTTP_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } else if (substr($name, 0, 8) == 'CONTENT_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $name))))] = $value; } } return $headers; } } // Target determination $metd = $_SERVER['REQUEST_METHOD']; $reqp = $_SERVER['REQUEST_URI']; if ($localRoot != '') { $reqp = str_replace_once($localRoot, '', $reqp); // TODO Reliable method } // Preparing request headers $reqHeds = "$metd $root$reqp HTTP/1.1\r\n"; $reqHeds .= "Host: $serv:$port\r\n"; // Converting client request headers to server request headers $reqsHedsC = getallheaders(); foreach ($reqsHedsC as $name => $content) { switch ($name) { case 'Host': case 'Connection': break; default: $reqHeds .= "$name: $content\r\n"; } } $reqHeds .= "Connection: Close\r\n\r\n".file_get_contents('php://input'); $fp = fsockopen($serv, $port, $errno, $errstr, 30); if (!$fp) { // TODO ErrorCode, ErrorDocument echo "Couldn't connect to server.\n
$errstr ($errno)
\n"; } else { // Sending request fwrite($fp, $reqHeds); $resBuf = ''; while ($get = fgets($fp, 128)) { // Getting response if ($resBuf === True) { // If headers sent echo $get; } else { $resBuf .= $get; if ($sepPos = strrpos($resBuf, "\r\n\r\n")) { // Headers have been retrieved $resHeds = explode("\r\n", substr($resBuf, 0, $sepPos)); foreach ($resHeds as $resHed) { // Setting headers header($resHed); if (substr($resHed, 0, 4) == 'HTTP') { // FastCGI fix when using ErrorDocument header('Status: ' . substr($resHed, 9)); } } echo substr($resBuf, $sepPos + 4); // Sending the rest (usually empty) $resBuf = True; // Setting mode to automatically redirect } } } fclose($fp); } } } ?>