Scripts CGI simples

Supondo que você já tem acesso a um diretório cgi-bin (consulte a seção anterior) e que já conhece a linguagem de programação C ou PERL, você pode fazer uma série de experiências interessantes com o CGI. Vamos começar criando o mais simples script CGI.

No artigo Como funcionam as páginas de internet, nós examinamos a página HTML mais simples possível. Ela se parecia com isso:

  <html>
    <body>
       <h1>Olá!</h1>
    </body>
  </html>  

O script CGI mais simples, depois de executado, criaria esta página simples e estática. Veja como este programa CGI seria exibido se você o escrevesse em C:

  #include <stdio.h>
 
  int main()
  {
   printf("Content-type: text/htmlnn");
   printf("<html>n");
   printf("<body>n");
   printf("<h1>Olá!</h1>n");
   printf("</body>n");
   printf("</html>n");
   return 0;
  }   

No meu servidor web, eu escrevi este programa no arquivo simplest.c e o compilei com a seguinte linha de código

gcc simples.c -o simplest.cgi

Consulte Como funciona a programação em C para obter mais informações sobre a compilação de programas em C.

Ao colocar o arquivo simplest.cgi no diretório cgi-bin, ele pode ser executado. Você verá que tudo o que este script faz é gerar uma página que diz "Olá!". O único segmento inesperado é uma linha que diz:

    printf("Content-type: text/html\n\n");  

A linha "Content-type: text/html\n\n" é um texto especial que deve ser a primeira coisa que um script CGI envia para um navegador. Lembre-se disso e tudo funcionará bem. Se você esquecer deste detalhe, o navegador rejeitará o script.

Você pode fazer a mesma coisa em PERL. Digite este código PERL no arquivo chamado simplest.pl:

  #! /usr/bin/perl
 print "Content-type: text/html\n\n";
 print "<html><body><h1>Olá mundo!";
 print "</h1></body></html>\n";   

Copie o arquivo no diretório cgi-bin. Numa máquina rodando UNIX, também é importante digitar:

chmod 755 simplest.pl

Esta linha de código diz para o UNIX que o script é executável. Você pode fazer isso agora, digitando ou clicando no seguinte endereço: http://www.hsw.com.br/cgi-bin/simplest.pl.

Você acabou de aprender os conceitos básicos do script CGI. Um programa é executado e envia informações para o navegador que solicitou o script. As informações normais enviadas para stdout é o que o gets enviou para o navegador.

O objetivo do script CGI é criar conteúdo dinâmico. Toda vez que o script é executado, as informações resultantes são diferentes. Afinal, se as informações geradas fossem iguais toda vez que você executasse o script, seria melhor usar uma página estática. O programa em C a seguir demonstra um conteúdo dinâmico bastante simples:

  #include <stdio.h>

  int incrementcount()
  {
    FILE *f;
    int i;

     f=fopen("count.txt", "r+");
     if (!f)
     {
        sleep(1);
        f=fopen("count.txt", "r+");
        if (!f)
         return -1;
     }

     fscanf(f, "%d", andi);
     i++;
     fseek(f,0,SEEK_SET);
     fprintf(f, "%d", i);
     fclose(f);
     return i;
   }
   int main()
   {
     printf("Content-type: text/htmln\n");
     printf("<html>\n");
     printf("<body>\n");
     printf("<h1>A contagem atual é: ");
     printf("%d</h1>\n", incrementcount());
     printf("</body>n");
     printf("</html>n");
     return 0;
   }   

Usando um editor de texto, copie e cole este código em um arquivo chamado count.c. Compile o arquivo digitando:

gcc count.c -o count.cgi

Crie outro arquivo de texto chamado count.txt e coloque um número zero dentro dele. Ao copiar os arquivos counter.cgi e count.txt para o diretório cgi-bin, você poderá executar o script. Você pode fazer isso agora, digitando ou clicando no seguinte endereço: http://www.hsw.com.br/cgi-bin/simplest.pl. Como você pode ver, tudo o que este script faz é gerar uma página que diz "A contagem atual é: x," onde x aumenta a cada vez que você executa o script. Execute o script diversas vezes e observe como o conteúdo da página muda.

O arquivo count.txt armazena a contagem atual e a função incrementcount() é a função que aumenta a contagem no arquivo count.txt. Esta função abre o arquivo count.txt, lê o número que está lá, aumenta o número e reescreve o arquivo. Na verdade, esta função tenta abrir o arquivo duas vezes. Ela faz isso por precaução, no caso de duas pessoas tentarem acessar o arquivo simultaneamente. Não é uma técnica infalível, mas para algo tão simples até que funciona. Se o arquivo não puder ser aberto na segunda tentativa, o valor de erro retornado ao usuário é -1. Um programa mais sofisticado reconheceria o valor retornado -1 e geraria uma mensagem de erro apropriada.