Bug #9434 Updated: php-cgi is unable to parse GET request on command line properly

From: Date: Sat, 15 Jun 2002 14:13:21 +0000
Subject: Bug #9434 Updated: php-cgi is unable to parse GET request on command line properly
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-10502@lists.php.net to get a copy of this message
ID: 9434 Updated by: mfischer@php.net -Summary: Command line argument, that trates as QUERY_STRING, isn't proper. Reported By: sagawa@sohgoh.net -Status: Closed +Status: Open -Bug Type: Feature/Change Request +Bug Type: *General Issues -Operating System: Linux,Windows 2000 +Operating System: Any -PHP Version: 4.0.4pl1 +PHP Version: CVS New Comment: This issue is still valid and should be addressed before 4.3.0: C:\php\latest>type test.php <? echo "\$_GET: \n"; var_dump($_GET); echo "\n\$argv: \n"; var_dump($_SERVER['argv']); ?> C:\php\latest>php-cgi -v PHP 4.3.0-dev (cgi), Copyright (c) 1997-2002 The PHP Group Zend Engine v1.2.1, Copyright (c) 1998-2002 Zend Technologies C:\php\latest>php-cgi -f test.php "a=1" "b=2" "c=3&d=4" $_GET: array(2) { ["test_php_a"]=> string(9) "1 b=2 c=3" ["d"]=> string(1) "4" } $argv: array(4) { [0]=> string(8) "test.php" [1]=> string(3) "a=1" [2]=> string(3) "b=2" [3]=> string(7) "c=3&d=4" } Obviously, the "test_php_a" entry in $_GET is wrong. This is because internal this is translated to "test.php?a=1" and since "." and "?" are not allowed in variable names they're converted to "_". The patch above is not sufficient. A few things have to be considered for consistence: the $_SERVER['argv'] should always containt the right parameters too (i.e. if someone fixed the $_GET issue, $_SERVER['argv'] should still work. If you take a look at the source (cgi_main.c and main/main.c in php_build_argv you'll soon see what I mean). The purpose of this is to have the ability to run CGI written scripts from the shell and be able to pass the same GET request to the script. Previous Comments: ------------------------------------------------------------------------ [2001-03-15 12:22:43] sagawa@sohgoh.net I withdraw this patch. Because, it turns out that this patch have a bad influence on argument variables. All argvs are connected to only argv[0], so we can't get argv[2] and so on. I am thankful to Mr.Hirokawa who pointed out this. ------------------------------------------------------------------------ [2001-02-24 04:33:33] sagawa@sohgoh.net I get funny $HTTP_GET_VARS passed by command line argument query_string, on PHP 4.0.4(as far as I know :) with cgi-sapi. This is sample for this problem. test.php is <?php var_dump($HTTP_GET_VARS); ?> and run from command line. % php -f test.php 'AAA=xx&BB=yy' 'CC=zz' array(2) { ["test_php_AAA"]=> string(2) "xx" ["BB"]=> string(8) "yy CC=zz" } `AAA' is connected with file name, and inserted space between arguments. (test.php was changed to test_php because of php variable name restriction.) So, I modify sapi/cgi/cgi_main.c. % diff -u cgi_main.c~ cgi_main.c --- cgi_main.c~ Sun Dec 3 10:09:13 2000 +++ cgi_main.c Thu Feb 22 21:20:47 2001 @@ -649,14 +649,10 @@ s = malloc(len + 1); /* leak - but only for command line version, so ok */ *s = '\0'; /* we are pretending it came from the environment */ - if (script_file) { - strcpy(s, script_file); - strcat(s, "+"); - } for (i = ap_php_optind, len = 0; i < argc; i++) { strcat(s, argv[i]); if (i < (argc - 1)) { - strcat(s, "+"); + strcat(s, PG(arg_separator)); } } SG(request_info).query_string = s; This works fine, like... % php -f test.php 'AAA=xx&BB=yy' 'CC=zz' array(3) { ["AAA"]=> string(2) "xx" ["BB"]=> string(2) "yy" ["CC"]=> string(2) "zz" } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=9434&edit=1

« previous php.bugs (#10502) next »