HTTP

Huh!

What is it good for?

HTTP

-Hypertext transfer protocol

  • Började utvecklas 1989 av Tim Berners-Lee
  • Första officiella definitionen släpptes 1997
  • Ny version släpptes 1999
  • HTTP/2 släpptes 2015

Men vad är det då?

Ett protokoll för kommunikation mellan en server och en klient. Klienten skickar ett HTTP-meddelande till servern som i sin tur svarar med olika resurser som tex html.

Protokollet säger ingenting om hur datan skickas utan är en definition av hur informationen mellan server och klient skall vara strukturerad.

Definitionen innehåller ett antal request-metoder

Säkra metoder

HEAD, GET, OPTIONS, TRACE

Osäkra metoder

POST, PUT, DELETE, PATCH

Och ett antal statuskoder

Statuskoderna delas in i 5 sektioner

  • Information - 1XX

  • Framgång! - 2XX

  • Omdirigering - 3XX

  • Klientfel - 4XX

  • Servefel - 5XX

De viktigaste statuskoderna

  • 200 OK
  • 300 Multiple Choices
  • 301 Moved Permanently
  • 302 Moved Temporarily
  • 304 Not Modified
  • 307 Temporary Redirect
  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 410 Gone
  • 500 Internal Server Error
  • 501 Not Implemented
  • 503 Service Unavailable
  • 550 Permission denied

HTTP är stateless

Exempel

Klient

GET /index.html HTTP/1.1
Host: www.example.com

Server

HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Encoding: UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
ETag: "3f80f-1b6-3e1cb03b"
Accept-Ranges: bytes
Connection: close
Statusrad
Headers

Exempel

  • A Status-line
  • Zero or more header (General|Response|Entity) fields followed by CRLF
  • An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
  • Optionally a message-body

Hur påverkar man responsen själv?

Två generella sätt

  • Via webbservern (Apache, Nginx etc)
  • Via kod i backend (PHP, .Net, Nodejs)

Webbservern (Apache)

Förkrav: modulen mod_headers måste vara aktiverad

Manual: https://httpd.apache.org/docs/2.4/mod/mod_headers.html

<IfModule mod_headers.c>
 Header unset Server
 Header always unset X-Powered-By
 Header unset X-Powered-By
 Header unset X-CF-Powered-By
 Header unset X-Mod-Pagespeed
 Header unset X-Pingback
 Header set MyHeader "Hello Joe. It took %D microseconds for Apache to serve this request."
</IfModule>

I kod (PHP)

<?php
header("HTTP/1.0 404 Not Found");

header("Location: http://www.example.com/"); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit;
?>

Om ni behöver påverka headers via PHP så görs detta via den inbyggda funktionen header

Funktionen kan även användas för omdirigeringar och för att sätta http-statuskoder.

I kod (PHP)

<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?> 

Funktionen måste anropas FÖRE någon output skrivs till webbläsaren.

Nedanstående exempel fungerar inte. OBS att inställningen output_buffers kan "gömma" det här felet.

Övningar

https://github.com/raket/wieg16-http

  • Undersök fem (5) valfria sidor och läs deras http-responser i nätverkspanelen i Chrome. Skriv ner vilken information du kan utröna genom att bara läsa http-headers
  • Gör en sida med ett formulär på. Formuläret kan POST:a till samma sida som det ligger på. Aktivera "preserve log" i Chrome och studera request och response.
  • Gör ändringar i formuläret (byt namn på formulärfält, lägg till/ta bort formulärfält) och notera hur request/respons förändras.

Övningar

  • PHP:s header-funktion är ganska klumpig. Skriv en egen funktion med namnet status_header vars syfte är att skicka statuskoder till webbläsaren. Signatur: status_header($code = 200)
    När funktionen anropas så skall rätt statuskod skickas till webbläsaren tillsammans med lämplig text.
    Exempel: "HTTP/1.0 404 Not Found"
  • Skriv en funktion med namnet headers som kan användas för att sätta flera headers samtidigt.
    Signatur: headers(array $headers = [])
    Arrayen som skickas in skall ha strukturen [header => värde] där header är den header som skall sättas och värdet är det värde som headern skall ha.
     

Övningar

  • Skriv en funktion som heter redirect som använder PHP:s inbyggda header-funktion för att göra omdirigeringar.
    Signatur: redirect($url, $code = 302)

Obligatorisk kunskap

  • Vad http står för
  • Innebörden av att http är stateless
  • Säkra vs osäkra http-metoder
  • De viktigaste statuskoderna (listan)

HTTP

By marcusdalgren

HTTP

  • 316