C/C++ / CGI / Sieć Novell / PHP / Java / SQL / Oracle / WebSphere MQ / WebSphere Message Broker / JavaScript / Humor / IT Quiz

Programowanie CGI

Informacje podstawowe

Bezpieczeństwo :
CGI - Co to jest ?
Dane wejściowe
Dynamiczna grafika
Kodowanie CGI
Komunikacja klient/serwer
Konfiguracja CGI
Konfiguracja SSI
Metoda GET
Metoda POST
Nagłówki
Polecenia SSI
Przykładowe skrypty
Status HTTP
Typy MIME (część)
Zmienne CGI

Literatura


Jeden plik


Legenda

w przygotowaniu
* w trakcie tworzenia


Język C/C++


Informacje podstawowe o CGI

W dużym skrócie skrypty CGI są to specjalne programy uruchamiające sie na serwerze , a których wywołąnie umieszcza się na stronach WWW jako zwykły odsyłacz lub wyjście formularza.Przykładem może tu być "Książka gość", np. ta, która się znajduje na tej stronie, gdzie po kliknięciu na odpowiedni odsyłacz uruchomiony zostaje skrypt CGI, który na standardowe wyjście wysyła kod HTML strony. Drugim przykładem może tu być typowa bramka pocztowa. Klient wypełnia dokładnie formularz, następnie po wysłaniu wypełnionego formularza na serwer odpowiedni skrypt CGI przetwarza wprowadzone dane i wg nich wysyła maila pod wskazany adres.

Pierwszym problemem z jakim się spotyka początkowy programista skryptów CGI, jest odczyt parametrów wywołania skryptu. Wszystkie dane do serwera są wysyłane za pomocą dwóch metod :
GET
POST
Pierwsza z nich dołącza dane bezpośrednio do adresu URL skryptu, druga wysyła dane na bezpośrednie wyjście.
Warto tu zauważyć, że dane te przed wysłaniem są specjalnie kodowane.

Pobranie danych wejściowych

Przy metodzie GET : Najprostszy sposób to zachowanie w odpowiednim łańcuchu tekstowym zmiennej środowiskowej QUERY_STRING.

//łańcuch zawierający zmienną środowiskową QUERY_STRING
#define QUERY_STRING getenv("QUERY_STRING")
void main()
{
...
printf("%s\n",QUERY_STRING);
...
}

Przy metodzie POST : Należy sprawdzić zmienną środowiskową CONTENT_LENGTH. Jeśli będziemy mieli do czynienia z metodą POST zmienna ta będzie zawierała długość danych wejściowych, w przeciwnym przypadku wartość NULL

//łańcuch zawierający zmienną środowiskową CONTENT_LENGTH
#define CONTENT_LENGTH getenv("CONTENT_LENGTH")
void main()
{
char *data
unsigned int content_length_int
...
//jeśli to metoda POST
if ( CONTENT_LENGTH != NULL )
{
//do zmiennej content_length_int zapisz wartość zmiennej środowiskowowej CONTENT_LENGTH
content_length_int = atoi ( CONTENT_LENGTH );
//zarezerwuj pamięć dla danych wejściowych
data = ( char * ) malloc (sizeof ( char ) * content_length_int + 1 );
//czytaj ze standardowego wejścia
if ( fread ( data , sizeof ( char ) , content_length_int , stdin ) != content_length_int)
printf("Błąd podczas czytania ze standardowego wejścia\n");
}
//zakończ łańcuch znakiem '\0'
data [ content_length_int ] = '\0';
...
//zwolnij pamięć
free ( data )
}

Kodowanie CGI

Wszystkie dane wysyłane do skryptu CGI są specjalnie kodowane.
Kodowanie to wygląda następująco
Dane podzielone są na grupy tj. nazwa pola i jego wartość. Poszczególne grupy oddzielone są znakiem '&', a nazwę pola i jego wartość rozdziela znak '='. Wszystkie spacje zastąpione są znakiem '+', a znaki niestandardowe znakiem '%' oraz dwucyfrowym kodem tego znaku.
Poszczególne fazy odkodowania danych wejściowych dla skryptu przebiegają następująco
Wyizolowanie interesującej grupy lub wszystkich par "nazwa=wartość"Rozdzielenie nazwy i wartości z grupyOdkodowanie wszystkich znaków niestandardowych, tj. zastąpienie znaku '%' oraz następującego po nim dwucyfrowego kodu znakiem o tym kodzie.
Przykład
Skrypt na wejściu otrzymuje dane w postaci : Imie=Marcin&Nazwisko=Kasi%F1ski
Faza 1 : rozdzielenie poszczególnych par
Faza 2 : rozbicie pary na jej nazwę i wartość
Faza 3 : odkodowanie wszystkich znaków niestandardowych
Faza 4 : zapisanie tak przygotowanych danych do odpowiedniej
struktury

Struktura do przechowywania danych wejściowych skryptu CGI

Struktura ta może wyglądać następująco :

struct cgi_input
{
//nazwa
char *name;
//wartość
char *value;
};

Deklaracja struktury (wersja statyczna) :

cgi_input cgi_in[10]

Deklaracja struktury (wersja dynamiczna) :

...
cgi_input *cgi_in
...
//zarezerwuj n bajtów dla danych wejściowych
if ((cgi_in = (cgi_input *) malloc(n)) == NULL)
{
printf("Za mało pamięci\n");
exit(1);
}
...
//zwolnij pamięć
free(cgi_in);
...

Komunikacja klient/serwer

Komunikacja pomiędzy klientem WWW ( np. przeglądarką ), a serwerem WWW odbywa się zapomocą protokołu HTTP. Transakcję pomiędzy klientem, a serwerem możemy podzielić naposzczególne etapy wg poniższego schematu:

Utworzenie połączenia pomiędzy klientem a serwerem.
Wysłanie żądania konkretnego zasobu przez klienta.
Wysłanie odpowiedzi przez serwer do klienta.
Zamknięcie połączenia pomiędzy klientem a serwerem.

Utworzenie połączenia pomiędzy klientem a serwerem.

Utworzenie połączenia pomiędzy klientem a serwerem dokonuje się poprzez połączenie sięz konkretnym protokołem, w tym wypadku HTTP. Polega to na połączeniu się z programem serwera poprzez odpowiedni port (standardowo dla protokołu HTTP jest to port 80).Dla sprawdzenia możemy się tu posłużyć programem telnet, np:
telnet gss.abis.lodz.pl 80

Źądanie konkretnego zasobu przez klienta.

Klient aby móc otrzymać określony zasób od serwera musi do niego wysłać żądanie w określonymformacie zrozumiałym dla serwera.
Ogólny format żądania ma postać:
POLECENIE lokalizacja wersja protokołu
Ewentualne nagłówki
linia pusta
Ewentualne dane przesyłane do serwera


POLECENIE : Określa typ żądania, gdzie najważniejsze z nich to:
GET
HEAD
POST
lokalizacja : umiejscowienie żądanego zasobu na serwerze np. /info.htm
wersja protokołu : np. HTTP/1.0
Ewentualne nagłówki : dodatkowe informacje dołączane do żądania w formacie Nagłówek: paramertr/y
Ewentualne dane : najczęściej dane przesyłane do skryptu z formularza za pomocą metody POST.

Przykładowe żądania


Metoda GET protokołu HTTP

Jest to metoda nie wymagająca żadnych dodatkowych danych, żąda ona pobrania z serwera określonego pliku, np.:
GET /info.ktm HTTP/1.0 : żąda pobrania z serwera pliku /info.htm za pomocą protokołu HTTP w wersji 1.0.
GET / HTTP/1.0 : żąda pobrania z serwera dokumentu głównego.
GET /script.cgi?data1=12&data2=34 HTTP/1.0 : żąda pobrania z serwera wyniku uruchomienia skryptu /script.cgi, którego dane określiliśmy na : data1=12&data2=34. Taki sam wynik da nam w przeglądarce wypełnienie formularza z danymi jak wyżej i wysłanie go do skryptu za pomocą metody GET.

Metoda HEAD protokołu HTTP

Jest to metoda diagnostyczna. Pobiera ona z serwera tylko i wyłącznie informacje nagłówkowe bez pobrania samego dokumentu. Metoda ta jest stosowana najczęściej w programach sprawdzających poprawność odnośników hipertekstowych w dokumentach WWW.

Przykład:

HEAD /info.ktm HTTP/1.0 : żąda pobrania z serwera informacji o pliku /info.htm za pomocą protokołu HTTP w wersji 1.0.
HEAD / HTTP/1.0 : żąda pobrania z serwera informacji o dokumencie głównym.

Metoda POST protokołu HTTP

Metoda POST jest stosowana przy żądaniach zasobu wyjścia skryptu CGI poprzez formularz WWW.W tej metodzie dodatkowe dane przesyłane do skryptu nie są dołączane do adresy URL, jak toma miejsce w metodzie GET, lecz przesyłane są za pomocą standardowego wyjścia.Należy tu zwrócić uwagę, iż przy metodzie POST konieczne jest występowanie nagłówkaContent-length: len, gdzie len jest długością bloku danych przesyłanych doskryptu. Wszystkie pozostałe nagłówki są opcjonalne i teoretycznie mogą nie występować.

Przykład:

POST /post/post.cgi HTTP/1.0
Content-length: 30
pusta linia
FROM=11&TO=22&TITLE=33&Text=44

Nagłówki żądania protokołu HTTP

Lista najczęściej używanych nagłówków żądania:

Accept : akceptowane typy MIME przez klienta.
Accept-Encoding : akceptowane metody kompresji.
Accept-Language : akceptowane język w postaci skrótu.
Allow : uzgadnia metodę dostępu do dokumentu.
Authorization : metoda kodowania oraz użytkownik i hasło.
Content-Enciding : metoda kompresji danych.
Content-Length : długość danych wysyłanych przez klienta za pomocą metody POST.
Content-Type : typ przesyłanych danych.
Extension-Header : definiuje dodatkowy nagłówek.
From : adres e-mail klienta. Najczęściej adres twórcy etycznego robota skanującego serwer.
If-Modified-Since : żądanie pobrania zasobu, który nie został zmieniony po dacie zgodnej z protokołem HTTP podanej jako parametr.
MIME-version : wersja protokołu MIME.
Pragma : specjalne dyrektywy dla serwera.
Referer : adres URI, zawierający żądany odnośnik.
User-Agent : nazwa klienta (przeglądarka, robot itp. ).

Przykładowe żądania HTTP

Poniżej przedstawiam kilka przykładów żądań, a ich analizę pozostawiam innym w oparciu oinformacje umieszczone w tym kursie.

Źądanie głównego dokumentu za pomocą metody GET

GET / HTTP/1.0
Host: gss.abis.lodz.pl
Accept: text/html, text/plain, application/applefile, application/x-metamail-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file, x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2
Accept: application/postscript, message/external-body, message/partial, application/pgp, application/pgp, video/mpeg, video/*, image/*, audio/mod, text/sgml, */*;q=0.01
Accept-Encoding: gzip, compress
Accept-Language: en
Negotiate: trans
User-Agent: Lynx/2.8.1rel.2 libwww-FM/2.14
pusta linia

Źądanie wyjścia skryptu CGI za pomocą metody POST

POST /post/post.cgi HTTP/1.0
Host: gss.abis.lodz.pl
Accept: text/html, text/plain, application/applefile, application/x-metamail-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file, x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2
Accept: application/postscript, message/external-body, message/partial, application/pgp, application/pgp, video/mpeg, video/*, image/*, audio/mod, text/sgml, */*;q=0.01
Accept-Encoding: gzip, compress
Accept-Language: en
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Lynx/2.8.1rel.2 libwww-FM/2.14
Referer: http://gss.abis.lodz.pl/post/post.htm
Content-type: application/x-www-form-urlencoded
Content-length: 30
pusta linia
FROM=11&TO=22&TITLE=33&Text=44

Źądanie wyjścia skryptu CGI za pomocą metody GET

GET /cgi/script.cgi?data1=11&data2=22 HTTP/1.0
Host: gss.abis.lodz.pl
Accept: text/html, text/plain, application/applefile, application/x-metamail-patch, sun-deskset-message, mail-file, default, postscript-file, audio-file, x-sun-attachment, text/enriched, text/richtext, application/andrew-inset, x-be2
Accept: application/postscript, message/external-body, message/partial, application/pgp, application/pgp, video/mpeg, video/*, image/*, audio/mod, text/sgml, */*;q=0.01
Accept-Encoding: gzip, compress
Accept-Language: en
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Lynx/2.8.1rel.2 libwww-FM/2.14
Referer: http://gss.abis.lodz.pl/post/post.htm
Content-type: application/x-www-form-urlencoded
pusta linia


Odpowiedź serwera.

Ogólny format odpowiedzi serwera na określone żądanie ma postać:
wersja protokołu stan odpowiedzi komunikat
Ewentualne nagłówki
linia pusta
Przesłany dokument


wersja protokołu : np. HTTP/1.0
stan odpowiedzi : liczba określająca czy żądanie zakończyło się sukcesem, czy pojawiły się jakieś problemy
komunikat : dowolny łańcuch tekstowy będący uzupełnieniem stanu odpowiedzi, np. Internal Server Error lub Internal Server Error
Ewentualne nagłówki : dodatkowe informacje dołączane do odpowiedzi w formacie Nagłówek: paramertr/y

Przykładowe odpowiedzi


Nagłówki odpowiedzi serwera protokołu HTTP

Lista najczęściej używanych nagłówków odpowiedzi:

Allow : uzgadnia metodę dostępu do dokumentu.
Content-Enciding : metoda kompresji danych.
Content-Length : długość danych wysyłanych przez klienta za pomocą metody POST.
Content-Type : typ przesyłanych danych.
Date : data zgodna z protokołem HTTP.
Expires : data ważności dokumentu, po której klient nie powinien dokument pobierać w postaci kopii, lecz bezpośrednio z serwera.
Extension-Header : definiuje dodatkowy nagłówek.
Last-Modified : data ostatniej modyfikacji dokumentu.
Location : pełny adres dokumentu.
Server : nazwa serwera i system na jakim on pracuje.
WWW-Authenticate : odpowiedź na żądanie 401 informujące o potrzebie autoryzacji.

Przykładowe odpowiedzi serwera HTTP

Poniżej przedstawiam kilka przykładów odpowiedzi serwera.

odpowiedź zakończona sukcesem

HTTP/1.1 200 OK
Date: Sun, 12 Dec 1999 12:42:27 GMT
Server: Apache/1.3.6 (Unix) (Red Hat/Linux)
Last-Modified: Wed, 07 Apr 1999 21:17:54 GMT
ETag: "97a0-799-370bcb82"
Accept-Ranges: bytes
Content-Length: 1945
Connection: close
Content-Type: text/html

< HTML > < head > < title > Moja strona HTML < /title > < /head >
< FRAMESET COLS="25%,*" >
< FRAME NAME="left" SRC="left.htm" NORESIZE MARGINHEIGHT="2" MARGINWIDTH="2" >
< FRAME NAME="right" SRC="right.htm" NORESIZE >
< /FRAMESET > < /HTML >

odpowiedź informująca o błędzie

HTTP/1.1 500 Internal Server Error
Date: Sun, 12 Dec 1999 12:43:57 GMT
Server: Apache/1.3.6 (Unix) (Red Hat/Linux)
Connection: close
Content-Type: text/html

< HTML > < head > < title > Błąd < /title > < /head >
< BODY >
< center > Nastąpił błąd pracy serwera. Skontaktuj się z Webmasterem!!!
< /BODY > < /HTML >

Konfiguracja serwera dla CGI

Dotyczy serwera Apache.
Ustawienie katalogu, którego wszystkie pliki będą traktowane jako skrypty CGI.
W tym celu w pliku konfiguracyjnym powinna znajdować się linia :
ScriptAlias wirtualny_katalog rzeczywisty_katalog
gdzie:
wirtualny_katalog : Wirtualna nazwa katalogu, do której będziemy mogli się odnosić uruchamiając skrypty CGI. Najczęściej wartość ta przybiera postać /cgi-bin/
rzeczywisty_katalog : Nazwa rzeczywistego katalogu znajdującego się na serwerze, gdzie są składowane skrypty CGI.
Przykład:
ScriptAlias /cgi-bin/ /usr/local/etc/http/cgi/
Ustawienie rozszerzenia plików będących skryptami CGI, co spowoduję że serwer plik o podanym rozszerzeniu potraktuje jako skrypt CGI.
W tym celu w pliku konfiguracyjnym powinna znajdować się linia, która tworzy odpowiedni typ MIME dla skryptów CGI:
AddType application/x-httpd-cgi .cgi
Następnie należy tak skonfigurować serwer, aby była możliwość uruchamiania skryptów CGI z dowolnego katalogu.
Option Indexes FollowSymLinks ExecCGI

Konfiguracja serwera dla SSI

Dotyczy serwera Apache.
Ustawienie rozszerzenia plików zawierających polecenia SSI.
Serwer przed wyprowadzeniem do przeglądarki plików o podanym rozszerzeniu wstępnie przeszuka je na okoliczność występowania w nich poleceń SSI.
W tym celu w pliku konfiguracyjnym powinna znajdować się linia :
AddType text/x-server-parsed-html .shtml
Należy również w pliku konfiguracyjnym umieścić linię :
Options Indexes FollowSymLinks
co spowoduje włączenie pełnej obsługi SSI.
lub:
Options IndexesNOEXEC FollowSymLinks
co spowoduje włączenie wszystkich poleceń SSI, z wyjątkiem polecenia exec uniemożliwiając w ten sposób uruchamianie za pomącą poleceń SSI skryptów CGI i poleceń systemowych.

Metoda GET

Metoda ta dołącza dane bezpośrednio do adresu URL skryptu. Ograniczeniem tej metody jest długość przesyłanych danych , która nie może pzrekroczyć z góry ustalonej wartośći. Wartością tą jest maksymalna długość zmiennej środowiskowej QUERY_STRING , gdzie zostaną skopiowane przesłane dane i którymi później poprzez tą zmienną będziemy mogli manipulować.

Przykłąd

< a href="/cgi-bin/skrypt.cgi?data1=abc&data2=def" > Wywołanie < /a >

gdzie:

"data1" i "data2" : parametry wywołania
"abc" i "def" : wartości tych parametrów

Zmienna QUERY_STRING przy takich parametrach będzie miała postać: data1=abc&data2=def

Metoda POST

Metoda ta wysyła dane na standordowe wyjście. Nie ma ona ograniczeń co do długości przesyłanych danych

Nagłówki

Typowe nagłówki wysyłane przeglądarki przez serwer to
Location: URL : Zmiana bieżącej strony WWW
Content-Type: MIME/typ : ustala typ danych wysyłanych do przeglądarki
Status: kod wiadomość : Ustawia programowo kod stanu serwera
Wysłanie odpowiedniego nagłówka może mieć postać :

printf("Location: /strona.html \r\n\r\n");

lub :

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

lub :

printf("Status: 401 Wiadomość \r\n\r\n");

Można również stosować dowolne połączenie powyższych nagłówków.

Polecenia SSI

Polecenia SSI są specyjalnymi poleceniami serwera, które można dołączać bezpośrednio do dokumentu HTML.Przed wysłaniem dokumentu do przeglądarki serwer przeszukuje go na okoliczność występowania w nim znaczników SSI.
<!-#polecenie znacznik="wartość"-> : Składnia polecenia SSI
config : Konfiguruje polecenia SSI:
<!-#config errmsg="Błąd polecenia SSI"-> : Komunikat o błędzie pojawiający się w przypadku błędów spowodowanych przez polecenia SSI.
<!-#config sizefmt="bytes"-> : Konfiguruje polecenie fsize do potwierdzania wielkości pliku
<!-#config timefmt="%A, %B %d, %Y"-> : Konfiguruje format łańcucha daty wyświetlany przy sprawdzaniu daty ostatniej modyfikacji pliku, w tym przpadku: nazwa dnia tygodnia, nazwa miesiąca, dzień miesiąca i rok
echo : Wyświetla specjalne zmienne środowiskowe SSI:
<!-#echo var="DOCUMENT_NAME"-> : Nazwa dokumentu zwracanego przez serwer
<!-#echo var="DOCUMENT_URL"-> : Adres URL dokumentu
<!-#echo var="QUERY_STRING_UNESCAPED"-> : Nie odkodowany QUERY_STRING
<!-#echo var="DATE_LOCAL"-> : Lokalna data
<!-#echo var="DATE_GMT"-> : Data wg. GMT
<!-#echo var="LAST_MODIFIED"-> : Data ostatniej modyfikacji dokumentu
exec : Dołącza wyjście skryptu CGI lub programu systemowego
<!-#exec cgi="/cgi-bin/search.cgi"-> : Dołącza wyjście skryptu CGI
<!-#exec cmd="/bin/date"-> : Dołącza wyjście programu systemowego
<!-#fsize file="plik"-> : Wyświetla wielkość pliku, parametry file i virtual jak w przypadku #include
<!-#flastmod file="plik"-> : Wyświetla datę ostatniej modyfikacji pliku, parametry file i virtual jak w przypadku #include
Include : Dołącza inny plik
<!-#include file="plik.htm"-> : Dołącza plik w odniesieniu do bieżącej ścieżki
<!-#include virtual="/plik.htm"-> : Dołącza plik w odniesieniu do głównego katalogu dokumentu

Przykładowe skrypty

W tej części postaram się przedstawić przykładowe funkcje, czy też pełne kodyźródłowe skryptów CGI.W miarę możliwości liczba przykładów będzie się zwiększać.

Banalny przykład pobierania danych przez skrypt

Banalny przykład pobierania danych przez skrypt

Opis
Skrypt ten pobiera dane umieszczone w zmiennej QUERY_STRING i wyświetla zawartość tej zmiennej.

Sposób wykorzystania

Kod żródłowy

#include <stdio.h>
#include <stdlib.h>
//QUERY_STRING zawiera dane wejściowe
#define QUERY_STRING getenv("QUERY_STRING")
void main(void)
{
//wysyła do klienta standardowy nagłówek informujący, że będzie przesyłał dokument html
printf("Content-type: text/html\n\n");
//przykładowa treść dokumentu
printf("< HTML > < HEAD > < META HTTP-EQUIV=\"Content-Type\" ");
printf(" CONTENT=\"text/html; charset=iso-8859-2\" > ");
printf("< TITLE > Przykład CGI < /TITLE > < /HEAD > ");
printf("< BODY Background=\"/images/bg/brown.jpg\" BGCOLOR=\"ffffff\" LINK=\"blue\" ALINK=\"brown\" VLINK=\"brown\" > ");
printf("< BR > < CENTER > ");
//wyświetla zmienną QUERY_STRING
if(QUERY_STRING==NULL) printf("Nie podałeś parametru\n");
else
printf("Zmienna < B > QUERY_STRING < /B > ma postać: < BR > %s",QUERY_STRING);
printf("< /BODY > < /HTML > ");
}

Banalny przykład pobierania danych przez skrypt

W celu przetestowania skryptu wprowadź dowolne dane do formularzy i wyślij je za pomocą przycisku.

< FORM METHOD="GET" ACTION="/cgi-bin/examples/example1.cgi" >

< INPUT NAME="POLE1" >
< INPUT NAME="POLE2" >
< TEXTAREA NAME="POLE3" > < /TEXTAREA >
< INPUT TYPE="submit" VALUE="prześlij dane" >

Status HTTP

Lista stanu odpowiedzi serwera na napływające żądania:

200 : Żądanie zakończyło się sukcesem i została wysłana właściwa odpowiedź
201 : Jeśli zasób lub plik został stworzony przez serwer, serwer wysyła kod stanu 201 wraz z lokacją nowego zasobu
202 : Żądanie zostało zaakceptowane, chociaż mogło nie zostać jeszcze przetworzone.
204 : Żądanie zakończyło się sukcesem, ale, z powodu braku treści, nic nie zostanie zwrócone
301 : Żądany dokument posiada nowy, stały adres URL. Nowa lokacja powinna zostać określona w nagłówku Location
302 : Żądany dokument został tymczasowo przeniesiony inne miejsce, określone w nagłówku Location
304 : Klient zażądał warunkowego GET (tj., jeżeli klient pobierze plik tylko wtedy, gdy uległ on modyfikacji po określonej dacie), a plik nie uległ modyfikacji
400 : Żądanie było nieprawidłowe i niemożliwe do odczytania. Status pojawia się w przeglądarkach posiadających wewnętrzne błędy
401 : Klient zażądał pliku, który wymaga weryfikacji tożsamości użytkownika.
403 : Serwer zrozumiał żądanie, ale odmawia jego realizacji. Dzieje się tak głównie wtedy, gdy serwer lub klient nie posiada praw dostępu do żądanego pliku
404 : Żądany dokument nie został odnaleziony
500 : W serwerze pojawił się jakiś wewnętrzny błąd, więc serwer nie może zrealizować żądania. Błąd ten pojawia się wtedy, gdy program CGI zawiera błędy lub wysyła nagłówki, których serwer nie jest w stanie przetworzyć
501 : Polecenie wysłane przez klienta nie jest obsługiwane przez serwer
502 : Serwer otrzymał nieprawidłową odpowiedź od innego serwera
503 : Serwer jest przeciążony i nie może obsłużyć dodatkowych żądań

Wysłanie odpowiedniego nagłówka statusu może mieć postać :


printf("Status 500 Błąd pracy serwera \r\n\r\n");


Odpowiedź serwera


Typy MIME

Text/plain : Czysty tekst, typ ustawiony domyślnie dla plików, których rozszerzenie serwer nie rozpozna
Text/html : Plik HTML
Image/gif : Plik graficzny w formacie gif
Image/jpeg : Plik graficzny w formacie jpg
Image/tiff : Plik graficzny w formacie tif
Audio/x-wav : Plik muzyczny w formacie wav
Video/mpeg : Skompresowany obraz wideo w formacie MPEG
Application/zip : Format kompresji zip
Application/msword : Dokument programu Microsoft Word

Dla przykładu : chcesz wysłać na przeglądarkę plik graficzny w formacie jpg.
W kodzie umieszczamy informacje co bedziemy wysyłać do przeglądarki

printf("Content-Type : Image/jpeg\r\n\r\n");

a następnie wysyłamy na standardowe wyjście odpowiedni plik graficzny

Zmienne środowiskowe CGI

AUTH_TYPE : wykorzystywany schemat identyfikacji (zazwyczaj Basic)
CONTENT_LENGTH : długość danych wejściowych przy korzystaniu z metody POST
CONTENT_TYPE : sposób kodowania danych
DOCUMENT_ROOT : główny katalog dokumentu na serwerze
GATEWAY_INTERFACE : wersja protokołu CGI
HTTP_ACCEPT : lista typów MIME akceptowanych przez przeglądarkę
HTTP_ACCEPT_LANGUAGE : lista języków obsługiwanych przez przeglądarkę
HTTP_COOKIE : wartości ciasteczek
HTTP_REFERER : URL, z którego nastąpiło przejście do bieżącej strony
HTTP_USER_AGENT : nazwa, wersja i platforma przeglądarki
PATH_INFO : dane dołączane do adresu URL po znaku ukośnika
PATH_TRANSLATED : ścieżka względem katalogu głównego dokumentu
REMOTE_ADDR : adres IP maszyny klienta
REMOTE_GROUP : nazwa grupy, jeśli było potwierdzenie
REMOTE_HOST : nazwa maszyny klienta
REMOTE_USER : imię użytkownika, jeli było potwierdzenie
REQUEST_METHOD : sposób przesyłania danych do serwera (GET lub POST)
QUERY_STRING : łańcuch znaków zawierający dane wejściowe dla skryptu CGI. Łańcuch dołączony do adresu URL po pytajniku
SCRIPT_NAME : nazwa skryptu CGI
SERVER_ADMIN : adres e-mail administratora serwera
SERVER_NAME : nazwa maszyny serwera ( host )
SERVER_PORT : port, na którym jest uruchomiony serwer (najczęściej 80)
SERVER_PROTOCOL : wersja protokołu HTTP
SERVER_SOFTWARE : nazwa oprogramowania serwera

Pobranie zmiennej środowiskowej może mieć postać :


#define QUERY_STRING getenv("QUERY_STRING")

lub np. :


char buffer[1024];
strcpy( buffer, getenv("QUERY_STRING"));

Literatura


"CGI - Programowanie CGI pzrewodnik" :

Eugene Eric Kim ISBN 83-87115-10-X LT&P


"Programowanie WWW" :

Kris Jamsa, Suleiman "Sam" Lalani, Steve Weakley ISBN 83-7158-055-X Mikom 1997


"Apache Przewodnik encyklopedyczny" :

Ben Laurie, Peter Laurie ISBN 83-7197-181-8 Helion 2000


Powrót


  Autorem serwisu jest Marcin Kasiński
Wszelkie prawa zastrzeżone. All rights reserved.
powered by technology... linux eclipse java php