Mercurial > pub > Impl
comparison lib/IMPL/Web/Application/Action.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
| author | cin |
|---|---|
| date | Fri, 04 Sep 2015 19:40:23 +0300 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 406:f23fcb19d3c1 | 407:c6e90e02dd17 |
|---|---|
| 1 package IMPL::Web::Application::Action; | |
| 2 use strict; | |
| 3 | |
| 4 use Carp qw(carp); | |
| 5 use URI; | |
| 6 use JSON; | |
| 7 | |
| 8 use IMPL::lang; | |
| 9 use IMPL::Const qw(:prop); | |
| 10 use IMPL::Web::CGIWrapper(); | |
| 11 use IMPL::declare { | |
| 12 require => { | |
| 13 Disposable => '-IMPL::Object::Disposable', | |
| 14 HttpResponse => 'IMPL::Web::HttpResponse' | |
| 15 }, | |
| 16 base => [ | |
| 17 'IMPL::Object' => undef, | |
| 18 'IMPL::Object::Autofill' => '@_', | |
| 19 'IMPL::Object::Disposable' => undef | |
| 20 ], | |
| 21 props => [ | |
| 22 application => PROP_RW, | |
| 23 security => PROP_RW, | |
| 24 query => PROP_RO, | |
| 25 context => PROP_RW, | |
| 26 _jsonData => PROP_RW, | |
| 27 ] | |
| 28 }; | |
| 29 | |
| 30 sub CTOR { | |
| 31 my ($this) = @_; | |
| 32 | |
| 33 $this->context({}); | |
| 34 $this->security($this->application->CreateSecurity()); | |
| 35 } | |
| 36 | |
| 37 sub cookie { | |
| 38 my ($this,$name,$rx) = @_; | |
| 39 | |
| 40 $this->_launder(scalar( $this->query->cookie($name) ), $rx ); | |
| 41 } | |
| 42 | |
| 43 sub header { | |
| 44 my ($this,$header) = @_; | |
| 45 | |
| 46 $this->query->https ? $this->query->https($header) : $this->query->http($header); | |
| 47 } | |
| 48 | |
| 49 sub isSecure { | |
| 50 shift->query->https ? 1 : 0; | |
| 51 } | |
| 52 | |
| 53 sub isJson { | |
| 54 return shift->contentType =~ m{^application/json} ? 1 : 0; | |
| 55 } | |
| 56 | |
| 57 sub param { | |
| 58 my ($this,$name,$rx) = @_; | |
| 59 | |
| 60 my $value; | |
| 61 | |
| 62 if ( | |
| 63 $this->requestMethod eq 'GET' | |
| 64 or | |
| 65 $this->contentType eq 'multipart/form-data' | |
| 66 or | |
| 67 $this->contentType eq 'application/x-www-form-urlencoded' | |
| 68 ) { | |
| 69 $value = scalar( $this->query->param($name) ); | |
| 70 } else { | |
| 71 $value = scalar( $this->query->url_param($name) ); | |
| 72 } | |
| 73 | |
| 74 $this->_launder($value, $rx ); | |
| 75 } | |
| 76 | |
| 77 sub urlParam { | |
| 78 my ($this,$name,$rx) = @_; | |
| 79 | |
| 80 $this->_launder(scalar( $this->query->url_param($name) ), $rx); | |
| 81 } | |
| 82 | |
| 83 sub urlParams { | |
| 84 shift->query->url_param(); | |
| 85 } | |
| 86 | |
| 87 sub rawData { | |
| 88 my ($this, $decode) = @_; | |
| 89 | |
| 90 local $IMPL::Web::CGIWrapper::NO_DECODE = $decode ? 0 : 1; | |
| 91 if ($this->requestMethod eq 'POST') { | |
| 92 return $this->query->param('POSTDATA'); | |
| 93 } elsif($this->requestMethod eq 'PUT') { | |
| 94 return $this->query->param('PUTDATA'); | |
| 95 } | |
| 96 } | |
| 97 | |
| 98 sub jsonData { | |
| 99 my ($this) = @_; | |
| 100 | |
| 101 if ($this->isJson ) { | |
| 102 my $data = $this->_jsonData; | |
| 103 unless($data) { | |
| 104 $data = JSON->new()->decode($this->rawData('decode encoding')); | |
| 105 $this->_jsonData($data); | |
| 106 } | |
| 107 | |
| 108 return $data; | |
| 109 } | |
| 110 | |
| 111 return; | |
| 112 } | |
| 113 | |
| 114 sub requestMethod { | |
| 115 my ($this) = @_; | |
| 116 return $this->query->request_method; | |
| 117 } | |
| 118 | |
| 119 sub contentType { | |
| 120 return shift->query->content_type(); | |
| 121 } | |
| 122 | |
| 123 sub pathInfo { | |
| 124 my ($this) = @_; | |
| 125 return $this->query->path_info; | |
| 126 } | |
| 127 | |
| 128 sub baseUrl { | |
| 129 my ($this) = @_; | |
| 130 | |
| 131 return $this->query->url(-base => 1); | |
| 132 } | |
| 133 | |
| 134 sub applicationUrl { | |
| 135 shift->application->baseUrl; | |
| 136 } | |
| 137 | |
| 138 sub applicationFullUrl { | |
| 139 my ($this) = @_; | |
| 140 | |
| 141 return URI->new_abs($this->application->baseUrl, $this->query->url(-base => 1)); | |
| 142 } | |
| 143 | |
| 144 # creates an url that contains server, schema and path parts | |
| 145 sub CreateFullUrl { | |
| 146 my ($this,$path) = @_; | |
| 147 | |
| 148 return $path ? URI->new_abs($path,$this->applicationFullUrl) : $this->applicationFullUrl; | |
| 149 } | |
| 150 | |
| 151 # creates an url that contains only a path part | |
| 152 sub CreateAbsoluteUrl { | |
| 153 my ($this,$path) = @_; | |
| 154 | |
| 155 return $path ? URI->new_abs($path,$this->applicationUrl) : $this->applicationUrl; | |
| 156 } | |
| 157 | |
| 158 sub Redirect { | |
| 159 my ($this,$path) = @_; | |
| 160 return HttpResponse->Redirect( | |
| 161 location => $this->CreateFullUrl($path) | |
| 162 ); | |
| 163 } | |
| 164 | |
| 165 sub _launder { | |
| 166 my ($this,$value,$rx) = @_; | |
| 167 | |
| 168 if ( $value ) { | |
| 169 if ($rx) { | |
| 170 if ( my @result = ($value =~ m/$rx/) ) { | |
| 171 return @result > 1 ? \@result : $result[0]; | |
| 172 } else { | |
| 173 return; | |
| 174 } | |
| 175 } else { | |
| 176 return $value; | |
| 177 } | |
| 178 } else { | |
| 179 return; | |
| 180 } | |
| 181 } | |
| 182 | |
| 183 sub Dispose { | |
| 184 my ($this) = @_; | |
| 185 | |
| 186 $this->security->Dispose() | |
| 187 if $this->security and $this->security->can('Dispose'); | |
| 188 | |
| 189 $_->Dispose() foreach grep is($_,Disposable), values %{$this->context}; | |
| 190 | |
| 191 $this->next::method(); | |
| 192 } | |
| 193 | |
| 194 1; | |
| 195 | |
| 196 __END__ | |
| 197 | |
| 198 =pod | |
| 199 | |
| 200 =head1 NAME | |
| 201 | |
| 202 C<IMPL::Web::Application::Action> - Обертка вокруг C<CGI> запроса. | |
| 203 | |
| 204 =head1 DESCRIPTION | |
| 205 | |
| 206 C<[Infrastructure]> | |
| 207 Свзяывет CGI запрос, приложение, орабатывающее его и ответ, который будет отправлен клиенту. | |
| 208 | |
| 209 =head1 MEMBERS | |
| 210 | |
| 211 =head2 C<CTOR(%args)> | |
| 212 | |
| 213 Инициализирует новый экземпляр. Именованными параметрами передаются значения | |
| 214 свойств. | |
| 215 | |
| 216 =head2 C< [get]application> | |
| 217 | |
| 218 Экземпляр приложения создавшего текущий объект | |
| 219 | |
| 220 =item C< [get] query > | |
| 221 | |
| 222 Экземпляр C<CGI> запроса | |
| 223 | |
| 224 =back | |
| 225 | |
| 226 | |
| 227 =cut |
