HTTP protokolo principai

Informacijos šaltiniai:

Duomenų srautai

  • Klasikinis variantas
    1. Klientas (kairėje) užmezga ryšį su Serveriu (dešinėje)
    2. Klientas išsiunčia užklausą, kokio dokumento jam reikia
    3. Serveris siunčia atsakymą
    4. Uždaromas sujungimas
  • Keep-Alive rėžimas
    1. Klientas (kairėje) užmezga ryšį su Serveriu (dešinėje)
    2. Klientas išsiunčia užklausą, kokio dokumento jam reikia. Užklausoje pasakoma, kad laukiama, jog norima, kad tai būtų keep-alive sujungimas.
    3. Serveris siunčia atsakymą. Serveris GALI (bet neprivalo) įterpti į antraštę parametrą, kuris sako, kad serveris pasiruošęs dirbti keep-alive rėžime.
    4. Jei patvirtinmas apie pasiruošimą dirbti keep-alive rėžime gautas, klientas gali siųsti kitas užklausas. Tuo atveju serveris vieną po kito duos reikalingus dokumentus.
    5. Iniciatyvą uždaryti ryšį gali duoti tiek serveris, tiek klientas

    Į serverį siunčiama užklausa

    Formatas
            Metodas Dokumentas Protokolas
    	Parametras_1 : Reikšmė_1
    	...
    	Parametras_N : Reikšmė_N
    	Tuščia eilutė
    	Duomenys
    Pavyzdys 1
    POST /~kaspar/exam.cgi HTTP/1.0
    Host: www.soften.ktu.lt
    
    student=Jonas&mark=8
    Pavyzdys 2
    GET http://www.soften.ktu.lt/~kaspar/result.cgi?student=Jonas&lab=3 HTTP/1.0
    If-Modified-Since: Sat, 24 Sep 1998 9:50:00 MET DST
    
    
    Metodai:
    GET - Gauti dokumento tekstą (turinį).
    HEAD - Analogiškas GET tačiau pagal šią užklausą yra siunčiama tik atsakymo antraštė, o past dokumento tekstas nesiunčimas.
    POST - Naudotinas dokumentų ar kitokios informacijos perdavimui į serverį, kad ši informacija būtų išsaugota serveryje ar panaudota kažkokiam kitokiam duomenų pakeitimui. Dėl šios priežasties POST tipo užklausos nėra kešuojamos.
    Pastabos dėl metodų pasirinkimo
    Standartas reikalauja, kad serveris galėtų apdoroti antraštės eilutes, kurios yra iki 8096 simbolių ilgio. Dėl to GET tipo užklausos netinka ten, kur reikia perduoti daug duomenų (serveris gali nesugebėti apdoroti tokio kiekio). HEAD tipo užklausos galėtų būti naudojamos ten, kur reikia patikrinti, ar toks dokumentas yra, tačiau jo kodas mūsų nedomina (tarkime, serverio monitorinimo programoje).
    Pagrindiniai užklausų parametrai
    Host: serverio_vardas - naudojama nusakyti, kurio [virtualaus] serverio duomenų reikia
    Authorization : užkoduotas vardas ir slaptažodis - naudojamas perduoti vartotojo vardą ir slaptažodį, jei tokie reikalingi, norint prieiti prie tam tikrų duomenų
    Content-Type : tipas - nusako, kokio tipo yra perduodami duomenys, kad klientas žinotų, kaip juos apdoroti
    Content-Encoding : koduotė -
    Content-Length : dokumento_dydis - perduodamo dokumento dydis. Būtinas parametras POST tipo užklausose
    If-Modified-Since : laikas - naudojamas GET tipo užklausose norint išvengi pakartotino dokumento siuntimo, jei jis nepasikeitė nuo paskutinės kopijos pasiėmimo momento
    Referer : Dokumentas - Dokumentas, kuriame buvo nuoroda į šį dokumentą
    User-Agent : Kliento_programinės_įrangos_pavadinimas

    Iš serverio gaunamas atsakymas

    Formatas
            Protokolas Statusas Žmogui_suprantamas_paaiškinimas
    	Parametras_1 : Reikšmė_1
    	...
    	Parametras_N : Reikšmė_N
    	Tuščia eilutė
    	Duomenys
    Pavyzdys
    HTTP/1.1 404 File Not Found
    Date: Sat, 24 Oct 1998 07:34:01 GMT
    Server: Apache/1.2.6
    Connection: close
    Content-Type: text/html
    
    <HTML><HEAD>
    <TITLE>404 File Not Found</TITLE>
    </HEAD><BODY>
    <H1>File Not Found</H1>
    The requested URL /nera was not found on this server.<P>
    </BODY></HTML>
    
    Statusai:
    Pagrindiniai atsakymų parametrai
    Content-Type : tipas - nusako, kokio tipo yra perduodami duomenys, kad klientas žinotų, kaip juos apdoroti
    Content-Encoding : koduotė -
    Content-Length : dokumento_dydis - perduodamo dokumento dydis.
    Date : laikas - Dokumento išsiuntimo momentas
    Expires : laikas - Laikas, kai dokumentas nustoja galioti ir reikia pasiimti atnaujintą kopiją
    Last-Modified : laikas - Laikas, kuriuo pagal serverio logika dokuemtas buvo paskutinį karta modifikuotas
    Location : vieta - Nauja vieta (URL), kur šiuo metu yra reikalingas dokumentas
    Pragma : no-cache | išplėtimo_raktažodžiai - Papildomos informacijos perdavimas. no-cache nurodo, kad dokumentas neturėtų būti kešuojamas
    Server : Serverio_programinės_įrangos_pavadinimas
    WWW-Autenticate : Nurodymas_kaip_reikia_autentikuotis

    CGI principai

    Iššifravimas
    Common Gateway Interface
    Duomenų srautai
    1. Serveris gauna užklausą
    2. Nustatoma, kad rezutatą turi sukurti CGI programa. Sukuriama aplinka tai programai vykdyti
    3. Paleidžiama pati programa
    4. Jos standartinis išvedimas yra perduodamas serveriui
    5. Jei išvedimas buvo pagal CGI standartą, pridedami papildomi Ataskymo Antraštės laukai ir siunčiami užklausėjui; jei ne pagal tai - įrašoma į serverio žurnalą ir duodamas atsakymas - "Vidinė serverio klaida"
    Aplinkos kintamieji
    Atsakymo formatas
    	Status: Statuso_kodas
    	HTTP_atsakymo_parametrų_eilutė_1
    	...
    	HTTP_atsakymo_parametrų_eilutė_N
    	Tuščia eilutė
    	Dokumento tekstas
    Pastabos formatui
    Jei reikia, kad klientui būtų grąžintas 200 OK kodas - pirma eilutė yra nebūtina
    Atsakyme būtinai turi būti bent Content-Type parametras
    Pavyzdys 1
    	Content-Type: text/html
    
    	Valio! Mano CGI-skriptas veikia!!!!
    
    Pavyzdys 2
    	Status: 302 Perkelta laikinai
    	Content-Type: text/html
    	Location: http://www.soften.ktu.lt/~draugas/skriptas.cgi
    
    	Pas jį šitai darosi geriau :-)
    Parametrų kodavimas
    GET tipo užklausose parametrai nuo skripto yra atskiriami klaustuko ? simboliu
    parametrai vienas nuo kito skiriami ampersendo & simboliu
    parametrą sudaro vardas=reikšmė
    jei parametre yra specialiųjų simbolių jie turi (o visi kiti simboliai gali) būti pakeisti į jų kodą. Prieš kodą rašomas procento ženklas %, o po jo seka 2 šešioliktainiai skaitmenys. Taigi, reišmė "perl ir cgi" būtų koduojama "perl%20ir%20cgi"