Scripts CGI em C
Interação entre um browser e um Servidor Web
Quando você acessa uma URL através de um navegador (browser), por exemplo,
http://www.ic.unicamp.br/~celio/mc823-2008/a6.html,
o browser faz o seguinte:
-
extrai da URL o nome do servidor web: www.ic.unicamp.br
- faz uma conexão TCP na porta 80 do servidor web,
- extrai da URL o caminho da página html no servidor: /~celio/mc823-2008/a6.html
- envia ao servidor uma mensagem do tipo GET do protocolo HTTP 1.1. Neste caso a mensagem seria parecida com esta:
GET /~celio/mc823-2008/a6.html HTTP/1.1
Host: davinci.ic.unicamp.br:80
(uma linha em branco aqui)
No cabeçalho Host: vai o nome DNS da máquina onde está executando o browser
- o servidor envia como resposta ao browser a página HTML precedida do cabeçalho apropriado, algo como:
HTTP/1.1 200 OK
Date: Mon, 03 Nov 2008 10:09:41 GMT
Server: Apache
Last-Modified: Wed, 27 Aug 2008 22:33:26 GMT
ETag: "2ee5f9-bac-9bd97980"
Accept-Ranges: bytes
Content-Length: 2988
Connection: close
Content-Type: text/html
(linha em branco aqui)
<!Doctype......
<html>
etc...
- o browser exibe a página HTML no vídeo,
- após cerca de 15 segundos, se nenhuma outra página for requisitada pelo browser, o servidor web fecha a conexão TCP
Envio de dados de um formulário HTML e seu processamento via script CGI
Um formulário HTML possue campos de diversos tipos para envio de dados a um Servidor Web.
Esses dados devem ser lidos e processados por um programa hospedado no servidor (genericamente
chamado de script CGI) e cujo caminho
é especificado como atributo do elemento FORM do formulário. Por exemplo, veja o "source"
deste formulário simples.
O browser abre a conexão TCP na porta 80 do servidor web da forma usual.
Os dados do formulário são enviados pelo browser através do método POST (outro atributo do elemento FORM)
do protocolo HTTP
no corpo da mensagem POST, codificados na forma
URL encoding: os campos do formulário
são separados pelo caracter '&' e cada campo do formulário tem o formato:
nome_do_campo=valor_do_campo_URL_encoded
O script CGI pode ser escrito em diversas linguagens (Java, PHP, Python, Perl, C, etc).
Ao invocar o script CGI o servidor web redireciona o descritor do socket (com o qual está conectado ao browser
que enviou os dados do formulário) para a entrada e saída padrão (via comando dup2) Desta forma o script CGI,
se escrito em C, pode ler, por exemplo, via fread(....,stdin) a mensagem POST enviada pelo browser e pode enviar de volta ao browser comandos HTML via, por exemplo, printf() ou fputs(). A resposta à mensagem POST possui um cabeçalho especificando o tipo Mime
do conteúdo da resposta, para que o browser possa exibi-la de forma
apropriada (html, gif, jpeg, etc). Se a resposta for uma página HTML
este cabeçalho teria o formato:
Content-Type: text/html
(linha em branco aqui)
comandos HTML em seguida
Como os dados que vem do browser na mensagem POST estão codificados no formato "URL encoded" é preciso
transcodificá-los para o formato original.
Scripts CGI mais elaborados usualmente acessam um Base de Dados
(MySql, por exemplo) e com os dados obtidos da Base de Dados constroem
dinamicamente uma página HTML que é enviada de volta ao browser.