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