CGI.pm - 3ло?!

1,894 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,894
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

CGI.pm - 3ло?!

  1. 1. CGI.pm — зло?!
  2. 2. CGI.pm
  3. 3. Lincoln D. Stein
  4. 4. 131(76)
  5. 5. 3.37 23 апреля 2008
  6. 6. 245 КБ
  7. 7. 4087
  8. 8. 174+
  9. 9. 480 стр
  10. 10. Возможности
  11. 11. • ООП и ФОП • генерация (x)html • поддержка mod_perl, XForms, server-push • совместимость с cgi-lib.pl • поддержка мелочей (IE 3.01 Macintosh) • магия, много магии (174+)
  12. 12. Баги
  13. 13. 121
  14. 14. Недостатки
  15. 15. • Vars теряет доступ к FH • одновременно GET и POST параметры • ProgressBar?! • некорректная работа с UTF-8 • mod_perl повсюду • медленная загрузка в память
  16. 16. POE
  17. 17. 1 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; } }
  18. 18. 2 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;
  19. 19. Альтернативы
  20. 20. • CGI::Simple • CGI::Minimal • CGI::Lite • CGI::EasyCGI • CGI::WebIn • CGI::Thin
  21. 21. “use CGI or die”
  22. 22. Идеальный “CGI.pm”
  23. 23. • разбор запроса независимо от интерфейса • CGI, mod_perl, FastCGI, POE и etc. • ProgressBar! • XForms, server-push и etc. • просто, легко и быстро :)
  24. 24. *::CGI 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;
  25. 25. *::ModPerl 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'} };
  26. 26. *::ModPerl 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;
  27. 27. *::FCGI 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; }
  28. 28. *::FCGI $self->{'request'} = $REQUEST; ... $self->{'request'} ? $self->{'request'}->Accept >= 0 : FCGI::accept >= 0; ...
  29. 29. *::POE my $REQUEST = ...; # HTTP::Request ... open my $STREAM, '<', ($REQUEST->content || '');
  30. 30. *::POE 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;
  31. 31. CGI.pm — зло !
  32. 32. CGI.pm — зло?!
  33. 33. Анатолий Шарифулин RostovOnDon.pm 2008

×