24 November 2000 - previous November updates: 03 05 07 09 10 13 15 17 20 21 22 24 ; previous updates

1 - CGI Tutorial #01 (parte 2 / 3 )

Internet Services Manager - Em Windows 2000, utilize esse programa para fazer a gestão dos serviços disponíveis.

O folder de scripts deverá ter privilégios de execução, pois os programas C são compilados e geram executáveis.

CGI Tutorial #01 (parte 2 / 3) - Explicação do código C

O código C utilizado para escrever software CGI, tal qual disponibilizado na primeira parte desta introdução ao assunto, é muito elementar.

Em CGI, a comunicação cliente-servidor faz-se confiando em variáveis de ambiente, pelo que é necessário saber consultar essas entidades, a partir do programa. Como fazê-lo?

A "standard library", cujas declarções podem ser incluidas por uma linha "#include ", inclui uma função que serve exactamente para esse propósito:

char *getenv( const char *varname );

Esta função retorna uma string, correspondente ao valor da variável de ambiente enviada como argumento. Pode-se assim construir "macros" para as consultas às variáveis ambiente. Por exemplo:

#define SERVER_SOFTWARE getenv("SERVER_SOFTWARE")

faz nascer a macro SERVER_SOFTWARE, que vale o que valer a variável ambiente "SERVER_SOFTWARE"; isto é, indicará que programa está a servir as páginas ao browser. Esse software será também o responsável pela execução dos scripts CGI.

Se se fizesse uma escrita do valor associado à macro:

printf ("SERVER_SOFTARE= %s", SERVER_SOFTWARE);

obter-se-ia, no meu caso particular, em casa, onde utilizo como servidor o Microsoft IIS 5.0:

SERVER_SOFTWARE= Microsoft-IIS/5.0

As restantes macros declaradas no programa, servem para exactamente se consultar o valor das variáveis de ambiente:

#define SERVER_SOFTWARE getenv("SERVER_SOFTWARE")

#define SERVER_NAME getenv("SERVER_NAME")

#define GATEWAY_INTERFACE getenv("GATEWAY_INTERFACE")

#define SERVER_PROTOCOL getenv("SERVER_PROTOCOL")

#define SERVER_PORT getenv("SERVER_PORT")

#define REQUEST_METHOD getenv("REQUEST_METHOD")

#define PATH_INFO getenv("PATH_INFO")

#define PATH_TRANSLATED getenv("PATH_TRANSLATED")

#define SCRIPT_NAME getenv("SCRIPT_NAME")

#define QUERY_STRING getenv("QUERY_STRING")

#define REMOTE_HOST getenv("REMOTE_HOST")

#define REMOTE_ADDR getenv("REMOTE_ADDR")

#define AUTH_TYPE getenv("AUTH_TYPE")

#define REMOTE_USER getenv("REMOTE_USER")

#define REMOTE_IDENT getenv("REMOTE_IDENT")

#define CONTENT_TYPE getenv("CONTENT_TYPE")

#define CONTENT_LENGTH getenv("CONTENT_LENGTH")

Repare-se que a declaração de macros é algo meramente sintático, da responsabilidade do pré-processador de C e não do compilador de C.

Daqui para a frente só há que perceber que:

- no método GET são, acima de tudo, relevantes as variáveis CONTENT_LENGHT e QUERY_STRING;

- no método POST são, acima de tudo, relevantes a variável CONTENT_LENGHT e a stream de entrada por defeito (stdin, em C).


Assim, para arquivar a informação enviada por uma form, por GET, há que:

1) ler CONTENT_LENGHT

2) ler QUERY_STRING

3) arquivar QUERY_STRING numa variável de CONTENT_LENGHT +1 bytes; o byte extra é uma exigência da linguagem C, que termina todas as strings com o caracter NULL ('\0').


Para arquivar a informação enviada por uma form, por POST, há que:

1) ler CONTENT_LENGHT

2) ler stdin

3) arquivar os bytes (caracteres) presentes em stdin, numa variável de CONTENT_LENGHT + 1 bytes. Mais uma vez, o byte extra é uma exigência da linguagem C, que termina todas as strings com o caracter NULL ('\0').


Concretizando em C, para o caso de POST:

1)

int tamanho_da_mensagem=atoi(CONTENT_LENGTH);

2+3)

char *frase_da_form=malloc (sizeof (char) * (tamanho_da_mensagem+1));

fread (frase_da_form, sizeof(char), tamanho_da_mensagem, stdin);


As forms e código a serem utilizados no tutorial estão disponíveis num ficheiro [ZIP de 72 KB], contendo o código C de funções capazes de fazer a aceitação de qualquer form, por POST e GET; binários CGI para win32; e forms capazes de comunicar com os binários CGI, desde que esteja disponível um servidor, claro.

Como é que se põe a funcionar este código? Como fazer uso dele na práctica? Quer servidor usar? Como usá-lo? Estas respostas serão o assunto da terceira e última parte deste primeiro tutorial em CGI.

Para que haja serviços, o "default web site" tem de estar activo.

Faça "start" ao serviço, caso este não esteja activo. Mais sobre estes assunto, na última parte deste tutorial introdutório ao CGI, em C.