annotate Lib/IMPL/Web/Application/Response.pm @ 60:b0c068da93ac

Lazy activation for the configuration objects (final concept) small fixes
author wizard
date Tue, 09 Mar 2010 19:47:39 +0300
parents 0f3e369553bd
children 76b878ad6596
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59
0f3e369553bd Rewritten property implementation (probably become slower but more flexible)
wizard
parents: 58
diff changeset
1 package IMPL::Web::Application::Response;
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
2 use strict;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
3
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
4 use base qw(IMPL::Object IMPL::Object::Autofill);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
5
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
6 require IMPL::Exception;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
7 require CGI;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
8 require CGI::Cookie;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
9
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
10 use Carp;
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
11 use IMPL::Class::Property;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
12
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
13 BEGIN {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
14 public property query => prop_get | owner_set; # cgi query
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
15 public property status => prop_all, { validator => \&_checkHeaderPrinted };
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
16 public property contentType => prop_all, { validator => \&_checkHeaderPrinted }; # String
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
17 public property charset => { get => \&_charset, set => \&_charset }, { validator => \&_checkHeaderPrinted };
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
18 public property expires => prop_all, { validator => \&_checkHeaderPrinted };
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
19 public property cookies => prop_all, { validator => \&_checkHeaderPrinted }; # Hash
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
20
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
21 public property buffered => prop_all, { validator => \&_canChangeBuffer }; # Boolean
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
22 public property streamOut => prop_get | owner_set; # stream
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
23 public property streamBody => {get => \&getStreamBody }; # stream
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
24 public property isHeaderPrinted => prop_get | owner_set; # Boolean
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
25
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
26 private property _bufferBody => prop_all;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
27 private property _streamBody => prop_all;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
28 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
29
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
30 __PACKAGE__->PassThroughArgs;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
31
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
32 sub CTOR {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
33 my ($this,%args) = @_;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
34
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
35 $this->query(CGI->new($this->query() | {})) unless $this->query;
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
36 $this->charset($this->query->charset) unless $this->charset;
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
37
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
38 $this->streamOut(*STDOUT) unless $this->streamOut;
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
39 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
40
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
41 sub _checkHeaderPrinted {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
42 my ($this,$value) = @_;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
43
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
44 die new IMPL::InvalidOperationException() if $this->isHeaderPrinted;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
45 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
46
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
47 sub _canChangeBuffer {
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
48 my ($this,$value) = @_;
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
49
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
50 die new IMPL::InvalidOperationException() if $this->isHeaderPrinted or $this->_streamBody;
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
51 }
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
52
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
53 sub _charset {
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
54 my $this = shift;
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
55
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
56 return $this->query->charset(@_);
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
57 }
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
58
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
59 sub _PrintHeader {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
60 my ($this) = @_;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
61
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
62 unless ($this->isHeaderPrinted) {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
63 $this->isHeaderPrinted(1);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
64
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
65 my %opt;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
66
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
67 $opt{-type} = $this->contentType if $this->contentType;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
68 $opt{-status} = $this->status if $this->status;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
69 $opt{-expires} = $this->expires if $this->expires;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
70
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
71 my $refCookies = $this->cookies;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
72 $opt{-cookie} = [map CGI::Cookie->new(-name => $_, $refCookies->{$_} ), keys %$refCookies] if $refCookies;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
73
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
74 my $hOut = $this->streamOut;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
75
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
76 print $hOut $this->query->header(
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
77 %opt
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
78 );
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
79 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
80 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
81
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
82 sub getStreamBody {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
83 my ($this) = @_;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
84
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
85 return undef unless $this->streamOut;
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
86
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
87 unless ($this->_streamBody) {
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
88 if ($this->buffered) {
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
89 my $buffer = "";
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
90 $this->_bufferBody(\$buffer);
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
91
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
92 open my $hBody, ">", \$buffer or die new IMPL::Exception("Failed to create buffer",$!);
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
93
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
94 $this->_streamBody($hBody);
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
95 } else {
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
96 $this->_PrintHeader();
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
97 $this->_streamBody($this->streamOut);
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
98 }
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
99 }
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
100
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
101 return $this->_streamBody;
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
102 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
103
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
104 sub Complete {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
105 my ($this) = @_;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
106
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
107 return 0 unless $this->streamOut;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
108
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
109 my $hOut = $this->streamOut;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
110
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
111 $this->_PrintHeader();
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
112
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
113 if ($this->buffered) {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
114 print $hOut ${$this->_bufferBody};
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
115 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
116
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
117 $this->_streamBody(undef);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
118 $this->_bufferBody(undef);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
119 $this->streamOut(undef);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
120
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
121 return 1;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
122 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
123
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
124 sub Discard {
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
125 my ($this) = @_;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
126
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
127 carp "Discarding sent response" if $this->isHeaderPrinted;
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
128
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
129 $this->_streamBody(undef);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
130 $this->_bufferBody(undef);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
131 $this->streamOut(undef);
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
132 }
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
133
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
134 1;
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
135
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
136 __END__
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
137
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
138 =pod
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
139
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
140 =head1 DESCRIPTION
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
141
58
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
142 Ответ сервера на CGI запрос, позволяет сформировать основные свойства заголовка и тело запроса.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
143
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
144 Объект позволяет буфферизировать вывод в тело ответа, что позволяет отменить или изменить
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
145 ответ в последний момент.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
146
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
147 Свойство C< isHeaderPrinted > можно использовать для определения были ли отправлены какие-нибудь
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
148 данные клиенту.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
149
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
150 =head1 PROPERTIES
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
151
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
152 =head2 HTTP Header
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
153
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
154 Свойства отвечающие за заголовок HTTP ответа. Эти своства могут быть изменены до тех пор пока
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
155 не будет отправлен заголовок. В противном случае выдается исключение C< IMPL::InvalidOperationException >.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
156
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
157 =over
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
158
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
159 =item C< query >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
160
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
161 CGI запрос, который используется для вывода данных, заголовка и пр. Существует всегда.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
162
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
163 =item C< status >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
164
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
165 Код ошибки HTTP. Например, '200 OK'. По умолчанию не установлен, при отправке клиенту бедт отправлен '200 ОК'.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
166
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
167 =item C< contentType >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
168
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
169 Тип MIME. По умолчанию не установлен, подразумивается 'text/html'.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
170
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
171 =item C< charset >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
172
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
173 Кодировка, синоним свойства query->charset.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
174
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
175 =item C< expires >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
176
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
177 Определяет время жизни контента, например '+10m'. По умолчанию не задано и не передается.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
178
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
179 =item C< cookies >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
180
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
181 Хеш массив с cookies, например C< { cart => ['foo','bar'], display => 'list' } >.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
182
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
183 =back
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
184
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
185 =head2 Response behaviour
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
186
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
187 Свойства отвечающие за поведение ответа.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
188
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
189 =over
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
190
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
191 =item C< buffered >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
192
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
193 C< True > - то тело ответа пишется в буффер и будет отправлено при вызове метода C< Complete >,
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
194 заголовок также будет отправлен после вызова метода C< Complete >.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
195
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
196 C< False > - тело ответа пишется непосредственно в поток к клиенту, при этом заголовок
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
197 будет отправлен при первом обращении к свойству C< streamBody >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
198
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
199 Это свойство можно менять до первого обращения к потоку для записи в тело ответа.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
200
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
201 =item C< streamOut >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
202
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
203 Стандартный вывод CGI приложения.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
204
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
205 =item C< streamBody >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
206
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
207 Поток для записи в тело ответа.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
208
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
209 =item C< isHeadPrinted >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
210
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
211 Признак того, что заголовок уже был отправлен клиенту.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
212
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
213 =back
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
214
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
215 =head1 METHODS
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
216
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
217 =over
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
218
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
219 =item C< Complete >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
220
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
221 Завершает отправку ответа.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
222
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
223 =item C< Discard >
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
224
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
225 Отменяет отправку ответа, при этом если часть данных (например, заголовок)
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
226 уже была отправлена, выдает предупреждение в STDERR.
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
227
a35b60b16a99 Configuration, late activation
wizard
parents: 57
diff changeset
228 =back
57
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
229
bf59ee1cd506 Web application main class functionality
wizard
parents:
diff changeset
230 =cut