annotate Lib/IMPL/Web/HttpResponse.pm @ 245:7c517134c42f

Added Unsupported media type Web exception corrected resourceLocation setting in the resource Implemented localizable resources for text messages fixed TT view scopings, INIT block in controls now sets globals correctly.
author sergey
date Mon, 29 Oct 2012 03:15:22 +0400
parents 23daf2fae33a
children 32aceba4ee6d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
213
sergey
parents:
diff changeset
1 use strict;
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
2 package IMPL::Web::HttpResponse;
213
sergey
parents:
diff changeset
3
sergey
parents:
diff changeset
4 use CGI();
245
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
5 use IMPL::lang qw(:declare :hash);
213
sergey
parents:
diff changeset
6 use IMPL::declare {
sergey
parents:
diff changeset
7 require => {
sergey
parents:
diff changeset
8 Exception => 'IMPL::Exception',
sergey
parents:
diff changeset
9 ArgumentException => '-IMPL::InvalidArgumentException'
sergey
parents:
diff changeset
10 },
sergey
parents:
diff changeset
11 base => [
sergey
parents:
diff changeset
12 'IMPL::Object' => undef,
sergey
parents:
diff changeset
13 'IMPL::Object::Autofill' => '@_'
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
14 ],
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
15 props => [
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
16 status => PROP_ALL,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
17 type => PROP_ALL,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
18 charset => PROP_ALL,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
19 cookies => PROP_ALL,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
20 headers => PROP_ALL,
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
21 body => PROP_ALL
213
sergey
parents:
diff changeset
22 ]
sergey
parents:
diff changeset
23 };
sergey
parents:
diff changeset
24
sergey
parents:
diff changeset
25 sub CTOR {
sergey
parents:
diff changeset
26 my ($this) = @_;
sergey
parents:
diff changeset
27
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
28 $this->headers({}) unless $this->headers();
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
29 $this->cookies({}) unless $this->cookies();
213
sergey
parents:
diff changeset
30 }
sergey
parents:
diff changeset
31
sergey
parents:
diff changeset
32 sub PrintResponse {
sergey
parents:
diff changeset
33 my ($this,$out) = @_;
sergey
parents:
diff changeset
34
sergey
parents:
diff changeset
35 my $q = CGI->new({});
sergey
parents:
diff changeset
36
sergey
parents:
diff changeset
37 my %headers = %{$this->headers};
sergey
parents:
diff changeset
38
sergey
parents:
diff changeset
39 if(my $cookies = $this->cookies) {
sergey
parents:
diff changeset
40 $headers{-cookie} = [map _createCookie($_,$cookies->{$_}), keys %$cookies] if $cookies;
sergey
parents:
diff changeset
41 }
sergey
parents:
diff changeset
42
sergey
parents:
diff changeset
43 $headers{'-status'} = $this->status || '200 OK';
sergey
parents:
diff changeset
44 $headers{'-type'} = $this->type || 'text/html';
sergey
parents:
diff changeset
45
sergey
parents:
diff changeset
46 if(my $charset = $this->charset) {
sergey
parents:
diff changeset
47 $q->charset($charset);
sergey
parents:
diff changeset
48 binmode $out, ":encoding($charset)";
sergey
parents:
diff changeset
49 }
sergey
parents:
diff changeset
50
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
51 print $out $q->header(\%headers);
213
sergey
parents:
diff changeset
52
sergey
parents:
diff changeset
53 if(my $body = $this->body) {
sergey
parents:
diff changeset
54 if(ref $body eq 'CODE') {
sergey
parents:
diff changeset
55 $body->($out);
sergey
parents:
diff changeset
56 } else {
sergey
parents:
diff changeset
57 print $out $body;
sergey
parents:
diff changeset
58 }
sergey
parents:
diff changeset
59 }
sergey
parents:
diff changeset
60 }
sergey
parents:
diff changeset
61
sergey
parents:
diff changeset
62 #used to map a pair name valie to a valid cookie object
sergey
parents:
diff changeset
63 sub _createCookie {
239
23daf2fae33a *security subsytem bugfixes
sergey
parents: 230
diff changeset
64 return UNIVERSAL::isa($_[1], 'CGI::Cookie')
23daf2fae33a *security subsytem bugfixes
sergey
parents: 230
diff changeset
65 ? $_[1]
23daf2fae33a *security subsytem bugfixes
sergey
parents: 230
diff changeset
66 : ( defined $_[1]
23daf2fae33a *security subsytem bugfixes
sergey
parents: 230
diff changeset
67 ? CGI::Cookie->new(-name => $_[0], -value => $_[1] )
23daf2fae33a *security subsytem bugfixes
sergey
parents: 230
diff changeset
68 : CGI::Cookie->new(-name => $_[0], -expires => '-1d', -value => '')
23daf2fae33a *security subsytem bugfixes
sergey
parents: 230
diff changeset
69 );
213
sergey
parents:
diff changeset
70 }
sergey
parents:
diff changeset
71
230
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
72 sub InternalError {
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
73 my ($self,%args) = @_;
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
74
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
75 $args{status} ||= '500 Internal Server Error';
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
76
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
77 return $self->new(%args);
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
78 }
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
79
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
80 sub Redirect {
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
81 my ($self,%args) = @_;
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
82
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
83 return $self->new(
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
84 status => $args{status} || '303 See other',
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
85 headers => {
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
86 location => $args{location}
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
87 }
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
88 );
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
89 }
6d8092d8ce1b *reworked IMPL::Security
sergey
parents: 229
diff changeset
90
245
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
91 sub NoContent {
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
92 my ($self,%args) = @_;
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
93
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
94 return $self->new(
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
95 status => $args{status} || '204 No Content'
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
96 );
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
97 }
7c517134c42f Added Unsupported media type Web exception
sergey
parents: 239
diff changeset
98
213
sergey
parents:
diff changeset
99 1;
sergey
parents:
diff changeset
100
sergey
parents:
diff changeset
101 __END__
sergey
parents:
diff changeset
102
sergey
parents:
diff changeset
103 =pod
sergey
parents:
diff changeset
104
sergey
parents:
diff changeset
105 =head1 NAME
sergey
parents:
diff changeset
106
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
107 C<IMPL::Web::HttpResponse> - Результат обработки C<HTTP> запроса.
213
sergey
parents:
diff changeset
108
sergey
parents:
diff changeset
109 =head1 SYNOPSIS
sergey
parents:
diff changeset
110
sergey
parents:
diff changeset
111 =head1 DESCRIPTION
sergey
parents:
diff changeset
112
sergey
parents:
diff changeset
113 Базовый класс для ответов приложения на C<HTTP> запрос. Каждый вид ответа,
sergey
parents:
diff changeset
114 например
sergey
parents:
diff changeset
115
sergey
parents:
diff changeset
116 Данный объект используется для формирования и передачи данных C<HTTP> ответа
sergey
parents:
diff changeset
117 напрямую. Основными полями являются C<body> и C<status>.
sergey
parents:
diff changeset
118
sergey
parents:
diff changeset
119 Кроме свойств относящихся непосредственно к самому C<HTTP> ответу, данный объект
sergey
parents:
diff changeset
120 может содержать свойства относящиеся к процессу обработки запроса, например
sergey
parents:
diff changeset
121 механизму формирования представления.
sergey
parents:
diff changeset
122
sergey
parents:
diff changeset
123 =head1 MEMBERS
sergey
parents:
diff changeset
124
sergey
parents:
diff changeset
125 =head2 C<[get,set]status>
sergey
parents:
diff changeset
126
sergey
parents:
diff changeset
127 Статус который будет отправлен сервером клиенту, например, C<200 OK> или
sergey
parents:
diff changeset
128 C<204 No response>. Если не указан, то будет C<200 OK>.
sergey
parents:
diff changeset
129
sergey
parents:
diff changeset
130 =head2 C<[get,set]type>
sergey
parents:
diff changeset
131
sergey
parents:
diff changeset
132 Тип содержимого, которое будет передано клиенту, если не указано, будет
sergey
parents:
diff changeset
133 C<text/html>.
sergey
parents:
diff changeset
134
sergey
parents:
diff changeset
135 =head2 C<[get,set]charset>
sergey
parents:
diff changeset
136
sergey
parents:
diff changeset
137 Кодировка в которой будут переданны данные. Следует задавать если и только, если
sergey
parents:
diff changeset
138 передается текстовая информация. Если указана кодировка, то она будет
sergey
parents:
diff changeset
139 автоматически применена к потоку, который будет передан методу C<PrintResponse>.
sergey
parents:
diff changeset
140
sergey
parents:
diff changeset
141 =head2 C<[get,set]cookies>
sergey
parents:
diff changeset
142
sergey
parents:
diff changeset
143 Опционально. Ссылка на хеш с печеньками.
sergey
parents:
diff changeset
144
sergey
parents:
diff changeset
145 =head2 C<[get,set]headers>
sergey
parents:
diff changeset
146
sergey
parents:
diff changeset
147 Опционально. Ссылка на хеш с дополнительными полями заголовка ответа. Формат
sergey
parents:
diff changeset
148 имен полей как у модуля C<CGI>.
sergey
parents:
diff changeset
149
229
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
150 =begin code
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
151
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
152 $response->header->{custom_header} = "my value";
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
153
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
154 #will produce the following header
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
155
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
156 Custom-header: my value
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
157
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
158 =end code
47f77e6409f7 heavily reworked the resource model of the web application:
sergey
parents: 213
diff changeset
159
213
sergey
parents:
diff changeset
160 =head2 C<[get,set]body>
sergey
parents:
diff changeset
161
sergey
parents:
diff changeset
162 Тело ответа. Может быть как простой скаляр, который будет приведен к строке и
sergey
parents:
diff changeset
163 выдан в поток вывода метода C<PrintResponse>. Также может быть ссылкой на
sergey
parents:
diff changeset
164 процедуру, в таком случае будет вызвана эта процедура и ей будет передан
sergey
parents:
diff changeset
165 первым параметром поток для вывода тела ответа.
sergey
parents:
diff changeset
166
sergey
parents:
diff changeset
167 =head2 C<PrintResponse($outStream)>
sergey
parents:
diff changeset
168
sergey
parents:
diff changeset
169 Формирует заголовок и выводит ответ сервера в указанный параметром поток.
sergey
parents:
diff changeset
170
sergey
parents:
diff changeset
171 =cut