[SP-pm] Como fazer?
Eden Cardim
edencardim at gmail.com
Mon Oct 24 00:11:47 PDT 2011
>>>>> "Rafael" == Rafael Silveira <design.silveira em gmail.com> writes:
Rafael> Boa noite galera, tentarei ser direto!
Rafael> Tenho o código a seguir
Rafael> package MyApp::HomeController;
Rafael> use base qw{Controller};
Rafael> sub new {
Rafael> }
Rafael> sub index {
Rafael> ...
Rafael> }
Rafael> 1;
Rafael> Qual a melhor forma de criar um server http, para qndo eu
Rafael> acessar localhost/Home/index do meu browser eu obter o
Rafael> retorno do metodo index?
Sendo direto, não dá pra explicar a melhor forma dentro de um email. É
igual perguntar a melhor forma de implementar um sistema operacional. A
sua pergunta é difícil e a resposta, por consequência, vai ser
difícil. Mas, assumindo que uma forma "não-melhor" é tolerável, aqui
vai:
--8<---------------cut here---------------start------------->8---
package MyApp;
use warnings;
use strict;
use IO::Socket;
use Net::hostent; # for OO version of gethostbyaddr
my $PORT = 9000;
sub run {
my ($class) = @_;
my $server = IO::Socket::INET->new(
Proto => 'tcp',
LocalPort => $PORT,
Listen => SOMAXCONN,
Reuse => 1
);
die "can't setup server" unless $server;
printf STDERR "[Server $0 accepting clients]\n";
while ( my $client = $server->accept() ) {
my $hostinfo = gethostbyaddr( $client->peeraddr );
printf STDERR "[Connect from %s]\n",
$hostinfo ? $hostinfo->name : $client->peerhost;
my ( $method, $req_uri, $http_ver ) = split ' ', scalar <$client>;
my $c_method = $class->uri_to_method($req_uri);
print $client "$http_ver 200 OK\n";
print $client "Content-type: text/plain\n\n";
print $client MyApp::Controller->$c_method($client);
print $client "\n";
}
}
sub uri_to_method {
my ( $class, $uri ) = @_;
$uri =~ s{/+}{_}g;
$uri .= 'index' if $uri eq '_';
return $uri;
}
package MyApp::Controller;
use warnings;
use strict;
sub _index { 'Hi, you hit the index' }
sub _foo { 'Whoa, you hit foo' }
sub _bar { 'Hey there, you hit bar' }
sub AUTOLOAD { 'not found' }
package main;
MyApp->run;
--8<---------------cut here---------------end--------------->8---
Coloca isso num arquivo e roda, depois abre http://localhost:9000 no
browser. Isso é uma implementação porta e grosseira extraída de perldoc
perlipc que basicamente faz 80% do que os servers como o apache, nginx,
HTTP::Server, Starman fazem. A "melhor forma" você vai encontrar olhando
pro source de cada uma dessas implementações. Os outros 20% você termina
em alguns anos, até lá, o HTTP provavelmente já estará caminhando para a
obsolescência. De qualquer forma, a especificação se encontra em
http://www.w3.org/Protocols/rfc2616/rfc2616.html, boa sorte!
Rafael> Desculpe de novo, essa "mesma" pergunta, só que dessa vez
Rafael> quero exemplificar dessa forma!
Rafael> Nao sei qual lib usar para o HTTP, talvez um CGI::Fast ou
Rafael> qlqr outra lib!
Porque você quer usar essas libs mas não quer usar as que já fazem algo
mais próximo do que você quer? Onde é o seu critério de corte? E porque
você está na dúvida se usa HTTP ou CGI, você realmente sabe o que eles
fazem e a relação entre os dois?
Rafael> Mas por gentileza, gostaria de saber dessa forma!
Rafael> Como vocês sabem estou aprendendo perl, ja me deram as dicas
Rafael> para aprender Catalyst, mas antes, gostaria de descobrir
Rafael> como fazer isso!
Rafael> Desde já agradeço!
Repetindo, se você olhar no fonte do Catalyst, vai encontrar uma
implementação similar e muito melhor do que essa colada acima. Mas pra
você entender o fonte, precisa entender o que ele está se propondo a
fazer. De novo, eu sugiro que você aprenda a implementar algo bem básico
usando um framework, nem precisa ser o Catalyst, qualquer um serve pra
isso. Depois você acompanha a execução dele passo a passo com o debugger
ou até enchendo o código de print(), etc..
--
Eden Cardim
Software Engineer
http://bit.ly/edencardim
http://twitter.com/#!/edenc
+55 73 9986-3963
More information about the SaoPaulo-pm
mailing list