cgi.pm - 3ло?!

34
CGI.pm зло?!

Upload: anatoly-sharifulin

Post on 09-Jun-2015

1.630 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: CGI.pm - 3ло?!

CGI.pm — зло?!

Page 2: CGI.pm - 3ло?!

CGI.pm

Page 3: CGI.pm - 3ло?!

Lincoln D. Stein

Page 4: CGI.pm - 3ло?!

131(76)

Page 5: CGI.pm - 3ло?!
Page 6: CGI.pm - 3ло?!

3.3723 апреля 2008

Page 7: CGI.pm - 3ло?!

245 КБ

Page 8: CGI.pm - 3ло?!

4087

Page 9: CGI.pm - 3ло?!

174+

Page 10: CGI.pm - 3ло?!

480 стр

Page 11: CGI.pm - 3ло?!

Возможности

Page 12: CGI.pm - 3ло?!

• ООП и ФОП

• генерация (x)html

• поддержка mod_perl, XForms, server-push

• совместимость с cgi-lib.pl

• поддержка мелочей (IE 3.01 Macintosh)

• магия, много магии (174+)

Page 13: CGI.pm - 3ло?!

Баги

Page 14: CGI.pm - 3ло?!

121

Page 15: CGI.pm - 3ло?!

Недостатки

Page 16: CGI.pm - 3ло?!

• Vars теряет доступ к FH

• одновременно GET и POST параметры

• ProgressBar?!

• некорректная работа с UTF-8

• mod_perl повсюду

• медленная загрузка в память

Page 17: CGI.pm - 3ло?!

POE

Page 18: CGI.pm - 3ло?!

my $q; if ( $request->method() eq 'POST' ) { $q = new CGI( $request->content ); } else { $request->uri() =~ /\?(.+$)/; if ( defined($1) ) { $q = new CGI( $1 ); } else { $q = new CGI; } }

1

Page 19: CGI.pm - 3ло?!

local %ENV;

... $ENV{REQUEST_METHOD} = $request->method; $ENV{QUERY_STRING} = $uri->query; $ENV{COOKIE} = $request->header('Cookie'); ...

our $content = $request->content; tie *STDIN, 'IO::Scalar', \$content;

my $q = new CGI;

2

Page 20: CGI.pm - 3ло?!

Альтернативы

Page 21: CGI.pm - 3ло?!

• CGI::Simple

• CGI::Minimal

• CGI::Lite

• CGI::EasyCGI

• CGI::WebIn

• CGI::Thin

Page 22: CGI.pm - 3ло?!

“use CGI or die”

Page 23: CGI.pm - 3ло?!

Идеальный “CGI.pm”

Page 24: CGI.pm - 3ло?!

• разбор запроса независимо от интерфейса

• CGI, mod_perl, FastCGI, POE и etc.

• ProgressBar!

• XForms, server-push и etc.

• просто, легко и быстро :)

Page 25: CGI.pm - 3ло?!

my $self = shift->SUPER::new( ... 'method' => $ENV{'REQUEST_METHOD'}, 'query' => $ENV{'QUERY_STRING'} || $ENV{'REDIRECT_QUERY_STRING'}, 'type' => $ENV{'CONTENT_TYPE'}, 'length' => $ENV{'CONTENT_LENGTH'}, 'stream' =>\*STDIN, ); $self->parse;

*::CGI

Page 26: CGI.pm - 3ло?!

my $REQUEST = ({ 1 => sub { require Apache; my $r = shift || Apache->request || return; $r->register_cleanup(sub {1}); return $r; }, 2 => sub { ... } })->{ $ENV{'MOD_PERL'} && $ENV{'MOD_PERL_API_VERSION'} };

*::ModPerl

Page 27: CGI.pm - 3ло?!

my $self = shift->SUPER::new( ... 'method' => $REQUEST ? $REQUEST->method : ..., 'query' => $REQUEST ? $REQUEST->args : ...,

'type' => $ENV{'CONTENT_TYPE'}, 'length' => $ENV{'CONTENT_LENGTH'}, 'stream' =>\*STDIN, ); $self->parse;

*::ModPerl

Page 28: CGI.pm - 3ло?!

use FCGI;our $REQUEST;BEGIN { $REQUEST = $ENV{'FCGI_SOCKET_PATH'} ? FCGI::Request(undef, undef, undef, undef, FCGI::OpenSocket($ENV{'FCGI_SOCKET_PATH'}, ($ENV{'FCGI_LISTEN_QUEUE'} || 100)), FCGI::FAIL_ACCEPT_ON_INTR ) : FCGI::Request;}

*::FCGI

Page 29: CGI.pm - 3ло?!

$self->{'request'} = $REQUEST;

...

$self->{'request'} ? $self->{'request'}->Accept >= 0 : FCGI::accept >= 0; ...

*::FCGI

Page 30: CGI.pm - 3ло?!

my $REQUEST = ...; # HTTP::Request ...

open my $STREAM, '<', \($REQUEST->content || '');

*::POE

Page 31: CGI.pm - 3ло?!

my $self = shift->SUPER::new( ... 'method' => $REQUEST->method, 'query' => URI->new($REQUEST->uri)->query,

'type' => join('; ', $REQUEST->content_type), 'length' => $REQUEST->content_length, 'stream' => $STREAM, ); $self->parse;

*::POE

Page 32: CGI.pm - 3ло?!

CGI.pm — зло !

Page 33: CGI.pm - 3ло?!

CGI.pm — зло?!

Page 34: CGI.pm - 3ло?!

Анатолий ШарифулинRostovOnDon.pm

2008