[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