Archive for the ‘CGI’ Category

Como funciona a CGI

abril 7, 2007



A CGI (Common Gate Interface) é um programa instalado num servidor da WWW que pode ser acessado através de páginas HTML. Além disso, a própria CGI pode gerar código HTML e enviá-lo a um navegador.

Quando você está na web e utiliza um mecanismo de busca, compra um livro, deixa um recado num livro de visitas ou vê um contador de páginas, podes crer… por trás desses serviços está uma CGI (ou uma plataforma semelhante).

Um programa CGI, quando solicitado, manipula dados. Esta manipulação de dados ocorre no servidor web. Os programas CGI podem gravar (salvar) dados no servidor. Por exemplo, seu acesso à uma página com contador ou seu recado no livro de visitas fica gravado no servidor web. Os programas CGI também podem ler dados do servidor e utilizá-los para gerar código HTML. Este código HTML “dinâmico” é transmitido para o navegador que chamou a CGI e apresentado na forma de uma página HTML. Por exemplo, o número de acessos de uma página ou todos os recados de um livro de visitas.

O acesso à CGI é proporcionado por software instalado no servidor web. Geralmente este software de suporte à CGI prevê que os programas CGI estejam instalados num determinado diretório, geralmente denominado cgi-bin. Alguns servidores web permitem que você crie seus próprios diretórios para abrigar seus programas CGI, como também existem servidores que não disponibilizam acessos a CGI… tem de tudo.

Como já foi visto na introdução, não existe uma “linguagem” CGI. Teoricamente, qualquer linguagem de programação pode ser utilizada, porém … e, e aí está o primeiro porém… o programa CGI precisa ser compilado para o sistema do servidor ou o servidor precisa disponibilizar um interpretador em tempo real que execute seu programa. Se, por exemplo, o servidor for UNIX, ele pode executar programas CGI escritos em C que tenham sido compilados utilizando-se um compilador UNIX-C. Se o servidor for um Windows-NT, os programas CGI podem também ser arquivos .EXE gerados por compiladores de 32 bits para C, Pascal, Visual Basic, etc. Atualmente, a maioria dos programas CGI é escrita em Perl ou UNIX-Shell. A linguagem UNIX-Shell é interpretada por todos os servidores UNIX. Para a linguagem Perl ou PHP, o servidor precisa ter um interpretador correspondente instalado (a maioria tem).


Situação típica de um mecanismo de busca na web

Fluxograma Página Dinâmica

No exemplo acima, o usuário pode digitar dados num formulário de uma página HTML para solicitar uma pesquisa num banco de dados. Após enviar o formulário para o servidor web, o programa CGI é chamado. O programa CGI transforma os dados enviados pelo usuário numa solicitação ao banco de dados. O tipo de solicitação depende essencialmente do banco de dados disponível. Existe uma linguagem padrão internacional, chamada SQL, que é utilizada com frequência. O banco de dados envia o resultado da pesquisa para o programa CGI solicitante ou grava o resultado num arquivo que possa ser lido pela CGI. O programa CGI gera então um código HTML, utilizando o resultado da pesquisa como dados para a página HTML. Em seguida, envia o código HTML para o servidor que, por sua vez, o envia para o navegador que fez a solicitação. No monitor do usuário, a página com o formulário de solicitação é substituída pela nova página, gerada dinamicamente pela CGI e que contém o resultado da pesquisa.

Breve Introdução a CGI

abril 7, 2007


O que é CGI

O termo CGI vem de Common Gateway Interface. É apenas uma outra designação para o que conhecemos como API (Application Programming Interface). Resumo da história, a CGI é apenas uma API para o servidor web.

O servidor web, por sua vez, é o software que envia páginas web para os web browsers (navegadores como o Internet Explorer ou o Netscape). Tecnicamente, os navegadores deveriam ser chamados de clientes web e, as pessoas que os utilizam, deveriam ser chamados de navegadores. Mas deixa pra lá…

Encontra-se muita informação a respeito da CGI na Internet porém, na maioria das vezes, desencontrada e cheia de mitos e preconceitos. Vamos esclarecer algumas dúvidas relatando o que não é a CGI…



A CGI não é…

… não é uma linguagem de programação: isto significa que você pode usar qualquer linguagem da sua escolha para escrever um programa CGI. É claro que a linguagem escolhida precisa ser capaz de ler um “input” e escrever um “output”. Você conhece alguma linguagem de programação que não ofereça tais possibilidades?

…não necessita da linguagem PERL. A PERL pode ser usada assim como qualquer outra linguagem, como PHP, C, Phyton, Object Pascal, etc.

… não é apenas para especialistas em sistemas UNIX. Aliás, não há necessidade de ser especialista algum, noções básicas de programação são mais do que suficientes.

… não é um estilo de programação. Use seu estilo próprio, pois apenas com “input” e “output” podemos fazer com que o servidor web “converse” com a CGI.


O que faz um Servidor Web

Parece brincadeira, mas um servidor web apenas espera – a não ser que o site esteja sendo maciçamente acessado.

O que o servidor web fica esperando nada mais é do que um cliente, um navegador que solicite um arquivo. Este arquivo pode ser uma página HTML, um gráfico ou qualquer outro tipo de arquivo.

Quando o servidor web recebe uma solicitação, realiza três tarefas na seguinte ordem:

  1. Envia uma linha de texto raso que contém a indicação do tipo de arquivo que será enviado, ou seja, HTML, GIF, JPEG ou qualquer outro.
  2. Envia uma linha em branco.
  3. Envia o conteúdo do arquivo.


Como o Servidor Web envia arquivos

Um de cada vez. Por incrível que pareça, apenas UM.

Sabemos que uma página de web típica é constituída por um documento HTML e por alguns gráficos. Cada um deles é um arquivo diferente que precisa ser enviado ao navegador.

Como o servidor web envia apenas UM arquivo por vez, o navegador precisa iniciar uma nova sessão (solicitação) para cada um dos arquivos de que necessite. Ainda bem que, tanto o servidor web quanto o navegador, são multi-tarefa. O navegador pode solicitar vários arquivos simultaneamente e o servidor web pode enviar vários arquivos simultaneamente, porém, para cada um dos arquivos solicitados-enviados é necessária UMA SESSÃO própria.



O servidor web só é capaz de enviar arquivos?

Não necessariamente. Na verdade, o que ocorre é apenas uma transferência de dados. Lembre-se de que o servidor e o cliente (o navegador) geralmente são executados em computadores diferentes. Eles podem até usar sistemas operacionais diferentes em máquinas com microprocessadores diferentes. O navegador apenas solicita um “recurso” e não sabe, nem precisa saber, de onde o servidor obtém os dados.

Entretanto, um servidor típico está programado para obter seus dados de um arquivo. Ele simplesmente lê os dados do arquivo e os transmite para o cliente. Como resultado desse processo, o servidor envia apenas dados estáticos, ou seja, o servidor não altera dinamicamente os dados enviados.



O que fazer para enviar dados dinâmicos?

Não é nada difícil. A CGI foi projetada justamente para cumprir esta função. Você simplesmente escreve um programa que produz dados dinamicamente e estes dados, ao invés de um arquivo, são enviados para o navegador.

Esta é a maneira como um programa CGI amplia a funcionalidade de um servidor, da mesma forma que, por exemplo, uma DLL amplia a funcionalidade do Windows. Mas tem uma grande diferença: a CGI é muitíssimo mais simples de escrever do que qualquer coisa para o Windows.



Mas, como falar com o navegador?

Não há necessidade de se falar com o navegador. É o servidor que faz este trabalho. O melhor da brincadeira é que você nem mesmo precisa falar com o servidor. Tudo o que você tem a fazer é escrever para uma saída padrão (standart output). Da mesma forma como, por exemplo, você usa o printf() da linguagem C.

A única coisa que não se pode perder de vista é a sequência das três tarefas realizadas pelo servidor numa transmissão de dados (citada acima). Uma vez que o servidor desconhece o tipo de dados que você estará enviando, você precisa suprir a saída padrão com esta informação.

Foi dito acima que você pode usar seu estilo próprio. Pois vamos lá: suponha que seu servidor esteja rodando sob DOS. A bem da verdade, não existe nenhum servidor assim mas… existem servidores Windows e o Windows pode interpretar comandos do MS DOS. Sendo assim, imagine que você queira enviar uma lista do seu diretório corrente para a web (não é uma boa idéia, mas mostra como essa tarefa é simples). O MS DOS também tem o comando dir que envia a listagem de diretórios para a saída padrão. Então, teoricamente, poderíamos produzir o seguinte script:

1a. Tarefa: identificar o tipo de dados que serão enviados
echo Content-type: text/plain

2a. Tarefa: enviar uma linha em branco
echo

3a. Tarefa: enviar o conteúdo
dir

O exemplo acima é apenas uma simulação de como funciona um script CGI usando elementos que a maioria das pessoas conhece. Foi citado apenas para entender o princípio de um output (saída) e não para funcionar de verdade. Agora, mais um passo…



Como conseguir um input (uma entrada)?

Primeiramente precisa ficar bem claro que a web NÃO é interativa. Isto significa que seu programa CGI não pode solicitar entradas (input) dos usuários, processá-las, enviar algum resultado (output), pedir mais um input etc.

É justamente por isso que a programação de uma CGI é muito simples. O programa recebe entradas do usuário apenas uma vez, logo no início, e envia apenas uma resposta (output). Entretanto, tanto a entrada quanto a resposta podem ter qualquer tamanho e complexidade, dependendo do que seu programa possa comportar.

Dito isto, você precisa saber que seu programa pode receber uma entrada do usuário de duas maneiras, dependendo do método que o navegador usar para enviá-lo ao servidor.



Onde o navegador acha o input do usuário?

O navegador aceita entradas usando formulários HTML (forms). Um formulário pode instruir o navegador para enviar dados através de dois métodos: GET e POST.

O método GET envia as entradas como parte da URL. O método POST envia as entradas como stdin. O segundo método parece ter algumas vantagens:

  • É possível enviar maior quantidade de dados (a URL tem limite de tamanho).
  • Os dados não são registrados em arquivos de acesso (log). Por exemplo: enviando uma senha como parte de uma URL deixa um rastro nos vários sistemas pelos quais os dados estejam passando!
  • Os dados não aparecem no campo de endereços do navegador. Novamente, mostrar uma senha no navegador pode não ser do agrado do usuário.


Como saber qual método está sendo usado?

O servidor web, antes de carregar seu programa CGI, inicializa algumas variáveis de contexto. Você pode analisar estas variáveis para saber a quantidade e a origem dos dados de entrada (input).

Uma das variáveis de contexto é a REQUEST_METHOD. Seu valor pode ser POST, GET e, eventualmente, HEAD.

Se REQUEST_METHOD indicar POST, a variável CONTENT_LENGTH indicará quantos bytes de dados deverão ser lidos através de stdin e a variável CONTENT_TYPE indicará que os dados se originam de um formulário (ou, possivelmente, de alguma outra fonte).

Assim que os dados tenham sido recebidos (lidos pelo servidor), podem imediatamente serem processados e a resposta (output) pode ser enviada através de um stdout. Geralmente a resposta é escrita na forma de dados HTML, com toda a formatação necessária. Mas programas CGI podem produzir qualquer tipo de resposta, como um arquivo GIF ou qualquer outra coisa.

Este é o motivo pelo qual você precisa indicar ao navegador, nas 2 primeiras etapas da transmissão, o tipo de dado que será enviado. Podemos identificar dados de HTML enviando a string Content-type: text/html (tarefa 1) seguida de uma string vazia (tarefa 2). Usando a linguagem C seria printf(“Content-type: text/html\n\n”); onde \n é quebra de linha e o segundo \n outra quebra de linha para indicar a linha vazia. Usando PERL seria print “Content-type: text/html\n\n”;