Hi, header("Content-type: text/plain") or header("Content-type: text/xml") does not work as soon as a default_charset is enabled in php.ini.
I reported that in <http://bugs.php.net/bug.php?id=19098> a week ago, but nobody answered yet. This bug is still there in php-4.2.3RC2. If you use the mod_php version with Apache, you will get "Content-type: text/html" if you use header("Content-type: text/plain") or header("Content-type: text/xml"). Here's a small test script (header_test.php) to show the problem. It calls the CGI version of php (in the current directory) and tries a few Content-type headers: <? $PHP = "./php -c ."; $Headers = array("Content-type: text/plain", "Content-type: text/xml", "Content-type: application/xml", "Content-type:text/plain", "Content-type:text/plain ", "Content-type:text/longertextsubtype", "Content-type: text/plain;charset=iso-8859-1", "Content-type: text/plain; charset=UTF-8"); foreach($Headers as $Header) { $Cmd = "echo \"<?php header('$Header') ?>\" | $PHP "; unset($Output); exec($Cmd, $Output); print "Header: \"$Header\"\nOutput: \"$Output[1]\"\n\n"; } ?> ------------------------------------------------------------------------ The output of that script: # ./php -c . -q header_test.php Header: "Content-type: text/plain" Output: "Content-type" Header: "Content-type: text/xml" Output: "Content-type" Header: "Content-type: application/xml" Output: "Content-type: application/xml" Header: "Content-type:text/plain" Output: "Content-type" Header: "Content-type:text/plain " Output: "Content-type" Header: "Content-type:text/longertextsubtype" Output: "Content-type" Header: "Content-type: text/plain;charset=iso-8859-1" Output: "Content-type: text/plain;charset=iso-8859-1" Header: "Content-type: text/plain; charset=UTF-8" Output: "Content-type: text/plain; charset=UTF-8" So if you don't explicitly set the charset, like in the last two tests, the output is wrong. ------------------------------------------------------------------------ A small patch that makes this right in most cases: # diff -u php-4.2.3RC2/main/SAPI.c.orig php-4.2.3RC2/main/SAPI.c --- php-4.2.3RC2/main/SAPI.c.orig Sat Jul 27 15:15:42 2002 +++ php-4.2.3RC2/main/SAPI.c Wed Sep 4 19:07:50 2002 @@ -261,11 +261,12 @@ newtype = emalloc(newlen + 1); PHP_STRLCPY(newtype, *mimetype, newlen + 1, len); strlcat(newtype, ";charset=", newlen + 1); + strlcat(newtype, charset, newlen + 1); if (*mimetype != NULL) { efree(*mimetype); } *mimetype = newtype; - return newlen; + return newlen - 1; } return 0; } @@ -461,7 +462,7 @@ sapi_header.header = newheader; sapi_header.header_len = newlen - 1; colon_offset = strchr(newheader, ':'); - *colon_offset = '\0'; + /* *colon_offset = '\0'; */ efree(header_line); } ------------------------------------------------------------------------ The test script output after this patch has been applied: # ./php -c . -q header_test.php Header: "Content-type: text/plain" Output: "Content-type: text/plain;charset=iso-8859-1" Header: "Content-type: text/xml" Output: "Content-type: text/xml;charset=iso-8859-1" Header: "Content-type: application/xml" Output: "Content-type: application/xml" Header: "Content-type:text/plain" Output: "Content-type: text/plain;charset=iso-8859-" Header: "Content-type:text/plain " Output: "Content-type: text/plain;charset=iso-8859-" Header: "Content-type:text/longertextsubtype" Output: "Content-type: text/longertextsubtype;charset=iso-8859-" Header: "Content-type: text/plain;charset=iso-8859-1" Output: "Content-type: text/plain;charset=iso-8859-1" Header: "Content-type: text/plain; charset=UTF-8" Output: "Content-type: text/plain; charset=UTF-8" Only the cases without a space after the colon are still garbled. RFC 2616, section 4.2, says: "The field value MAY be preceded by any amount of LWS, though a single SP is preferred." So people should be able to use header("Content-type:text/plain") as well, but I can't find the remaining bug. Any comments, please? Regards... Michael -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php