ID:               38369
 User updated by:  chris at mysociety dot org
 Reported By:      chris at mysociety dot org
 Status:           Wont fix
 Bug Type:         CGI related
 Operating System: *
 PHP Version:      *
 New Comment:

No, you have misunderstood. You claim that PHP is a conformant CGI
program. It is not, because it will send more than one Status: header.
I have provided a fix. You refuse to apply it. Are you no longer
interested in supporting CGI?


Previous Comments:
------------------------------------------------------------------------

[2006-08-07 15:39:31] [EMAIL PROTECTED]

You're suggesting to fix the symptom instead of the cause.

------------------------------------------------------------------------

[2006-08-07 15:17:37] chris at mysociety dot org

Perhaps you'd like to go and fix all the code which uses the Status:
header, then? A quick search will find lots of PHP programs that use it
(WordPress, for instance), and they're all broken because PHP's handling
of Status: is incorrect. Alternatively you could just make PHP's
behaviour correct, using the fix I've given you.

------------------------------------------------------------------------

[2006-08-07 15:09:51] [EMAIL PROTECTED]

The SAPI independant way to issue an HTTP response code in PHP is a
"HTTP/1.x NNN" header.


------------------------------------------------------------------------

[2006-08-07 15:04:25] chris at mysociety dot org

Description:
------------
PHP does not correctly handle calls such as header("Status: ..."). In
CGI mode it should process such a call as a changing the HTTP response
code (consistent with its handling of, e.g., header("Location: ...")).
However, at present there is no special handling of the Status: header.
That's why sending Status: and then Location: causes a duplicate header:
the Location: header is handled as a special case and causes
sapi_update_response_code(302) to be called, whereas the Status: header
is just added to the list of headers to be sent back to the web server
(see bug #33225 incorrectly marked "bogus", I think because the
reviewer doesn't understand CGI). Note that sending two different
Status: headers explicitly with header("Status: ...") doesn't give this
error, because the default operation is to *replace* the header, not add
a new one.

Here is a patch to fix the bug in 4.4.3; it also applies to 5.1.4 and
probably other versions too:

--- php-4.4.3-orig/main/SAPI.c  2006-01-01 13:46:59.000000000 +0000
+++ php-4.4.3/main/SAPI.c       2006-08-07 15:49:15.000000000 +0100
@@ -611,6 +611,14 @@
                                        /* Return a Found Redirect if
one is not already specified */
                                        sapi_update_response_code(302
TSRMLS_CC);
                                }
+                       } else if (!STRCASECMP(header_line, "Status"))
{
+                               int code;
+                               if (1 == sscanf(colon_offset + 1, "%d",
&code)
+                                       && code >= 100 && code < 1000)
{
+                                       /* Also want to suppress this
header. */
+                                       sapi_update_response_code(code
TSRMLS_CC);
+                                       return SUCCESS;
+                               } /* else error? */
                        } else if (!STRCASECMP(header_line,
"WWW-Authenticate")) { /* HTTP Authentication */
 
                                sapi_update_response_code(401
TSRMLS_CC); /* authentication-required */


-- I've also put a copy of this at
http://bitter.ukcod.org.uk/~chris/tmp/20060807/php-4.4.3-fix-duplicate-Status:.patch
 in case this form isn't transparent.

Reproduce code:
---------------
<?
header("Status: 404");
header("Location: http://www.google.com/";);
?>

Expected result:
----------------
Redirect to http://www.google.com/

Actual result:
--------------
Internal server error because PHP sends the Status: header twice,
violating the CGI spec.


------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=38369&edit=1

Reply via email to