CGI-WebOut
view release on metacpan or search on metacpan
121122123124125126127128129130131132133134135136137138139
@Headers
= ();
$$rRootBuf
=
''
;
}
# Åñëè íè÷åãî íå èçìåíèëîñü, âûõîäèì
return
if
tied
(
*STDOUT
) &&
ref
tied
(
*STDOUT
) eq __PACKAGE__.
"::Tie"
;
tie
(
*STDOUT
, __PACKAGE__.
"::Tie"
, \
*STDOUT
,
tied
(
*STDOUT
));
}
# Ïðîâåðÿåò, èñïîëüçóåòñÿ ëè áèáëèîòåêà Web-ñêðèïòîì èëè îáû÷íûì
sub
IsWebMode() {
return
$ENV
{SCRIPT_NAME}? 1 : 0
}
# Ïîñëàíû ëè çàãîëîâêè?
sub
HeadersSent {
return
$HeadersSent
;
}
160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204# Ïåðåõâàò âûõîäíîãî ïîòîêà. Èñïîëüçîâàíèå:
# $grabbed = grab {
# print 'Hello!'
# } catch {
# die "An error occurred while grabbing the output: $@";
# };
# èëè òî æå, íî áåç catch:
# $grabbed = grab { print 'Hello!' };
sub
grab(&@)
{
my
(
$func
,
$catch
)=
@_
;
my
$Buf
= CGI::WebOut->new;
$@ =
undef
;
eval
{
&$func
() };
if
($@ &&
$catch
) {
chomp
($@);
local
$_
= $@;
&$catch
; }
return
$Buf
->buf;
}
# static Header($header)
# Óñòàíàâëèâàåò çàãîëîâîê îòâåòà.
sub
Header($)
{
my
(
$head
)=
@_
;
if
(
$HeadersSent
) {
and Carp::carp(
"Oops... Header('$head') called after content had been sent to browser!\n"
);
return
undef
;
}
push
(
@Headers
,
$head
);
return
1;
}
# Ñáðàñûâàåò ñîäåðæèìîå ãëàâíîãî áóôåðà â áðàóçåð.
sub
Flush() {
# Îòêëþ÷àåì âíóòðåííþþ áóôåðèçàöèþ Perl-à
local
$| = 1;
# Åñëè çàãîëîâêè åùå íå îòîñëàíû, îòîñëàòü èõ
if
(!
$HeadersSent
&& IsWebMode()) {
my
$ContType
=
"text/html"
;
unshift
(
@Headers
,
"X-Powered-By: CGI::WebOut v$VERSION (http://www.dklab.ru/chicken/4.html), (C) by Dmitry Koterov"
);
# Èùåì Content-type, ÷òîáû ïîòîì îòïðàâèòü åãî â êîíöå
for
(
my
$i
=0;
$i
<
@Headers
;
$i
++) {
if
(
$Headers
[
$i
]=~/^content-type: *(.*)$/i) {
$ContType
= $1;
splice
(
@Headers
,
$i
, 1);
$i
--;
545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
local
@Warns
=
@Errors
>
@SvErrors
?
@Errors
[
@SvErrors
..
$#Errors
] : ();
# Âîññòàíàâëèâàåì ñîîáùåíèÿ îá îøèáêàõ
@Errors
=
@SvErrors
;
# Çàïóñêàåì îáðàáîò÷èêè â ïîðÿäêå èõ ïîÿâëåíèÿ
map
{
&$_
() }
@Hand
;
# Âîçâðàùàåì çíà÷åíèå, êîòîðîå âåðíóë try-áëîê
return
wantarray
?
@Result
:
$Result
[0];
}
# Âîçâðàùàåò ôóíêöèþ-çàìûêàíèå, êîòîðàÿ âûçûâàåò òåëî catch-áëîêà.
sub
catch
(&;@)
{
my
(
$body
,
@Hand
)=
@_
;
return
(
sub
{
if
($@) {
chomp
($@);
local
$_
=$@;
&$body
(
$_
) } },
@Hand
);
}
# Âîçâðàùàåò ôóíêöèþ-çàìûêàíèå, êîòîðàÿ âûçûâàåò òåëî warnings-áëîêà.
sub
warnings(&;@)
{
my
(
$body
,
@Hand
)=
@_
;
return
(
sub
{
&$body
(
@Warns
) },
@Hand
);
}
# Âûáðàñûâàåò èñêëþ÷åíèå.
sub
throw($) {
die
(
ref
(
$_
[0])?
$_
[0] :
"$_[0]\n"
)
}
# bool SetAutoflush([bool $mode])
# Óñòàíàâëèâàåò ðåæèì ñáðîñà áóôåðà echo: åñëè $mode=1, òî ðàçðåøàåò åãî àâòîñáðîñ ïîñëå
# êàæäîãî âûâîäà print èëè echo, èíà÷å - çàïðåùàåò (ñáðîñ äîëæåí ïðîèçâîäèòüñÿ ïî Flush()).
# Âîçâðàùàåò ïðåäûäóùèé óñòàíîâëåííûé ðåæèì àâòîñáðîñà.
sub
SetAutoflush(;$)
{
my
(
$mode
)=
@_
;
my
$old
=
$UseAutoflush
;
if
(
defined
$mode
) {
$UseAutoflush
=
$mode
; }
return
$old
;
}
# bool NoAutoflush()
# Çàïðåùàåò ñáðàñûâàòü áóôåð ïîñëå êàæäîãî echo.
# Âîçâðàùàåò ïðåäûäóùèé ñòàòóñ àâòîñáðîñà.
sub
NoAutoflush() {
return
SetAutoflush(0);
}
# bool UseAutoflush()
# Ðàçðàøàåò ñáðàñûâàòü áóôåð ïîñëå êàæäîãî echo.
# Âîçâðàùàåò ïðåäûäóùèé ñòàòóñ àâòîñáðîñà.
sub
UseAutoflush() {
return
SetAutoflush(1);
}
# Ïåðåíàïðàâëÿåò íà äðóãîé URL (ìîæåò áûòü âíóòðåííèì ðåäèðåêòîì)
sub
Redirect($)
{
my
(
$url
) =
@_
;
$Redirected
= Header(
"Location: $url"
);
exit
;
}
# Ïåðåíàïðàâëÿåò ÁÐÀÓÇÅÐ íà äðóãîé URL
sub
ExternRedirect($)
{
my
(
$url
) =
@_
;
if
(
$url
!~ /^\w+:/) {
# Îòíîñèòåëüíûé àäðåñ.
if
(
$url
!~ m{^/}) {
my
$sn
=
$ENV
{SCRIPT_NAME};
$sn
=~ s{/+[^/]*$}{}sg;
$url
=
"$sn/$url"
;
}
# Äîáàâèòü èìÿ õîñòà.
$url
=
"http://$ENV{SERVER_NAME}$url"
;
}
$Redirected
= Header(
"Location: $url"
);
exit
;
}
# Çàïðåùàåò êýøèðîâàíèå äîêóìåíòà áðàóçåðîì
sub
NoCache()
{
return
1
if
$NoCached
++;
Header(
"Expires: Mon, 26 Jul 1997 05:00:00 GMT"
) or
return
undef
;
Header(
"Last-Modified: "
.
gmtime
(
time
).
" GMT"
) or
return
undef
;
Header(
"Cache-Control: no-cache, must-revalidate"
) or
return
undef
;
Header(
"Pragma: no-cache"
) or
return
undef
;
return
1;
}
# int ErrorReporting([int $level])
# Óñòàíàâëèâàåò ðåæèì âûâîäà îøèáîê:
# 0 - îøèáêè íå âûâîäÿòñÿ
# 1 - îøèáêè âûâîäÿòñÿ â áðàóçåð
# 2 - îøèáêè âûâîäÿòñÿ â áðàóçåð â âèäå êîììåíòàðèåâ
# Åñëè ïàðàìåòð íå çàäàí, ðåæèì íå ìåíÿåòñÿ.
# Âîçâðàùàåò ïðåäûäóùèé ñòàòóñ âûâîäà.
sub
ErrorReporting(;$)
{
my
(
$lev
)=
@_
;
my
$old
=
$ErrorReporting
;
$ErrorReporting
=
$lev
if
defined
$lev
;
return
$old
;
}
# Äîáàâëÿåò ñîîáùåíèå îá îøèáêå ê ìàññèâó îøèáîê.
sub
Warning($)
{
my
(
$msg
)=
@_
;
push
(
@Errors
,
$msg
);
}
# Ïå÷àòàåò âñå íàêîïèâøèåñÿ ñîîáùåíèÿ îá îøèáêàõ.
# Ýòà ôóíêöèÿ âûçûâàåòñÿ â ìîìåíò, êîãäà STDOUT íàõîäèòñÿ â "ïîäâåøåííîì" ñîñòîÿíèè,
# ïîýòîìó èñïîëüçîâàíèå print ÇÀÏÐÅÙÅÍÎ!!!
sub
__PrintAllErrors()
{
local
$^W =
undef
;
# http://forum.dklab.ru/perl/symbiosis/Fastcgi+WeboutUtechkaPamyati.html
if
(!
@Errors
|| !
$ErrorReporting
){
@Errors
=();
return
;
}
if
(IsWebMode) {
if
(
$ErrorReporting
== ER_Err2Browser) {
# ìàëî ëè, êàêèå òàì áûëè òàáëèöû...
echo
"</script>"
,
"</xmp>"
,
"</pre>"
,
"</table>"
x6,
"</tt>"
x2,
"</i>"
x2,
"</b>"
x2,
"</div>"
x10,
"\n"
;
( run in 1.176 second using v1.01-cache-2.11-cpan-94b05bcf43c )