0) { $buffer = fgets($client, $content_length+1); } else { $buffer = ""; } return $buffer; } function get_content_length($request) { $ret = strstr($request, "Content-Length: "); if($ret) { $ret = substr($ret, 16); $str = strstr($ret, "\r\n"); if($str) { $ret = substr($ret, 0, strlen($ret) - strlen($str)); $ret = intval($ret); } } return $ret; } function get_URI($request) { $ret = ""; if(($ret = strstr($request, "GET /")) == $request) { $ret = substr($ret, 4); $str = strstr($ret, " "); if($str) { $ret = substr($ret, 0, strlen($ret) - strlen($str)); $ret = trim($ret); } } else if(($ret = strstr($request, "POST /")) == $request) { $ret = substr($ret, 5); $str = strstr($ret, " "); if($str) { $ret = substr($ret, 0, strlen($ret) - strlen($str)); $ret = trim($ret); } } else { $ret = "/index.php"; } $temp = strstr($ret, "?"); if($temp) { $ret = substr($ret, 0, strlen($ret) - strlen($temp)); } debug("URI=" . $ret . "\n"); return $ret; } function get_script($script) { debug("Get script: ".$script."\n"); $fp = fopen($script, "r"); $ret = ""; if($fp) { while($buffer = fgets($fp)) { $ret .= $buffer; } fclose($fp); } if($ret == "") { $ret = null; } return $ret; } global $script_output; $script_output = ""; function script_callback($buffer) { global $script_output; $script_output .= $buffer; return $buffer; } function run_script($script, $request_method, $query_string) { if($script == "" || $script == "/") { $script = HTTPD_DEFAULT_DOCUMENT; } debug("Run script: " . HTTPD_DOCUMENT_ROOT . $script . "\n"); debug("Request method: " . $request_method . "\n"); $script_code = get_script(HTTPD_DOCUMENT_ROOT . $script); if($script_code == null) return null; $response = ""; if($script_code != null) { $temp = preg_split("/[\&]/", $query_string); $_GET = array(); $_POST = array(); $HTTP_GET_VARS = &$_GET; $HTTP_POST_VARS = &$_POST; for($i = 0; $i < sizeof($temp); $i++) { $temp2 = preg_split("/[\=]/", $temp[$i]); if(sizeof($temp2) == 2) { if(strcmp($request_method,"GET") == 0) { $_GET[urldecode($temp2[0])] = urldecode($temp2[1]); } else if(strcmp($request_method,"POST") == 0) { $_POST[urldecode($temp2[0])] = urldecode($temp2[1]); } } } debug("---RUN-SCRIPT---\n"); ob_start("script_callback"); //ob_start(); /* if(eval($script_code) != 0) { ob_end_clean(); return 0; } */ include(HTTPD_DOCUMENT_ROOT .$script); //$response = ob_get_contents(); ob_end_clean(); //ob_end_flush(); global $script_output; $response = $script_output; $script_output = ""; //$script_output = ""; debug("---DONE-SCRIPT---\n"); } return $response; } global $mime_array; $mime_array = array(); function init_mime_array() { $fp = fopen(HTTPD_MIME_TYPE, "r"); if($fp) { while(($buffer = fgetcsv($fp, 1000, ",")) != null) { $ext = $buffer[0]; $mime = $buffer[1]; $mime_array[$ext] = $mime; } fclose($fp); } } function get_mime_type($file_name) { $ret = "text/html"; if(strlen($file_name) > 4) { $ext = substr($file_name, strlen($file_name) - 4); $ret = $mime_array[$ext]; } return $ret; } function process_request($client, $request) { debug("Process request...\n"); $request_method = get_request_method($request); debug("REQUEST_METHOD=" . $request_method."\n"); $script = get_URI($request); if(is_safe_uri($script)) { debug("SCRIPT=" . $script."\n"); if($request_method == "GET") { $query_string = get_query_string($request); debug("QUERY_STRING=" . $query_string . "\n"); $response = run_script($script, $request_method, $query_string); if($response == null) $respone_code = HTTP_BAD_REQUEST; else $response_code = HTTP_OK; } else if($request_method == "POST") { $content_length = get_content_length($request); $query_string = get_post_string($client, $content_length); debug("POST_QUERY_STRING=" . $query_string . "\n"); $response = run_script($script, $request_method, $query_string); if($response == null) $respone_code = HTTP_BAD_REQUEST; else $response_code = HTTP_OK; } else { $response_code = HTTP_BAD_REQUEST; } } // Response headders if($response_code == HTTP_OK) { $hresponse = "HTTP/1.1 200 OK\r\n"; } else if($response_code == HTTP_FILE_NOT_FOUND) { $hresponse = "HTTP/1.1 404 File Not Found\r\n"; } else if($response_code == HTTP_BAD_REQUEST) { $hresponse = "HTTP/1.1 400 Bad Request\r\n"; } else { $hresponse = "HTTP/1.1 400 Bad Request\r\n"; } //$hresponse = "HTTP/1.1 200 OK\r\n"; $hresponse .= "Server: ".HTTPD_VERSION."\r\n"; $hresponse .= "Content-Length: " . strlen($response) . "\r\n"; $hresponse .= "Connection: close\r\n"; $hresponse .= "Content-type: " . get_mime_type(HTTPD_ROOT_DIRECTORY . $script) . "\r\n\r\n"; debug("Done process request...\n"); return $hresponse . $response; } function log_request($IP, $request) { debug("Logging request...\n"); $log = fopen(HTTPD_LOG_FILE, "a"); if($log) { fprintf($log, "---BEGIN-REQUEST---\n"); fprintf($log, "IP=%s\n", $IP); fprintf($log, "SERVER_TIME=%s\n", `date`); fprintf($log, "%s", $request . "\n"); fprintf($log, "---END-REQUEST---\n"); fclose($log); } debug("Done log...\n"); } function send_response($client, $response) { debug("Send response...\n"); fwrite($client, $response); fflush($client); debug("Response sent...\n"); } function close_connection($client) { debug("Close client connection...\n"); fclose($client); } // // Script main: // debug("PHP HTTPD...\n"); debug("Version: " . HTTPD_VERSION . "\n"); debug("By: Matthew W. Coan\n"); debug("eMail: coan.matthew@yahoo.com\n"); debug("Loading mime type file: " . HTTPD_MIME_TYPE . "\n"); init_mime_array(); debug("Starting server script: ". __FILE__ ."\n"); debug("Create server socket...\n"); $svr = create_server_socket(HTTPD_HOST, HTTPD_PORT) or die("Unable to create server socket...\n"); debug("Enter server main loop...\n"); if($svr != null) { while(true) { $client = accept_connection($svr); if($client == null) continue; debug("Accept connection...\n"); $IP = stream_socket_get_name($client, true); debug("IP Address=".$IP."\n"); $request = read_request($client); log_request($IP, $request); $response = process_request($client, $request); send_response($client, $response); close_connection($client); } } fclose($svr); ?>