dmitry Thu Nov 1 15:23:15 2007 UTC Modified files: (Branch: PHP_5_2) /php-src NEWS /php-src/sapi/cgi cgi_main.c /php-src/sapi/cgi/tests 003.phpt 008.phpt Log: Fixed bug #42848 (Status: header incorrect under FastCGI) http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.994&r2=1.2027.2.547.2.995&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.994 php-src/NEWS:1.2027.2.547.2.995 --- php-src/NEWS:1.2027.2.547.2.994 Thu Nov 1 14:10:18 2007 +++ php-src/NEWS Thu Nov 1 15:23:14 2007 @@ -195,6 +195,7 @@ - Fixed PECL bug #11216 (crash in ZipArchive::addEmptyDir when a directory already exists). (Pierre) +- Fixed bug #42848 (Status: header incorrect under FastCGI). (Dmitry) - Fixed bug #42368 (Incorrect error message displayed by pg_escape_string). (Ilia) - Fixed bug #42365 (glob() crashes and/or accepts way too many flags). http://cvs.php.net/viewvc.cgi/php-src/sapi/cgi/cgi_main.c?r1=1.267.2.15.2.51&r2=1.267.2.15.2.52&diff_format=u Index: php-src/sapi/cgi/cgi_main.c diff -u php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.51 php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.52 --- php-src/sapi/cgi/cgi_main.c:1.267.2.15.2.51 Wed Oct 31 18:24:42 2007 +++ php-src/sapi/cgi/cgi_main.c Thu Nov 1 15:23:14 2007 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cgi_main.c,v 1.267.2.15.2.51 2007/10/31 18:24:42 dmitry Exp $ */ +/* $Id: cgi_main.c,v 1.267.2.15.2.52 2007/11/01 15:23:14 dmitry Exp $ */ #include "php.h" #include "php_globals.h" @@ -311,6 +311,52 @@ #define SAPI_CGI_MAX_HEADER_LENGTH 1024 +typedef struct _http_error { + int code; + const char* msg; +} http_error; + +static const http_error http_error_codes[] = { + {100, "Continue"}, + {101, "Switching Protocols"}, + {200, "OK"}, + {201, "Created"}, + {202, "Accepted"}, + {203, "Non-Authoritative Information"}, + {204, "No Content"}, + {205, "Reset Content"}, + {206, "Partial Content"}, + {300, "Multiple Choices"}, + {301, "Moved Permanently"}, + {302, "Moved Temporarily"}, + {303, "See Other"}, + {304, "Not Modified"}, + {305, "Use Proxy"}, + {400, "Bad Request"}, + {401, "Unauthorized"}, + {402, "Payment Required"}, + {403, "Forbidden"}, + {404, "Not Found"}, + {405, "Method Not Allowed"}, + {406, "Not Acceptable"}, + {407, "Proxy Authentication Required"}, + {408, "Request Time-out"}, + {409, "Conflict"}, + {410, "Gone"}, + {411, "Length Required"}, + {412, "Precondition Failed"}, + {413, "Request Entity Too Large"}, + {414, "Request-URI Too Large"}, + {415, "Unsupported Media Type"}, + {500, "Internal Server Error"}, + {501, "Not Implemented"}, + {502, "Bad Gateway"}, + {503, "Service Unavailable"}, + {504, "Gateway Time-out"}, + {505, "HTTP Version not supported"}, + {0, NULL} +}; + static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) { char buf[SAPI_CGI_MAX_HEADER_LENGTH]; @@ -324,6 +370,7 @@ if (CGIG(nph) || SG(sapi_headers).http_response_code != 200) { int len; + zend_bool has_status = 0; if (CGIG(rfc2616_headers) && SG(sapi_headers).http_status_line) { len = slprintf(buf, SAPI_CGI_MAX_HEADER_LENGTH, @@ -342,11 +389,35 @@ strncasecmp(SG(sapi_headers).http_status_line, "HTTP/", 5) == 0) { len = slprintf(buf, sizeof(buf), "Status:%s\r\n", s); } else { - len = slprintf(buf, sizeof(buf), "Status: %d\r\n", SG(sapi_headers).http_response_code); + h = (sapi_header_struct*)zend_llist_get_first_ex(&sapi_headers->headers, &pos); + while (h) { + if (h->header_len > sizeof("Status:")-1 && + strncasecmp(h->header, "Status:", sizeof("Status:")-1) == 0) { + has_status = 1; + break; + } + h = (sapi_header_struct*)zend_llist_get_next_ex(&sapi_headers->headers, &pos); + } + if (!has_status) { + http_error *err = (http_error*)http_error_codes; + + while (err->code != 0) { + if (err->code == SG(sapi_headers).http_response_code) { + break; + } + err++; + } + if (err->msg) { + len = slprintf(buf, sizeof(buf), "Status: %d %s\r\n", SG(sapi_headers).http_response_code, err->msg); + } else { + len = slprintf(buf, sizeof(buf), "Status: %d\r\n", SG(sapi_headers).http_response_code); + } + } } } - - PHPWRITE_H(buf, len); + if (!has_status) { + PHPWRITE_H(buf, len); + } } h = (sapi_header_struct*)zend_llist_get_first_ex(&sapi_headers->headers, &pos); http://cvs.php.net/viewvc.cgi/php-src/sapi/cgi/tests/003.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-src/sapi/cgi/tests/003.phpt diff -u php-src/sapi/cgi/tests/003.phpt:1.1.2.2 php-src/sapi/cgi/tests/003.phpt:1.1.2.3 --- php-src/sapi/cgi/tests/003.phpt:1.1.2.2 Tue Apr 17 19:49:26 2007 +++ php-src/sapi/cgi/tests/003.phpt Thu Nov 1 15:23:14 2007 @@ -48,7 +48,7 @@ <?php class test { public $var = "test"; private $pri; function foo() { } } ?> " -string(%d) "Status: 404 +string(%d) "Status: 404 Not Found X-Powered-By: PHP/%s Content-type: text/html http://cvs.php.net/viewvc.cgi/php-src/sapi/cgi/tests/008.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u Index: php-src/sapi/cgi/tests/008.phpt diff -u php-src/sapi/cgi/tests/008.phpt:1.1.2.2 php-src/sapi/cgi/tests/008.phpt:1.1.2.3 --- php-src/sapi/cgi/tests/008.phpt:1.1.2.2 Tue Apr 17 19:49:26 2007 +++ php-src/sapi/cgi/tests/008.phpt Thu Nov 1 15:23:14 2007 @@ -45,7 +45,7 @@ <br /><span style="color: #0000BB"><?php<br />$test </span><span style="color: #007700">= </span><span style="color: #DD0000">"var"</span><span style="color: #007700">; </span><span style="color: #FF8000">//var<br />/* test class */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">test </span><span style="color: #007700">{<br /> private </span><span style="color: #0000BB">$var </span><span style="color: #007700">= array();<br /><br /> public static function </span><span style="color: #0000BB">foo</span><span style="color: #007700">(</span><span style="color: #0000BB">Test $arg</span><span style="color: #007700">) {<br /> echo </span><span style="color: #DD0000">"hello"</span><span style="color: #007700">;<br /> </spa! n><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">);<br /> }<br />}<br /><br /></span><span style="color: #0000BB">$o </span><span style="color: #007700">= new </span><span style="color: #0000BB">test</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?><br /></span> </span> </code>" -string(%d) "Status: 404 +string(%d) "Status: 404 Not Found X-Powered-By: PHP/%s Content-type: text/html
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php