--- /dev/null
+<?php
+
+function debugAndDie() {
+ print "<pre>";
+ print_r($_GET);
+ print_r($_POST);
+ print_r($_COOKIE);
+ print_r($_SERVER);
+ print_r(apache_request_headers());
+ print "</pre>";
+ die();
+}
+
+function debug($msg) {
+ $fp = fopen("/tmp/debug.log", "a");
+ fwrite($fp, "===\n");
+ fwrite($fp, $msg);
+ fwrite($fp, "\n");
+ fclose($fp);
+}
+
+function getUrl($url) {
+ if(isset($_SERVER["PATH_INFO"])) {
+ $url .= $_SERVER["PATH_INFO"];
+ }
+ $url = parse_url($url);
+ if(!isset($url["port"])) {
+ $url["port"] = 80;
+ if($url["scheme"] == "https") {
+ $url["port"] = 443;
+ }
+ }
+ if(strlen($_SERVER["QUERY_STRING"]) > 0) {
+ $url["path"] = $url["path"] . "?" . $_SERVER["QUERY_STRING"];
+ }
+ return $url;
+}
+
+function generateRequest($rmeth, $host, $path) {
+ $crlf = "\r\n";
+
+ $req = $rmeth . " " . $path . " HTTP/1.0" . $crlf;
+
+ $headers = apache_request_headers();
+ if(isset($headers["Host"])) {
+ $req .= "Host: " . $headers["Host"] . $crlf;
+ }
+ if(isset($headers["Cookie"])) {
+ $req .= "Cookie: " . $headers["Cookie"] . $crlf;
+ }
+ if(isset($headers["Cookie2"])) {
+ $req .= "Cookie2: " . $headers["Cookie2"] . $crlf;
+ }
+ if(isset($headers["Referer"])) {
+ $req .= "Referer: " . $headers["Referer"] . $crlf;
+ }
+ if(isset($headers["Content-Length"])) {
+ $req .= "Content-Length: " . $headers["Content-Length"] . $crlf;
+ }
+ if(isset($headers["Content-Type"])) {
+ $val = $headers["Content-Type"];
+ $val = str_replace("PHPHACK", "", $val);
+ $req .= "Content-Type: " . $headers["Content-Type"] . $crlf;
+ }
+
+ $req .= $crlf;
+
+ return $req;
+}
+
+function doProxy($scheme, $rmeth, $host, $port, $path)
+{
+ $req = generateRequest($rmeth, $host, $path);
+
+ // Make the HTTP request
+ $fp = fsockopen(($scheme == 'https' ? 'ssl://' : '') . $host, $port);
+ if(!$fp) {
+ die("Could not connect to internal server!");
+ }
+ fwrite($fp, $req);
+ if($rmeth == "POST") {
+ $fpi = fopen("php://input", "rb");
+ while(!feof($fpi)) {
+ fwrite($fp, fread($fpi, 1024));
+ }
+ fclose($fpi);
+ }
+
+ $headers = array();
+ $mode = 0;
+ while(is_resource($fp) && $fp && !feof($fp)) {
+ // Parsing headers
+ if($mode == 0) {
+ // Grab a line
+ $line = fgets($fp);
+
+ if(strlen(trim($line)) != 0) {
+ array_push($headers, $line);
+ } else {
+ $mode = 1;
+ foreach($headers as $header) {
+ header($header);
+ }
+ }
+ }
+ // Body data!
+ else {
+ myPassThru($fp);
+ }
+ }
+
+ fclose($fp);
+}
+
+function myPassThru($fp) {
+ $data = "";
+ while(!feof($fp)) {
+ $data .= fread($fp, 1024);
+ }
+ $data = str_replace("enctype=\"multipart/form-data\"", "enctype=\"PHPHACKmultipart/form-data\"", $data);
+ print $data;
+}
+
+function main($basePath) {
+ ///debugAndDie();
+
+ $u = getUrl($basePath);
+ $rmeth = $_SERVER["REQUEST_METHOD"];
+ doProxy($u["scheme"], $rmeth, $u["host"], $u["port"], $u["path"]);
+}
+
+// Run!
+if(!isset($PROXY)) {
+ die("No forwarding available!");
+}
+
+main($PROXY);
+
+?>