Emulador de um "browser" via script CGI
Atualizado em 03/11/2008
O objetivo desta atividade é emular um navegador (browser) através de um
script CGI escrito em C. O script deve ser invocado através
de um formulário HTML com um campo texto contendo
o endereço de uma página html qualquer
(veja aqui um exemplo de formulário).
Exemplos de URLs:
http://www.ic.unicamp.br/~celio/mc823-2008/homepage.html (obs: http:// é opcional)
ou
www.yahoo.com
O seu script deve então:
- decodificar a URL que é enviada pelo browser com a transcodificação
URL encoded (*),
- extrair da URL (**) o endereçoo DNS do servidor web (no exemplo: wwww.ic.unicamp. br)
e o caminho da página dentro do servidor (no exemplo: /~celio/mc823-2008/homepage.html,
- obter o endereço IP do servidor web (use gethosbyname()),
- abrir uma conexão TCP na porta 80 do servidor web,
- usar o método get do protocolo
HTTP/1.1
para recuperar a página html do servidor,
- (teste inicialmente o seu script enviando para a saída padrão (***)
a página recebida como se fosse um arquivo txt,
e analise o texto da página recebida antes de codificar o passo a seguir)
- envie apenas a parte html do texto recebido para a saída padrão com o cabeçalho apropriado
(como a saída padrão está sendo redirecionada para o descritor de socket conectado ao browser
que originou o pedido, o browser do cliente vai exibi-la da forma apropriada ou seja, html)
Teste o seu script com várias URLs e verifique que a sua saída é quase sempre
igual à exibida diretamente pelo browser ao acessar a URL (exceções comuns são imagens
com links locais no servidor)
(*) Você pode usar para este fim a seguinte função em C (procure entender o seu funcionamento!):
void unencode(char *src, char *last, char *dest) //decodes an URL encoded string to original form
{
for(; src != last; src++, dest++)
if(*src == '+')
*dest = ' ';
else if(*src == '%') {
int code;
if(sscanf(src+1, "%2x", &code) != 1) code = '?';
*dest = code;
src +=2; }
else
*dest = *src;
*dest = '\n';
*++dest = '\0';
}
(**) Use para este fim as funções de
tratamento de cadeias de caracteres da linguagem C.
Observe que no exemplo da 2a URL, www.yahoo.com, apenas o endereço DNS do servidor web
foi colocado. Nesse caso o browser assume que o documento pedido tem como caminho
a raiz de documentos no servidor que é "/" (e na raiz existe um documento "default"
que usualmente se chama index.html). Em outras palavras a 2a URL é
tratada pelo browser como equivalente à seguinte
URL: www.yahoo.com/ (onde o caminho da página requerida é "/"). Você deve fazer o mesmo no seu emulador,
ao fazer o "parsing" da URL.
(***) A fim de evitar que mensagens de depuração do seu script gerem um erro
interno no servidor que está executando o script (estas mensagens estão sendo
redirecionadas da saída padrão para o socket conectado ao
browser), logo no começo do script envie para a saída padrão a cadeia:
"Content Type: text/html\n\n"
Ambiente de programação de scripts CGI nos labs do IC
O servidor Apache da máquina agua.lab.ic.unicamp.br está configurado para
executar scripts com extensão .cgi localizados no subdiretório public_html/cgi-bin
dos alunos (a servidora agua.lab "monta" automaticamente os homedirs de quem tem conta nas máquinas dos
laboratórios do IC3). Páginas html são usualmente colocadas no diretório public_html
mas podem também ser colocadas em qualquer subdiretório do mesmo.
Não deve ser escrito explicitamente numa URL para acesso a uma página html
ou a um script cgi. Por exemplo se você tiver
no seu diretório public_html uma página denominada minhahomepage.html
você irá exibi-la via browser com a seguinte URL:
http://agua.lab.ic.unicamp.br/~meu_home_dir/minhahomepage.html
Da mesma forma para executar o script meuscript.cgi (compilado a partir de C),
você usaria a URL:
http://agua.lab.ic.unicamp.br/~meu_home_dir/cgi-bin/meuscript.cgi