#19098 [Opn->Csd]: header("Content-type: text/plain") does not work
| From: | sniper@php.net | Date: | Sun, 08 Sep 2002 02:50:54 +0000 |
| Subject: | #19098 [Opn->Csd]: header("Content-type: text/plain") does not work | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-18654@lists.php.net to get a copy of this message | ||
ID: 19098
Updated by: sniper@php.net
Reported By: michael.mauch@gmx.de
-Status: Open
+Status: Closed
Bug Type: HTTP related
Operating System: Linux
PHP Version: 4.2.3RC2
New Comment:
This bug has been fixed in CVS.
In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.
In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2002-09-07 19:09:34] skamp@skamp.org
Same problem with PHP 4.2.3 (build as a module for apache 1.3.26).
header("Content-type: text/html") does not work either, if a default
charset is set in the php.ini.
This conf make header() NOT work :
default_mimetype = "text/plain"
default_charset = "iso-8859-1"
This one makes it work :
default_mimetype = "text/plain"
;default_charset = "iso-8859-1"
Damn, before you guys make a release, please check that everything
works (I'm sorry I'm in a very bad mood).
------------------------------------------------------------------------
[2002-09-04 14:41:10] michael.mauch@gmx.de
Please note that the patch above does not work very well. I posted a
better patch to the php-dev newsgroup/mailing list (subject:
header("Content-type: text/...") with default_charset) because nobody
seemed to notice this bug here.
------------------------------------------------------------------------
[2002-09-03 15:45:23] michael.mauch@gmx.de
Hmm, nobody answers, so maybe my bug description was not clear enough?
Ok, so I now took php-4.2.3RC2, copied the php.ini-dist to php.ini and
only enabled the default-charset:
# diff -u php.ini-dist php.ini
--- php.ini-dist Sat Aug 24 02:57:06 2002
+++ php.ini Tue Sep 3 20:20:47 2002
@@ -341,7 +341,7 @@
;
; PHP's built-in default is text/html
default_mimetype = "text/html"
-;default_charset = "iso-8859-1"
+default_charset = "iso-8859-1"
; Always populate the $HTTP_RAW_POST_DATA variable.
;always_populate_raw_post_data = On
--------------------------------------------------------------------------
My test file ~/php/header_xml.php:
<?php
header("Content-type: text/plain");
header("Content-type:text/plain");
header("Content-type:text/plain ");
header("Content-type:text/longertextsubtype");
header("Content-type: text/plain;charset=iso-8859-1");
header("Content-type: text/plain; charset=UTF-8");
echo "<hello></hello>\n";
?>
--------------------------------------------------------------------------
I configured php without any configure options. I built the CGI
version,
because the CLI version doesn't send any headers:
# ./php -c . ~/php/header_xml.php
X-Powered-By: PHP/4.2.3RC2
Content-type text/plain;charset=er_xml.php
Content-type text/plain;charset=
Content-type text/plain;charset=
Content-type text/longertextsubtype;charset=
Content-type: text/plain; charset=UTF-8
<hello></hello>
--------------------------------------------------------------------------
There are lots of NUL characters in the output. You can see these if
you pipe it into "less" or into "od":
# ./php -c . ~/php/header_xml.php | od -taz
0000000 X - P o w e r e d - B y : sp P H
>X-Powered-By: PH<
0000020 P / 4 . 2 . 3 R C 2 cr nl C o n t
>P/4.2.3RC2..Cont<
0000040 e n t - t y p e nul sp t e x t / p
>ent-type. text/p<
0000060 l a i n ; c h a r s e t = nul e r
>lain;charset=.er<
0000100 _ x m l . p h p cr nl C o n t e n
>_xml.php..Conten<
0000120 t - t y p e nul sp t e x t / p l a
>t-type. text/pla<
0000140 i n ; c h a r s e t = nul nul nul nul nul
>in;charset=.....<
0000160 nul nul nul nul nul cr nl C o n t e n t - t
>.......Content-t<
0000200 y p e nul sp t e x t / p l a i n ;
>ype. text/plain;<
0000220 c h a r s e t = nul nul nul nul nul nul nul nul
>charset=........<
0000240 nul nul cr nl C o n t e n t - t y p e
>....Content-type<
0000260 nul sp t e x t / l o n g e r t e x
>. text/longertex<
0000300 t s u b t y p e ; c h a r s e t
>tsubtype;charset<
0000320 = nul nul nul nul nul nul nul nul nul nul cr nl C o n
>=............Con<
0000340 t e n t - t y p e : sp t e x t /
>tent-type: text/<
0000360 p l a i n ; sp c h a r s e t = U
>plain; charset=U<
0000400 T F - 8 cr nl cr nl < h e l l o > <
>TF-8....<hello><<
0000420 / h e l l o > nl
>/hello>.<
0000430
Please also note that Content-type is sent multiple times here,
although
the docs say that this does not happen if I don't pass FALSE as a
second
parameter to the header() function.
--------------------------------------------------------------------------
So I fiddled with the source; here's the diff:
--- php-4.2.3RC2/main/SAPI.c.orig Sat Jul 27 15:15:42 2002
+++ php-4.2.3RC2/main/SAPI.c Tue Sep 3 22:04:01 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;
}
@@ -454,14 +455,14 @@
}
if (newlen != 0) {
- newlen += sizeof("Content-type: ");
+ newlen += sizeof("Content-type: ") - 1;
newheader = emalloc(newlen);
PHP_STRLCPY(newheader, "Content-type: ", newlen,
sizeof("Content-type: ")-1);
strlcat(newheader, mimetype, newlen);
sapi_header.header = newheader;
sapi_header.header_len = newlen - 1;
colon_offset = strchr(newheader, ':');
- *colon_offset = '\0';
+ /* *colon_offset = '\0'; */
efree(header_line);
}
--------------------------------------------------------------------------
New test file with notes about the output of
"./php -c . ~/php/header_xml.php", after my patch to SAPI.c has been
applied:
<?php
// header("Content-type: text/plain"); // ok
// 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"); // ok
// header("Content-type: text/plain; charset=UTF-8"); // ok
echo "<hello></hello>\n";
?>
So this is still not optimal, but it looks a lot better than before:
only when there's no space after the colon, the content-type is one
character too short. And hopefully most people will use a space after
the colon.
------------------------------------------------------------------------
[2002-08-28 16:52:03] michael.mauch@gmx.de
Ok, so you wanted me to get my hands dirty? I had a look at the code
and suggest that it certainly would be a good idea to append the
default charset in sapi_apply_default_charset():
--- php4-STABLE-200208281200/main/SAPI.c~ Sat Jul 27 15:17:37 2002
+++ php4-STABLE-200208281200/main/SAPI.c Wed Aug 28 22:27:20 2002
@@ -261,6 +261,7 @@
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);
}
But that is only a part of the problem. In sapi_add_header_ex(), I see
the lines:
colon_offset = strchr(newheader, ':');
*colon_offset = '\0';
These lines insert a NUL at the colon's position, but I can't see
what's their purpose.
I changed the bug's category from Apache related to HTTP related
because it's certainly not Apache's fault, as it happens in the
standalone php-cgi as well.
------------------------------------------------------------------------
[2002-08-27 14:14:38] michael.mauch@gmx.de
I just found out that the php-cgi adds an empty charset, if I don't set
it:
# echo '<? header("Content-type: text/xml");?>' | php-cgi
Status: 200
X-Powered-By: PHP/4.3.0-dev
Content-type text/xml;charset=
If I set the charset (even an empty one), mod_php _does_ send the
Content-type header.
<http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1>:
| When no explicit charset parameter is provided by the
| sender, media subtypes of the "text" type are defined to
| have a default charset value of "ISO-8859-1" when
| received via HTTP.
So I think I should be allowed to set no charset.
Oh: if I disable the default_charset = "iso-8859-1" in php.ini, it
works just like it should, i.e. I can omit the charset and the
text/plain or text/xml header is sent.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/19098
--
Edit this bug report at http://bugs.php.net/?id=19098&edit=1