Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use strict;
- use warnings;
- use IO::Socket::INET;
- use Template;
- my $port = 8080;
- my $socket = IO::Socket::INET->new(
- LocalPort => $port,
- Type => SOCK_STREAM,
- Reuse => 1,
- Listen => SOMAXCONN
- );
- die "failed to create socket: $!\n" unless $socket;
- my $tt = Template->new();
- while (1) {
- my $client_socket = $socket->accept();
- my $request = <$client_socket>;
- my ($method, $url) = $request =~ /^(\w+)\s+\/?(\S+)/;
- if ($url ne "login" && !is_authenticated()) {
- redirect($client_socket, "/login");
- next;
- }
- if ($method eq "GET") {
- if ($url eq "hello") {
- my $vars = {
- title => "Welcome",
- heading => "Hello, user."
- };
- my $output;
- if ($tt->process("template.tt", $vars, \$output)) {
- success($client_socket, $output);
- } else {
- error($client_socket, "error processing template");
- }
- } elsif ($url eq "login") {
- my $content = "<h1>Login</h1>";
- success($client_socket, $content);
- } elsif ($url eq "logout") {
- my $content = "<h1>Logout</h1>";
- success($client_socket, $content);
- } else {
- not_found($client_socket);
- }
- } elsif ($method eq "POST") {
- if ($url eq "login") {
- my $content = "<h1>Processing login form submission</h1>";
- success($client_socket, $content);
- } else {
- not_found($client_socket);
- }
- } else {
- method_not_allowed($client_socket);
- }
- close($client_socket);
- }
- sub is_authenticated {
- # Supondo que o usuário está autenticado se envia o parâmetro 'authenticated' na query string
- my %query_params = parse_query_params($url);
- if (exists $query_params{'authenticated'} && $query_params{'authenticated'} eq 'true') {
- return 1;
- } else {
- return 0;
- }
- }
- sub redirect {
- my ($socket, $url) = @_;
- my $response = "HTTP/1.1 302 Found\r\nLocation: $url\r\n\r\n";
- print $socket $response;
- }
- sub success {
- my ($socket, $content) = @_;
- my $response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n" . $content;
- print $socket $response;
- }
- sub not_found {
- my ($socket) = @_;
- my $response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\n\r\nPágina não encontrada";
- print $socket $response;
- }
- sub method_not_allowed {
- my ($socket) = @_;
- my $response = "HTTP/1.1 405 Method Not Allowed\r\nContent-Type: text/plain\r\n\r\nMétodo não permitido";
- print $socket $response;
- }
- sub error {
- my ($socket, $message) = @_;
- my $response = "HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/plain\r\n\r\n$message";
- print $socket $response;
- }
- sub parse_query_params {
- my ($url) = @_;
- my %params;
- if (my $query_string = (split /\?/, $url)[-1]) {
- my @pairs = split /[;&]/, $query_string;
- foreach my $pair (@pairs) {
- my ($key, $value) = split /=/, $pair;
- $params{$key} = $value if defined $key && defined $value;
- }
- }
- return %params;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement