diff Lib/IMPL/Web/CGIWrapper.pm @ 244:a02b110da931

refactoring fixed binding to CGI query parameters with multiple values
author sergey
date Mon, 22 Oct 2012 04:09:27 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Lib/IMPL/Web/CGIWrapper.pm	Mon Oct 22 04:09:27 2012 +0400
@@ -0,0 +1,75 @@
+package IMPL::Web::CGIWrapper;
+use strict;
+
+use parent qw(CGI);
+use Encode;
+
+our $NO_DECODE = 0;
+
+sub param {
+    my $this = shift;
+
+    return $this->SUPER::param(@_) if $NO_DECODE;
+
+    if (wantarray) {
+        my @result = $this->SUPER::param(@_);
+
+        return map Encode::is_utf8($_)
+          ? $_
+          : Encode::decode( $this->charset, $_, Encode::LEAVE_SRC ), @result;
+    }
+    else {
+        my $result = $this->SUPER::param(@_);
+
+        return Encode::is_utf8($result)
+          ? $result
+          : Encode::decode( $this->charset, $result, Encode::LEAVE_SRC );
+    }
+
+}
+
+sub upload {
+    my $this = shift;
+
+    local $NO_DECODE = 1;
+    my $oldCharset = $this->charset();
+    $this->charset('ISO-8859-1');
+
+    my $fh = $this->SUPER::upload(@_);
+
+    $this->charset($oldCharset);
+    return $fh;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+C<IMPL::Web::CGIWrapper> - обетрка вокруг стандартного объекта C<CGI>
+
+=head1 DESCRIPTION
+
+Наследуется от C<CGI>, и переопределяет метод C<param> для декодирования
+строковых параметров. В остальном функциональность аналогична стандартному
+модулю C<CGI>.
+
+=head1 MEMBERS
+
+=head2 C<$NO_DECODE>
+
+Глобальная переменная для отключения декодирования параметров.
+
+=begin code
+
+{
+    local $IMPL::Web::CGIWrapper::NO_DECODE = 1;
+    my $raw = $q->param('binary');
+}
+
+=end code 
+
+=cut
\ No newline at end of file