HTTP
HTTPS
Basis
Børre Stenseth

HTTP

Hva

HTTP er den underliggende protokollen som dominerer transport av dokumenter mellom klienter og tjenere på Internett. Vi vet at vi skriver: "http://" som start på en URL. Det vi da gjør er å angi hvilken protokoll som skal brukes. Dersom vi utelater protokollen, antar de fleste nettlesere HTTP som default. HTTP beskriver hvordan meldinger skal kodes og HTTP beskriver hva slags kommandoer, forspørsler, som skal kunne betjenes.

Hensikten med denne modulen er å trekke fram de mest sentrale delene av HTTP og hvordan vi forholder oss til dem når vi lager løsninger som innebærer kommunikasjon mellom en klient og en tjener. Vi tenker oss hele tiden at vi har en klient som sender forespørsler til en tjener som i sin tur forsøker å svare. Svaret er ofte oversendelse av en fil, men det som kommer tilbake kan også være produsert av et program.

HTTP protokollen finnes i to versjoner, HTTP 1.0 og HTTP 1.1. Denne modulen er skrevet for å få fram de viktigste komponentene og er ikke versjonsavhengig ut over de kommentarene der versjonen nevnes.

Det finnes flere hendige on-line verktøy for å inspisere hva som går fram og tilbake i en HTTP-dialog. To av dem er er Toolsvoid [1] og HTTP-sniffer [2]

Merk at sikker, avlyttingsfri kommunikasjon forutsetter at den skjer kryptert. Serveren vi bruker må være satt opp for slik kryptering. Da kan vi nente siden med HTTPS. HTTPS er ikke en egen protokoll men det involveres en kryptering av innholdet. Vi kan da bruke HTTPS i stedet for HTTP i adressen. HTTPS er godt forklart på Wikipedia [3] . I skrivende stund er det slik at vi kan gå mellom http-refererte sider og https-refererte sider, men nettleserne aksepterer som hovedregel ikke at vi henter ikke-kryptert (http) materiale inn til kryptert (https) side.

HTTP er tilstandsløs. Det vil si at hver melding som går mellom klient og tjener er historieløs. De to partene husker ikke at de har snakket sammen før. Dette er grunnen til at vi må ivareta sesjoner, lengre "samtaler", med spesielle tiltak som cookies, localstorage (i HTML5), skjulte felt eller programmering av tiltak på tjeneren.

HTTP beskriver et antall forespørsler som skal kunne betjenes. De viktigste er:

  • GET
  • POST
  • HEAD

Vi ser nærmere på en forspørsel - svar situasjon basert på GET, og kommenterer de andre etterpå.

GET

En forespørsel

En melding, forspørsel eller svar, har denne generelle formen:

startlinje
header (ingen, en eller flere header-linjer)
en blank linje
body (meldingsinnholdet, kan være tomt)

Vi ser først på en forespørsel, en henvendelse fra klienten til tjeneren. Den kan se slik ut:

GET /web/basis/http/index.html HTTP/1.1
Host: borres.hiof.no

Startlinja angir metoden (GET), en filpath på tjeneren (/web/basis/http/) en ressurs som i dette tilfettel er en fil (index.html) og endelig protokollen (HTTP/1.1). Så har vi en headerlinje som er av den foreskrevne typen, navn: value, som beskriver tjeneren. Vi avslutter med en blank linje og har ingen body-del. Dette kan vi betrakte som en minimalistisk løsning for å få hentet den siden du ser på nå fra en tjener til en nettleser. Nettleserne er programmert til å sende mer informasjon som headere enn det som er vist ovenfor. Hvis vi bruker en "snifferen" som er referert nedenfor viser det seg at følgende sendes fra Mozilla Firefox når denne siden etterspørres:

GET /wep/basis/http/index.html HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: borres.hiof.no
Accept: */*
Connection: close
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
Accept-Language: en-gb,en;q=0.5
Cache-Control: no-cache
Referer: http://www.toolsvoid.com/

Uten å ta for oss alle detaljene så ser vi at netteleseren presenterer seg selv (User-Agent), hvilken side vi spør fra (Referer).

Et svar

Serverens svar på en slik forespørsel følger samme mønster: startlinje, headerlinjer, blank linje, body. I dette tilfellet er selve siden, den ressursen vi spør etter, body. Hvis vi bruker snifferen finner vi ut at svaret er slik:

HTTP/1.1 200 OK
Date: Thu, 20 Nov 2014 06:41:28 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Thu, 20 Nov 2014 06:11:04 GMT
ETag: "c48b7-5328-50844317433d3"
Accept-Ranges: bytes
Content-Length: 21288
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8

.. så kommer body som er selve vevsiden

Vi ser at serveren presenterer seg (Server), at den sier fra hvordan svaret er kodet (Content-Type) og vi ser i den første linja at den kvitterer med at dette gikk bra ( 200 OK). 200 er en standardisert kode, blandt mange andre, som sier noe om hvordan forespørselen forløp. OK er en tekslig utdyping av det samme.

GET et CGI-skript

Vi fortsetter å bruke GET som metode. Nå skal vi hente en ressurs som ikke er en fil. Vi skal referere til et CGI-skript i Python, og vi skal sende med en parameter, slik:

https://borres.hiof.no/wep/basis/hp/pscript.py?message=Hallo

Forsøk å kopiere linja ovenfor inn i nettleserens adressefelt.
Skriptet som kalles ser slik ut:

_pscript.py

Vi ser at vi har lagt til en parameter=verdi (message=Hallo) til selve URI'en. Den ressursen vi vil ha tak i er ikke en vanlig fil som tjeneren skal returnere. Det er et program, et CGI-skript, som skal kjøres. Arbeidsdelingen mellom tjener og skript krever noen kommentarer. Tjeneren må først tolke den URI'en den får og skille ut selve filadressen fra parameterdelen. Tjeneren åpner fila og finner den første linja i skriptet:
#! /usr/bin/python
I følge oppsettet på en Linux-tjener tolkes dette slik at fila skal kjøres av den applikasjonen som er angitt: /usr/bin/python. Serveren starter Python, Python interpreterer vårt skript og finner informasjon hos tjeneren om det følger med en parameter verdi.

Så er det opp til skriptet å produsere et svar på forespørselen. Skriptet produserer headeren content-type og body. Det vil si at noen av headerene produseres av tjeneren. Hvis vi bruker snifferen, ser det slik ut:

GET /wep/basis/http/pscript.py?message=Hallo HTTP/1.1
User-Agent: Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: borres.hiof.no
Accept: */*
Connection: close
Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7
Accept-Language: en-gb,en;q=0.5
Cache-Control: no-cache
Referer: http://www.toolsvoid.com/]

Svaret på denne forespørselen ser slik ut:

HTTP/1.1 200 OK
Date: Thu, 20 Nov 2014 06:45:41 GMT
Server: Apache/2.2.22 (Debian)
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8"/>    
    <title>forms-demo</title>
    </head>
    <body>
        <p>Serverskriptet har mottatt:</p>
        <h2>message: Hallo</h2>
        <p><a href="javascript:history.back()">Tilbake</a></p>
    </body>
</html>

HEAD

HEAD ghør i prinsipp det samme som GET, men returnerer bare headerinformasjon. Dette kan være nyttig hvis vi bare er interesserte i om en ressurs finnes eller når den er oppdatert.

POST

POST skiller seg fra GET på den måten at forespørselen har en body-del som ikke er tom. Vi kan overføre data til tjeneren i body i stedet for å hekte på parametere til URI'en slik vi gjør med GET. GET har den ulempen i forhold til POST at det er begrenset med data vi kan sende som parametere, og parameterne synes i nettleserens adressefelt. Når vi lager nettsider som skal kommunisere med en tjener gjør vi som regel det enten ved å bruke forms eller via AJAX. I begge tilfellene kan vi velge om vi vil bruke GET eller POST som metode.

Diagnoser

Den første linja vi får tilbake på en forespørsel inneholder en angivelse av hvordan forespørselen gikk, f.eks: HTTP/1.1 200 OK. Det finnes en rekke standardisert koder som hjelper oss å tolke resultatet. Noen av de vanligste er:

200 OK Alt vel
404 Not Found Ressursen finnes ikke
500 Server Error Tjeneren feiler i å respondere på forespørselen. Typisk når et CGI-skript feiler

Du finner en komplett liste på definisjonen av HTTP/1.1, se referanser.

Andre protokoller

Det ligger utenfor dette materialet å gå nærmere inn på ulike lag av protokoller for transport av data på internettet. Det er imidlertid en rekke protokoller på øverste nivå i tillegg til HTTP. De mest kjente er vel FTP (file Transfer Protocol), SOAP (Simple Object Access Protocol,), SSH (Secure Shell) og Telnet. Du finner en inngangsnøkkel til disse på Wikipeadia [4] .

[5]
Referanser
  1. URL Content Dump Toolsvoid www.toolsvoid.com/url-dump 14-11-2014
  1. HTTP -sniffer TestURI.org testuri.org/sniffer 14-11-2014
  1. HTTPS Wikipedia no.wikipedia.org/wiki/HTTPS 14-11-2014
  1. Hypertext Transfer Protocol Wikipedia en.wikipedia.org/wiki/Hypertext_Transfer_Protocol 14-11-2014
  1. HTTP Made Really Easy James Marshall www.jmarshall.com/easy/http/ 14-11-2014