Gregory Beaver wrote: > Gregory Beaver wrote: >> Hi, >> >> I'm trying to figure out how to test a feature in the phar extension >> that requires the executable test file to be an actual phar archive. >> This would be possible if there was some way to load the --FILE-- >> section from an external file. Would anyone object to adding a new >> section to the .phpt format "--FILE_EXTERNAL--" that simply takes a >> relative path to the file to use as the contents for the test? >> >> The attached patch adds this section and also fixes a minor bug in the >> handling of POST_RAW that inserts a spurious \n > > Hi again, > > After a bit more thought, I revised things. The attached patch is > better - it simply copies the external file and saves it as the > $test_file. I also failed to mention that this is against PHP_5_3, but > obviously could be ported to HEAD pretty much unmodified
OK, so it gets even better. --EXPECTHEADERS-- is broken in run-tests.php as well, it uses CLI sapi. A quick scan of all .phpt tests showed only 1 test actually using --EXPECTHEADERS--. The patch is updated to shunt to cgi sapi if the test contains EXPECTHEADERS because (duh) cli won't output any headers, causing tests using it to fail. Greg
Index: run-tests.php =================================================================== RCS file: /repository/php-src/run-tests.php,v retrieving revision 1.226.2.37.2.35.2.10 diff -u -r1.226.2.37.2.35.2.10 run-tests.php --- run-tests.php 1 Jan 2008 06:15:40 -0000 1.226.2.37.2.35.2.10 +++ run-tests.php 5 Jan 2008 03:22:01 -0000 @@ -1034,7 +1034,7 @@ if (preg_match('/^--([_A-Z]+)--/', $line, $r)) { $section = $r[1]; $section_text[$section] = ''; - $secfile = $section == 'FILE' || $section == 'FILEEOF'; + $secfile = $section == 'FILE' || $section == 'FILEEOF' || $section == 'FILE_EXTERNAL'; $secdone = false; continue; } @@ -1060,7 +1060,7 @@ $borked = false; } } else { - if (@count($section_text['FILE']) + @count($section_text['FILEEOF']) != 1) { + if (@count($section_text['FILE']) + @count($section_text['FILEEOF']) + @count($section_text['FILE_EXTERNAL']) != 1) { $bork_info = "missing section --FILE--"; $borked = true; } @@ -1068,6 +1068,17 @@ $section_text['FILE'] = preg_replace("/[\r\n]+$/", '', $section_text['FILEEOF']); unset($section_text['FILEEOF']); } + if (@count($section_text['FILE_EXTERNAL']) == 1) { + // don't allow tests to retrieve files from anywhere but this subdirectory + $section_text['FILE_EXTERNAL'] = dirname($file) . '/' . trim(str_replace('..', '', $section_text['FILE_EXTERNAL'])); + if (@file_exists($section_text['FILE_EXTERNAL'])) { + $section_text['FILE'] = file_get_contents($section_text['FILE_EXTERNAL']); + unset($section_text['FILE_EXTERNAL']); + } else { + $bork_info = "could not load --FILE_EXTERNAL-- " . dirname($file) . '/' . trim($section_text['FILE_EXTERNAL']); + $borked = true; + } + } if ((@count($section_text['EXPECT']) + @count($section_text['EXPECTF']) + @count($section_text['EXPECTREGEX'])) != 1) { $bork_info = "missing section --EXPECT--, --EXPECTF-- or --EXPECTREGEX--"; $borked = true; @@ -1093,7 +1104,7 @@ $tested = trim($section_text['TEST']); /* For GET/POST tests, check if cgi sapi is available and if it is, use it. */ - if (!empty($section_text['GET']) || !empty($section_text['POST']) || !empty($section_text['POST_RAW']) || !empty($section_text['COOKIE'])) { + if (!empty($section_text['GET']) || !empty($section_text['POST']) || !empty($section_text['POST_RAW']) || !empty($section_text['COOKIE']) || !empty($section_text['EXPECT_HEADERS'])) { if (isset($php_cgi)) { $old_php = $php; $php = $php_cgi .' -C '; @@ -1355,12 +1366,15 @@ $raw_lines = explode("\n", $post); $request = ''; + $started = false; foreach ($raw_lines as $line) { if (empty($env['CONTENT_TYPE']) && preg_match('/^Content-Type:(.*)/i', $line, $res)) { $env['CONTENT_TYPE'] = trim(str_replace("\r", '', $res[1])); continue; } - $request .= $line . "\n"; + if ($started) $request .= "\n"; + $started = true; + $request .= $line; } $env['CONTENT_LENGTH'] = strlen($request);
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php