public function stream(Git_HTTP_Command $command) { $cwd = '/tmp'; $descriptorspec = array(0 => array("pipe", "r"), 1 => array("pipe", "w")); if (ForgeConfig::get('sys_logger_level') == Logger::DEBUG) { $descriptorspec[2] = array('file', ForgeConfig::get('codendi_log') . '/git_http_error_log', 'a'); } $pipes = array(); $this->logger->debug('Command: ' . $command->getCommand()); $this->logger->debug('Environment: ' . print_r($command->getEnvironment(), true)); $process = proc_open($command->getCommand(), $descriptorspec, $pipes, $cwd, $command->getEnvironment()); if (is_resource($process)) { if ($_SERVER['REQUEST_METHOD'] == 'POST') { fwrite($pipes[0], file_get_contents('php://input')); } fclose($pipes[0]); $first = true; while ($result = stream_get_contents($pipes[1], self::CHUNK_LENGTH)) { if ($first) { list($headers, $body) = http_split_header_body($result); foreach (explode("\r\n", $headers) as $header) { header($header); } file_put_contents('php://output', $body); } else { file_put_contents('php://output', $result); } $first = false; } fclose($pipes[1]); $return_value = proc_close($process); } }
public function getContent(HTTPRequest $request) { $parse = $this->displayViewVcHeader($request); $headers = ""; $body = ""; //this is very important. default path must be / $path = "/"; if ($request->getFromServer('PATH_INFO') != "") { $path = $request->getFromServer('PATH_INFO'); // hack: path must always end with / if (strrpos($path, "/") != strlen($path) - 1) { $path .= "/"; } } $command = 'HTTP_COOKIE=' . $this->escapeStringFromServer($request, 'HTTP_COOKIE') . ' ' . 'HTTP_USER_AGENT=' . $this->escapeStringFromServer($request, 'HTTP_USER_AGENT') . ' ' . 'REMOTE_ADDR=' . escapeshellarg(HTTPRequest::instance()->getIPAddress()) . ' ' . 'QUERY_STRING=' . $this->cleanQueryString($request) . ' ' . 'SERVER_SOFTWARE=' . $this->escapeStringFromServer($request, 'SERVER_SOFTWARE') . ' ' . 'SCRIPT_NAME=' . $this->escapeStringFromServer($request, 'SCRIPT_NAME') . ' ' . 'HTTP_ACCEPT_ENCODING=' . $this->escapeStringFromServer($request, 'HTTP_ACCEPT_ENCODING') . ' ' . 'HTTP_ACCEPT_LANGUAGE=' . $this->escapeStringFromServer($request, 'HTTP_ACCEPT_LANGUAGE') . ' ' . 'PATH_INFO=' . $this->setLocaleOnFileName($path) . ' ' . 'PATH=' . $this->escapeStringFromServer($request, 'PATH') . ' ' . 'HTTP_HOST=' . $this->escapeStringFromServer($request, 'HTTP_HOST') . ' ' . 'DOCUMENT_ROOT=' . $this->escapeStringFromServer($request, 'DOCUMENT_ROOT') . ' ' . 'CODENDI_LOCAL_INC=' . $this->escapeStringFromServer($request, 'CODENDI_LOCAL_INC') . ' ' . '/var/www/cgi-bin/viewvc.cgi 2>&1'; $content = $this->setLocaleOnCommand($command); list($headers, $body) = http_split_header_body($content); $content_type_line = strtok($content, "\n\t\r\v"); $viewvc_content_type = $this->getViewVcContentType($content_type_line, $path); $content = substr($content, strpos($content, $content_type_line)); $location_line = strtok($content, "\n\t\r\v"); $viewvc_location = $this->getViewVcLocationHeader($location_line); if ($viewvc_location) { $content = substr($content, strpos($content, $location_line)); } if ($parse) { //parse the html doc that we get from viewvc. //remove the http header part as well as the html header and //html body tags $begin_body = stripos($content, "<body"); $begin_doc = strpos($content, ">", $begin_body) + 1; $length = strpos($content, "</body>\n</html>") - $begin_doc; // Now insert references, and display return util_make_reference_links(substr($content, $begin_doc, $length), $request->get('group_id')); } else { if ($viewvc_location) { $redirect = new \URLRedirect(); $redirect->makeReturnToUrl($request, $viewvc_location); // TODO: need to test this // header('Location: '.$viewvc_location); // exit(1); } header('Content-Type:' . $viewvc_content_type . '; charset=utf-8'); return $body; } }
/** * call the viewvc.cgi and echo the parsed output */ function viewvc_utils_passcommand() { $parse = viewvc_utils_display_header(); $request_uri = getStringFromServer('REQUEST_URI'); //this is very important ... if (getStringFromServer('PATH_INFO') == "") { $path = "/"; //echo "no path<br>\n"; } else { $path = getStringFromServer('PATH_INFO'); // hack: path must always end with / if (strrpos($path, "/") != strlen($path) - 1) { $path .= "/"; } //echo "path=$path<br>\n"; } // "view=auto" is not well supported in wrapped mode. See SR 341 on Partners. $query_string = str_replace("view=auto", "view=markup", viewvc_utils_escape_string_from_server('QUERY_STRING')); $command = 'HTTP_COOKIE=' . viewvc_utils_escape_string_from_server('HTTP_COOKIE') . ' ' . 'HTTP_USER_AGENT=' . viewvc_utils_escape_string_from_server('HTTP_USER_AGENT') . ' ' . 'REMOTE_ADDR=' . escapeshellarg(HTTPRequest::getIPAddress()) . ' ' . 'QUERY_STRING=' . $query_string . ' ' . 'SERVER_SOFTWARE=' . viewvc_utils_escape_string_from_server('SERVER_SOFTWARE') . ' ' . 'SCRIPT_NAME=' . viewvc_utils_escape_string_from_server('SCRIPT_NAME') . ' ' . 'HTTP_ACCEPT_ENCODING=' . viewvc_utils_escape_string_from_server('HTTP_ACCEPT_ENCODING') . ' ' . 'HTTP_ACCEPT_LANGUAGE=' . viewvc_utils_escape_string_from_server('HTTP_ACCEPT_LANGUAGE') . ' ' . 'PATH_INFO=' . viewvc_utils_wrap_utf8_file_name($path) . ' ' . 'PATH=' . viewvc_utils_escape_string_from_server('PATH') . ' ' . 'HTTP_HOST=' . viewvc_utils_escape_string_from_server('HTTP_HOST') . ' ' . 'DOCUMENT_ROOT=' . viewvc_utils_escape_string_from_server('DOCUMENT_ROOT') . ' ' . 'CODENDI_LOCAL_INC=' . viewvc_utils_escape_string_from_server('CODENDI_LOCAL_INC') . ' ' . '/var/www/cgi-bin/viewvc.cgi 2>&1'; $content = viewvc_utils_wrap_utf8_exec($command); list($headers, $body) = http_split_header_body($content); // Set content type header from the value set by ViewVC // No other headers are generated by ViewVC because generate_etags // is set to 0 in the ViewVC config file $found = false; $line = strtok($content, "\n\t\r\v"); $pathInfo = pathinfo($path); while ($line && !$found) { if (preg_match('/^Content-Type:(.*)$/', $line, $matches)) { //Until Apache will support the office 2007 mime types by default //We should keep test on extension for IE to set the right Mime Type. $officeEtensions = array('docm' => 'application/vnd.ms-word.document.macroEnabled.12', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'potm' => 'application/vnd.ms-powerpoint.template.macroEnabled.12', 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'sldm' => 'application/vnd.ms-powerpoint.slide.macroEnabled.12', 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'); if (array_key_exists('extension', $pathInfo) && array_key_exists($pathInfo['extension'], $officeEtensions)) { $viewvc_content_type = $officeEtensions[$pathInfo['extension']]; } else { $viewvc_content_type = $matches[1]; } $found = true; } $line = strtok("\n\t\r\v"); } $content = substr($content, strpos($content, $line)); // Now look for 'Location:' header line (e.g. generated by 'view=redirect_pathrev' // parameter, used when browsing a directory at a certain revision number) $found = false; $line = strtok($content, "\n\t\r\v"); $viewvc_location = false; while ($line && !$found && strlen($line) > 1) { if (preg_match('/^Location:(.*)$/', $line, $matches)) { $viewvc_location = $matches[1]; $found = true; } $line = strtok("\n\t\r\v"); } if ($found) { $content = substr($content, strpos($content, $line)); } if ($parse) { //parse the html doc that we get from viewvc. //remove the http header part as well as the html header and //html body tags $begin_body = strpos($content, "<body"); if ($begin_body === false) { $begin_body = strpos($content, "<BODY"); $begin_doc = strpos($content, ">", $begin_body) + 1; } else { $begin_doc = strpos($content, ">", $begin_body) + 1; } $length = strpos($content, "</body>\n</html>") - $begin_doc; // Now insert references, and display echo util_make_reference_links(substr($content, $begin_doc, $length), $GLOBALS['group_id']); } else { if ($viewvc_location) { header('Location: ' . $viewvc_location); exit(1); } header('Content-Type:' . $viewvc_content_type . '; charset=utf-8'); echo $body; } }
/** * @see https://tuleap.net/plugins/tracker/?aid=5604&group_id=101 ViewVC download broken when file start with 0x00 */ public function itExtractsBodyWithBinaryData() { require_once 'utils.php'; list($headers, $body) = http_split_header_body(file_get_contents(dirname(__FILE__) . '/_fixtures/svn_bin_data')); $this->assertEqual("Content-Type: text/plain", $headers); }