mod_perl2 a $| = 1

Vladimír Solnický vs-ml na email.cz
Pondělí Únor 13 23:28:23 MET 2006


8. 2. 2006 napsal(a) Jan Kasprzak na téma ,Re: mod_perl2 a $| = 1`:

> Jan Kasprzak wrote:
> : $|=1;
> : print "Content-Type: application/x-text\n";
> : print "Content-Length: ", length($data), "\n\n";
> : print $data;
> : ModPerl::Util::exit();
>
> 	Jeste dalsim experimentovanim jsem zjistil, ze pokud
> dam $|=1 az za vypis hlavicek, tak je vse OK. Coz asi pro me bude
> nejmene bolestne reseni. Ale stejne bych rad vedel co se deje.

Možná jsme jen drzý, že ses píši, protože neumím perl. Ale přečetl jsem si 
man perlvar a podle něj přiřazení do proměnné způsobí okamžité vyprázdnění 
vyrovnávací paměti (tedy se pravděpodobně pošle klientovi něco jako 
"200 ..." -- úvodní řádka na HTTP odpověď) a další řádky se zasílají ihned 
do tisku. Zkusil bych tedy zjistit, co se přesně vytiskne "před" Vašimi 
hlavičkami -- třeba spojením via telnet nebo nc na daný port a zadáním 
požadavku na danou stránku, nebo použitím libehttpheaders.mozdev.org spolu 
se SeaMonkey nebo Firefoxem se zapnutím sledování komunikace HTTP. Podle 
mne by tam mohl být klíč k tomu, co způsobuje problém (skoro to vypadá na 
nadbytečné \n nebo \r\n, které by server mohl zasílat, pokud by ve 
vyrovnávací paměti nenašel hlavičky). To soudím podle chování mod_php, 
které umožňovalo, když jsem s ním naposledy dělal, nastavit hlavičky jen 
do prvního vyprázdnění vyrovnávací paměti. Ale je to jen tip.


Ještě bych si dovolil dvě připomínky k vlastnímu HTTP:

1) HTTP má podle normy ukončovat řádky CR+LF, tedy \r\n, ne jen \n. To, že 
Vám to funguje, je s podivem.

2) Myslím, že uložení souboru se dá korektně dosáhnout následujícími 
hlavičkami:

Content-Type: text/plain
Content-Disposition: attachment

(případně uvést parametr charset pro C-T a filename pro C-D; detaily 
v RFC 2045-9):

Content-Type: text/plain; charset=ISO-8859-2
Content-Disposition: attachment; filename=mojedata.txt

Top, co požíváte, je těžký háček, protože nutíte prohlížeč k uložení ne 
proto, že to chcete, ale proto, že tvoříte něco, co by prohlížeč neměl 
znát (což také nemusí být pravda, pokud si někdo nastaví tento typ do 
pomocných aplikací).

Zdravím,

VS
-- 
Vladimír Solnický


Další informace o konferenci Perl