Ik heb ooit ook nog eens zo'n opdracht moeten maken, dit is de tekst die wij gebruikt hebben:
Houd je klaar voor een hele lange post

:
Deel1:
HyperText Transfer Protocol (HTTP)
1. Inleiding
Het idee achter het HTTP-protocol waarmee clients en servers met elkaar praten, is ontwikkeld door mensen van het CERN (Europees Centrum voor Nuclair Onderzoek) in Geneve.
Toen zij hun onderzoek over het delen van documenten tussen computers hadden afgerond, gaven ze het project over aan een Amerikaanse Universiteit (NSCA).
2. Wat is HTTP?
HTTP (Hypertext Transfer Protocol) is een TCP/IP-applicatielaagprotocol en omvat regels of protocollen die zorgen dat webpagina’s via verschillende computers geraadpleegd kunnen worden. Dit gebeurt wanneer je een adres in de browser invoert of je op een link klikt. Het protocol is verdeeld in twee delen: de vraag van de client en het antwoord van de server.
3. Begrippen
Cliënt/server
De cliënt is het programma waarmee aan de server wordt bericht dat er een bepaald proces moet worden uitgevoerd, bijvoorbeeld het laten zien van een website.
De server is het programma dat het proces uitvoert. Op internet zoeken de gebruikers meestal met een cliënt op het eigen systeem, zoals de browser, naar een server die ergens op internet actief is.
Communicatie tussen beiden gebeurt via TCP/IP, wat het vorig trimester uitgebreid aan bod kwam.
Directory
Een website heeft op een computer of webserver altijd een eigen directory. In deze directory komen alle bestanden te staan die via internet opvraagbaar moeten zijn. Dat zijn dus de webpagina's (HTML bestanden), afbeeldingen die op de webpagina’s staan enz.
Verschillende benamingen kunnen onder andere “home directory”, “website directory”, “root”, “web root”, ... zijn.
HTTP-versies
We onderscheiden 2 versies HTTP: HTTP1.0 en het recentere (en betere) HTTP1.1
Er zijn 3 belangrijke verschillen:
- Er wordt één verbinding opengehouden om alles door te sturen, waar bij versie 1.0 voor alles afzonderlijk (afbeeldingen, tekst,...) een apparte verbinding wordt gemaakt met de server.
- Tekst kan gecomprimeerd worden, wat de snelheid bevordert.
- ...
4. Het tot stand brengen van een verbinding
Tenzij de gebruiker of de hyperlink het IP-adres van de server specifieert, is de eerste stap in het tot stand brengen van een verbinding tussen twee systemen het achterhalen van het adres door een name resolution-verzoek naar een DNS-server te versturen.
Met dit adres kan het IP-protocol verkeer naar de server dirigeren.
Als de cliënt dit adres eenmaal weet, zal deze een TCP-verbinding met poort 80 van de server maken.
Nu is de TCP-verbinding tot stand gekomen en kunnen browser en server HTTP-berichten uitwisselen. Deze berichten bestaan uit 2 berichttypes: HTTP-verzoeken en HTTP-aanvragen. Deze twee berichttypes kan je dan nog eens opsplitsen in de volgende elementen:
- start line: Bevat een verzoekopdracht of reply status indicator, en enkele variabelen.
- headers: Bevatten een serie velden met informatie over het bericht of het systeem waar het afkomstig van is.
- empty line: Een witregel die het einde van de header aangeeft.
- message body: bevat de inhoud die naar het andere systeem verzonden wordt.
5. HTTP-verzoeken
De beginregel van een HTTP-verzoek ziet er als volgt uit:
Request Type - Request URI - HTTP Versie
5.1 Request Type
Er zijn acht types van verzoekberichten of request types:
get; head; post; options; put; delete; trace; connect
We bespreken even de 2 belangrijkste:
GET: Het grootste deel van de HTTP-verzoeken bestaat uit dit type verzoek.
Dit bevat een verzoek naar informatie die in de request URI(zie verder) is gespecifieerd.
POST: Vraagt aan dat de informatie in de message body door het doelsysteem geaccepteerd wordt als ondergeschikt aan de bron die in de request URI is beschreven.
Request URI
Request URI is een variabele en bevat een Uniform Resource Identifier. Dit is een tekenreeks die specifiek verwijst naar een unieke bron op het doelsysteem. Deze variabele kan bijvoorbeeld de naam bevatten van een bestand op de webserver dat de cliënt van deze server wenst te ontvangen, of de naam van de directory waaruit de server dit bestand moet versturen. De variabele HTTPversion gaat na welke HTTP-versie door het systeem
ondersteund wordt.
Dus als je nu als gebruiker de naam van een website invoert in je browser, zal het verzoekbericht er als volgt uitzien:
GET / HTTP/1.1
De opdracht GET verzoekt de server een bestand te sturen. De “/” verwijst naar de directory van de website, zodat de webserver kan antwoorden door het standaardbestand uit zijn homedirectory door te sturen.
6. HTTP-antwoorden
De basiselementen van HTTP-antwoorden, gegenereerd door de webserver, bevatten veel dezelfde elementen als van de verzoeken. De beginregel bestaat uit:
HTTPVersion StatusCode StatusPhrase
HTTP Version: Verwijst naar de standaard die door de server wordt ondersteund.
Status Code/Status Phrase: Gaat na of de server het verzoek succesvol verwerkt heeft, met de nodige uitleg erbij. De code is een getal van 3 cijfers en de Status Phrase bestaat uit strings.
De codewaardes zijn gedefinieerd in de HTTP-specificatie en worden door alle webserveruitvoeringen eenduidig gebruikt. Het eerste cijfer van de code specifieert de algemene aard van het antwoord en de andere twee geven wat meer uitleg over de code.
Ook al wordt de status phrase eveneens gedefinieerd in de specificatie, bij sommige webserverproducten kan je de tekststring aanpassen om meer informatie aan de cliënt te verstrekken. We geven een overzicht van de codes en phrases:
6.1 Informational Codes (1xx)
Dit type bevat maar 1 code en wordt gebruikt in antwoorden zonder message body.
100-Continue
6.2 Successful Codes (2xx)
Geven aan dat het verzoek van de cliënt ontvangen, begrepen en geaccepteerd is.
200-OK; 201-Created; 202-Accepted; 203-Nonauthoritative Information;
204-No Content; 205-Reset Content; 206-Partial Content
6.3 Redirection Codes (3xx)
Geeft aan dat om een verzoek te kunnen verwerken, er een volgende handeling van de client nodig is.
300-Multiple Choices; 301-Moved Permanently; 302-Found; 303-See Other;
304-Not Modified; 305-Use Proxy; 306-Unused; 307-Temporary Redirect
6.4 Client Error Codes (4xx)
Door een fout van de client kan het verzoek niet worden verwerkt.
400-Bad Request; 401-Unauthorized; 402-Payment Required; 403-Forbidden;
404-Not Found; 405-Method Not Allowed; 406-Not Acceptable;
407-Proxy Authentication Required; 408-Request Timeout; 409-Conflict; 410-Gone;
411-Length Required; 412-Precondition Failed; 413-Required Entity Too Large;
414-Required URI Too Long; 415-Unsupported Media Type;
416-Requested Range Not Satisfiable; 417-Expectation Failed
6.5 Server Error Codes (5xx)
Een verzoek kon niet verwerkt worden door een fout bij de server.
500-Internal Server Error; 501-Not Implemented; 502-Bad Gateway;
503-Service Unavailable; 504-Gateway Timeout; 505-HTTP Version Noy Supported
7. HTTP-headers
Na de beginregel of start line kan elk HTTP-bericht eventueel een serie headers bevatten. Deze bestaan uit strings en worden op deze manier ingedeeld:
Fieldname: Fieldvalue
Fieldname: Deze variabele geeft het type informatie aan dat in de header opgenomen is.
Fieldvalue: Deze bevat de informatie zelf.
De verschillende headers leveren informatie over het systeem en het verzoek waar het bericht vandaan komt. Daar kan de server gebruik van maken als deze een antwoord samenstelt. De cliënt bepaalt zelf de keuze, het aantal en volgorde van de headers, maar de HTTP-specificatie raadt aan dat dit op basis van 4 categorieën wordt geordend.
We bespreken even de 4 mogelijke waarden voor de variabele Fieldname.
Uitleg bij de waarden vind je terug in de bijlagen.
7.1 Algemene headervelden
Deze headervelden zijn toepasbaar zowel voor de aanvragen als voor de verzoeken, maar niet voor het bestand of andere informatie in de body van het bericht (entity).
De waarden voor de algemene header Fieldname zijn:
Cache-Control; Connection; Date; Pragma; Trailer; Transfer-Encoding; Upgrade; Via, Warning
7.2 Request headervelden
Deze zijn alleen van toepassing op verzoekberichten en bevatten informatie over het verzoek en systeem waarvan dit afkomstig is. Waarden zijn:
Accept; Accept-Charset; Accept-Encoding; Accept-Language; Authorization; Expect; From; Host; If-Match; If-Modified-Since; If-None-match; If-Range; If-Unmodified-Since; Max-Forwards; Proxy-Authorization; Range; Refer; TE; User Agent
7.3 Response headervelden
Deze headers zijn alleen van toepassing op antwoordberichten en bevatten informatie over meldingen en de server die deze heeft gegenereed. De response header Fieldname kan volgende waarden bevatten:
Accept-Ranges; Age; Etag; Location; proxy-Authenticate; Retry-After; Server; Vary; WWW-Authenticate
7.4 Entity headervelden
Entity beschrijft gegevens van de message body van een antwoorden geeft aanvullende informatie over deze gegevens. Waarden kunnen zijn:
Allow; Content-Encoding; Content-Language; Content-Length; Content-Location; Content-MD5; Content-Range; Content-Type; Expires; Last-Modified; Extension-Header
8. Tot slot
De headersectie wordt door een witregel afgesloten en daarna volgt de body van het bericht. Dit bevat de inhoud van het bestand waar de client om gevraagd heeft. Als het bestand groter is dan de maximale inhoud van het pakket, dan genereert de server aanvullende antwoordberichten zonder headers, alleen message bodies.
Request Types
Get: Bevat een verzoek om informatie die in de Request URI gespecifieerd is. Het grootste deel van de verzoekberichten betreft dit type verzoeken.
Head: Functioneel identiek aan het Get-verzoek, behalve dat het antwoord alleen een start line en headers bevat, geen message body.
Post: Vraagt aan dat de informatie in de message body door het doelsysteem geaccepteerd wordt als ondergeschikt aan de bron die in de Request URI is opgegeven.
Options: Bevat een verzoek naar informatie over de opties voor communicatie die beschikbaar zijn in de verzoek/antwoordketen die in de variabele RequestURI is opgegeven.
Put: Vraagt aan dat de informatie die in de message body is bijgesloten wordt opgeslagen door het doelsysteem op de locatie die in de Request URI is gespecifieerd.
Delete: Vraagt aan dat het doelsysteem de bron verwijdert die wordt opgegeven in de variabele Request URI.
Trace: Vraagt aan dat het doelsysteem een applicatielaagloopback uitvoert op het inkomende bericht en dit terugzendt naar de afzender.
Connect: Gereserveerd voor het gebruik met proxyservers die SSL-tunneling leveren.
Algemene headervelden
Cache-Control: bevat aanwijzingen die opgevolgd moeten worden door cachingmechanismen op het doelsysteem.
Connection: Specifieert de opties die voor de huidige verbinding gewenst zijn, zodat het in stand wordt gehouden voor gebruik met meerdere aanvragen.
Date: Specifieert de datum en de tijd waarop het bericht gegenereerd is.
Pragma: Specifieert aanwijzingen die uitdrukkelijk voor de client –of serveruitvoering zijn.
Trailer: Geeft aan dat specifieke headervelden aanwezig zijn aan het einde van een bericht met gecomprimeerde transfercodering.
Transfer-Encoding: Specificeert welk type transformatie is toegepast (als dit het geval is) op de message body om deze veilig naar de bestemming te verzenden.
Upgrade: Specificeert aanvullende communicatieprotocollen die door de client ondersteund worden.
Via: Geeft de gateway- en de proxyservers tussen de client en de server aan en de protocollen die ze gebruiken.
Warning: Bevat aanvullende informatie over de status of transformatie van een bericht.
Request headervelden
Accept: Specificeert de mediatypen die in het antwoordbericht geaccepteerd worden.
Accept-Charset: Specificeert de inhoudscodering die in het antwoordbericht geaccepteerd worden.
Accept-Encoding: Specificeert de inhoudscodering die in het antwoordbericht geaccepteerd worden.
Accept-Language: Specificeert de talen die in het antwoordbericht geaccepteerd worden.
Authorization: Bevat gegevens waarmee op de server de authenticiteit van de client vastgesteld zal worden.
Expect: Specificeert het gedrag dat de client van de server verwacht.
From: Bevat een e-mailadres van de gebruiker die het verzoek genereerde.
Host: Specificeert de hostnaam op internet van de bron waarom verzocht is (meestal een URL), plus een poortnummer als er een andere dan de standaardpoort 80 gebruikt wordt.
If-Match: Wordt gebruikt om een specifiek verzoek voorwaardelijk te maken door specifieke entity-tags te vergelijken.
If-Modified-Since: Wordt gebruikt om een specifiek verzoek voorwaardelijk te maken door de verwijzingsdatum van de ingang in de cache van de client waar de bron zich bevindt te specificeren, welke de server vergelijkt met de feitelijke bron en beantwoordt met ofwel de bron ofwel de cacheverwijzing.
If-None-Match: Wordt gebruikt om een specifiek verzoek voorwaardelijk te maken door specifieke entity-tags niet te vergelijken.
If-Range: Verzoekt de server delen van een entity te verzenden die de client mist.
If-Unmodified-Since: Wordt gebruikt om een specifiek verzoek conditioneel te maken door een datum op te geven die de server moet gebruiken om te bepalen of de verzochte bron geleverd moet worden.
Max-Forwards: Stelt een limiet aan het aantal proxies of gateways dat een verzoek naar een andere server kunnen doorsturen.
Proxy-Authorization: Bevat gegevens waarmee de client zijn authenticiteit bij een proxyserver bewijst.
Range: Bevat één of meerdere bytereeksen die delen van de bron voorstellen die in de Resource URI gespecificeerd zijn en waarvan de client de server vraagt deze te verzenden.
Refer: Specificeert de bron waarvan de waarde Resource URI verkregen is.
TE: Specificeert welke extension transfercoderingen de client kan accepteren in het antwoord en of de client trailer fields met gecomprimeerde transfercodering zal accepteren.
User-Agent: Bevat informatie over de browser die het verzoek heeft ingediend.
Response headervelden
Accept-Ranges: Maakt het de server mogelijk om aan te geven of het range-aanvragen van een bron accepteert (alleen in antwoorden).
Age: Specificeert de verstreken tijd sinds een gecached antwoord door een server is gegenereerd.
Etag: Specificeert de huidige waarde van de entity-tag van de gevraagde variant.
Location: Stuurt het doelsysteem naar een andere locatie van de gevraagde bron dan de in de variabele Request URI genoemde locatie.
Proxy-Authenticate: Specificeert het authenticatiesysteem dat door een proxyserver gebruikt wordt.
Retry-After: Specificeert hoe lang een gevraagde bron onbeschikbaar voor de client zal blijven.
Server: Identificeert de webserversoftware die het verzoek verwerkt heeft.
Vary: Specificeert de headervelden die gebruikt zijn om te bepalen of een client een gecached antwoord zonder revalorisatie van de server kan gebruiken als reactie op een verzoek.
WWW-authenticate: Specificeert het type authenticatie dat vereist is voor de client om toegang tot de gevraagde bron te krijgen.
Entity headervelden
Allow: Specificeert het verzoektype dat door een bron ondersteund wordt die door een specifieke waarde van de Request URI wordt aangewezen.
Content-Encoding: Specificeert aanvullende inhoud-coderingsmechanismen die op de gegevens in de body van een bericht zijn toegepast.
Content-Language: Specificeert de taal van de message body.
Content-Length: Specificeert de lengte van de message body, in bytes.
Content-Location: Specificeert de locatie waar de informatie in de message body van ontleend is, als deze niet gelijk is aan de locatie die in de Resource URI is opgegeven.
Content-MD5: Bevat een MD5-samenvatting van de message body (zoals in RFC-1864 gedefinieerd is) die op de bestemming gebruikt zal worden om de integriteit te verifiëren.
Content-Range: Identificeert de locatie van de gegevens in de message body binnen het geheel van de gevraagde bron, als het bericht alleen een deel van de bron bevat.
Content-Type: Specificeert het mediatype van de gegevens in de message body.
Expires: Specificeert de datum en de tijd waarna het antwoord in de cache als verouderd wordt beschouwd.
Last-Modified: Specificeert de datum en de tijd waarop de gevraagde bron volgens de server voor het laatst is aangepast.
Extension-Header: Maakt het gebruik van aanvullende headervelden mogelijk die zowel door de client als de server moeten worden erkend.
Informational codes
100-Continue: Geeft aan dat het verzoek door de server ontvangen is en dat de client of een ander bericht moet sturen om het verzoek te completeren of op een antwoord moet blijven wachten. Een antwoord met deze code moet gevolgd worden door een ander antwoord met daarin een code waarin de voltooiing van het verzoek wordt aangegeven.
Successful codes
200-OK: Geeft aan dat het verzoek met succes verwerkt is en dat het antwoord de juiste gegevens bevat voor het type verzoek.
201-Created: Geeft aan dat het verzoek met succes verwerkt is en dat een nieuwe bron is gemaakt.
202-Accepted: Geeft aan dat het verzoek voor verwerking geaccepteerd is, maar dat nog niet met de verwerking is begonnen.
203-Nonauthoritative Information: Geeft aan dat de informatie in de headers niet de definitieve informatie is die door de server verstrekt zal worden, maar dat deze van een lokale kopie of van een kopie van derden verzameld zal worden.
204-No Content: Geeft aan dat het verzoek met succes verwerkt is, maar dat het antwoord geen message body bevat. Het kan wel headerinformatie bevatten.
205-Reset Content: Geeft aan dat het verzoek met succes verwerkt is, en dat de clientbrowser de documentweergave moet vernieuwen. Dit bericht betekent meestal dat de gegevens uit een formulier ontvangen zijn en dat de browser de weergave moet vernieuwen door de formuliervelden leeg te maken.
206-Partial Content: Geeft aan dat het verzoek met succes verwerkt is en dat de server een verzoek beantwoord heeft dat de Range header gebruikt om delen van een bron te specificeren.
Redirection codes
300-Multiple Choices: Geeft aan dat het antwoord een lijst met bronnen bevat die gebruikt kunnen worden om aan het verzoek te voldoen en waar de gebruiker er een van moet kiezen.
301-Moved Permanently: Geeft aan dat een nieuwe URI aan de gevraagde bron is toegewezen en dat alle toekomstige referenties aan deze bron een van de nieuwe URI’s moet gebruiken die in het antwoord zijn opgenomen.
302-Found: Geeft aan dat de gevraagde bron tijdelijk onder een andere URI te vinden is, maar dat de client dezelfde waarde voor Request URI moet blijven gebruiken bij toekomstige aanvragen omdat de locatie opnieuw kan veranderen.
303-See Other: Geeft aan dat het antwoord op het verzoek onder een andere URI kan worden gevonden en dat de client een nieuw verzoek aan deze URI moet richten.
304-Not Modified: Geeft aan dat de versie van de opgevraagde bron in de cache van de clien identiek is aan die op de server en dat het opnieuw verzenden van de bron niet nodig is.
305-Use Proxy: Geeft aan dat de opgevraagde bron via de proxy die in de Location header wordt genoemd moet worden benaderd.
306-Unused
307-Temporary Redirect: Geeft aan dat de gevraagde bron tijdelijk onder een andere URI te vinden is, maar dat de client dezelfde waarde voor Request URI moet blijven gebruiken bij toekomstige aanvragen omdat de locatie opnieuw kan veranderen.
Client error codes
400-Bad Request: Geeft aan dat de server het verzoek niet begrepen heeft ten gevolge van een foutieve syntaxis.
401-Unauthorized: Geeft aan dat de server een verzoek niet kon verwerken omdat gebruikersauthenticatie vereist is.
402-Payment Requiered: Gereserveerd voor toekomstig gebruik.
403-Forbidden: Geeft aan dat de server weigert het verzoek te verwerken en dat dit niet herhaald moet worden.
404-Not Found: Geeft aan dat de server de bron die door de variabele Request URI wordt gespecificeerd niet heeft kunnen vinden.
405-Method Not Allowed: Geeft aan dat het type verzoek niet gebruikt kan worden voor de opgegeven Request URI.
406-Not Acceptable: Geeft aan dat de bron die door de variabele Request URI wordt gespecificeerd met geen van de gegevenstypes die in de Accept-header van het verzoek gespecificeerd zijn overeenkomt.
407-Proxy Authentication Required: Geeft aan dat de client zijn authenticiteit moet aantonen bij een proxyserver voordat hij toegang krijgt tot de opgevraagde bron.
408-Request Timeout: Geeft aan dat de client geen verzoek heeft ingediend binnen de verstrijkingstermijn van de server.
409-Conflict: Geeft aan dat het verzoek niet verwerkt kon worden vanwege een conflict met de huidige staat van de opgevraagde bron, wanneer bijvoorbeeld een opdracht PUT probeert om gegevens naar een bron te schrijven die al gebruikt is.
410-Gone: Geeft aan dat de opgevraagde bron niet langer beschikbaar is op de server en dat de server geen alternatieve locatie kent.
411-Length Required: Geeft aan dat de server geweigerd heeft een verzoek te verwerken dat geen Content-Length header heeft.
412-Precondition Failed: Geeft aan dat de server er niet in geslaagd is aan een van de eerste voorwaarden die in de header van het verzoek is gespecificeerd, tegemoet te komen.
413-Request URI Too Long: Geeft aan dat de server weigert een verzoek te verwerken omdat de waarde van Request URI langer is dan de server bereid is te verwerken.
415-Unsupported Media Type: Geeft aan dat de server weigert een verzoek te verwerken omdat het verzoek in een indeling is die niet ondersteund wordt door de opgevraagde bron voor de opgevraagde methode.
416-Request Range Not Satisfiable: Geeft aan dat de server een verzoek niet kan verwerken omdat de gegevens die in de Range header zijn gespecificeerd niet bestaan in de opgevraagde bron.
417-Expectation Failed: Geeft aan dat de server niet aan de vereisten kon voldoen die opgegeven zijn in de Expect-header van het verzoek.
Server error codes
500-Internal Server Error: Geeft aan dat de server een onverwachte voorwaarde is tegengekomen die tegemoetkoming aan het verzoek verhinderd heeft.
501-Not Implemented: Geeft aan dat de server niet over de functionaliteit beschikt die nodig is om aan het verzoek te kunnen voldoen.
502-Bad Gateway: Geeft aan dat de gateway of proxyserver een ongeldige reactie heeft ontvangen van een bovenstroomse server tijdens een poging het verzoek te verwerken.
503-Service Unavailable: Geeft aan dat de server het verzoek niet heeft verwerkt omdat deze tijdelijk overbelast is of onderhouden wordt.
504-Gateway Timeout: Geeft aan dat een gateway of proxyserver geen tijdige reactie heeft ontvangen van de upstream server die in de URI gespecificeerd is of van een andere ondersteunende server die nodig was om het verzoek af te handelen.
505-HTTP Version Not Supported: Geeft aan dat de server de gebruikte HTTP protocolversie uit het verzoek niet kan of wil ondersteunen.