diff options
author | Dmitry Stogov <dmitry@php.net> | 2007-11-01 15:23:14 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2007-11-01 15:23:14 +0000 |
commit | e468aa44a270ef281d0e9f5b0971ee76d56bd53c (patch) | |
tree | 103680d60f49c958b706e590c52770802488645d /sapi | |
parent | fc6d3652f912e5f3f5aef1650d9230e6d018c052 (diff) | |
download | php-git-e468aa44a270ef281d0e9f5b0971ee76d56bd53c.tar.gz |
Fixed bug #42848 (Status: header incorrect under FastCGI)
Diffstat (limited to 'sapi')
-rw-r--r-- | sapi/cgi/cgi_main.c | 77 | ||||
-rw-r--r-- | sapi/cgi/tests/003.phpt | 2 | ||||
-rw-r--r-- | sapi/cgi/tests/008.phpt | 2 |
3 files changed, 76 insertions, 5 deletions
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c index 69461c9018..cba37fe19a 100644 --- a/sapi/cgi/cgi_main.c +++ b/sapi/cgi/cgi_main.c @@ -311,6 +311,52 @@ static void sapi_cgibin_flush(void *server_context) #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 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) 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 @@ static int sapi_cgi_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC) 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); diff --git a/sapi/cgi/tests/003.phpt b/sapi/cgi/tests/003.phpt index 0da3ca8602..ea418d104c 100644 --- a/sapi/cgi/tests/003.phpt +++ b/sapi/cgi/tests/003.phpt @@ -48,7 +48,7 @@ Content-type: text/html <?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 diff --git a/sapi/cgi/tests/008.phpt b/sapi/cgi/tests/008.phpt index d541ca430d..40140e8792 100644 --- a/sapi/cgi/tests/008.phpt +++ b/sapi/cgi/tests/008.phpt @@ -45,7 +45,7 @@ Content-type: text/html <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 /> </span><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 |