Webtechnologie - The web programming environment, client side

advertisement
The web programming environment
Lennart
Herlaar
Webtechnologie
1
Inhoud
• Markup, hypertext en HTML
• Browsers en servers
• HyperText Transfer Protocol
• URIs, headers, persistence
• Scripting en integratie
URI voorbeelden
• Absolute en relatieve locaties
• Schemes, namespaces
http://www.cs.uu.nl/docs/vakken/b2wt/index.html
http://lennart:[email protected]:8080/cijfers.php?
student=0036123&cijfer=9#resultaat
Practicum%20opgave.html
../../../colleges.txt
#sectie01
Case sensitive?
ftp://ftp.cs.uu.nl/pub
mailto:[email protected]
urn:isbn:0470916591
urn:isan:0000-0000-9E59-0000-O-0000-0000-2
The gory details
• (Sterk) vereenvoudigde grammatica voor URLs
url
scheme
address
full-domain
domainname
domain
path-to-doc
::=
::=
::=
::=
::=
::=
::=
scheme address
http:// | ftp:// | mailto: | file:// | ...
full-domain/path-to-doc [#anchor]
host.domainname[:portnr]
domain . domainname | domain
string-without-whitespace-and-;:&
/-separated-strings-withoutwhitespace-and-;:&
• RFC3986 – URIs : Generic Syntax
URL encoding / decoding
• Bijzondere karakters in een URI
• Spatie, control, :/@&=?%, diakritische tekens, enz.
• Voor "normaal" gebruik in een URI is encoding /
decoding nodig, ook wel percent-encoding
• % teken met ASCII waarde als hexadecimaal getal
• Spatie, ASCII code 32, 20 hexadecimaal, dus %20
• Overal waar de URI gebruikt wordt
• Chinese URLs?
• Internationalized Resource Identifier
HTTP request en response
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 […]
Accept: text/html, image/png
HTTP/1.1 200 OK
Date: Fri, 12 Feb 2016 08:01:34 GMT
Server: Apache/2.2.21 (Unix) (Red-Hat/Linux)
Last-Modified: Sun, 07 Feb 2016 23:11:55 GMT
Content-Length: 438
Connection: close
Content-Type: text/html; charset=utf-8
<html>
[…]
HTTP headers
• Vele tientallen (optionele) headers gedefinieerd
• Welke headers hangt af van de HTTP versie
• HTTP/1.0 versus HTTP/1.1 versus HTTP/2
• Veelal gericht op content negotiation en
efficiënt gebruik van de bandbreedte
• De onderhandeling is "server-driven"
HTTP headers
• Compression
Accept-Encoding: gzip, identity
Content-Encoding: gzip
• Language
Accept-Language: fr; q=1.0, en; q=0.5
Content-Language: en-US
• MIME type
• Character set
Later meer hierover!
Accept: text/html; q=1.0, image/jpeg; q=0.6, */*;
q=0.1
Accept-Charset: utf-8
Content-Type: text/html; charset=utf-8
HTTP headers
• Range request
Range: bytes=500999
Content-Range: bytes 500-999/3573
• Caching
If-Modified-Since: Wed, 27 Jan 2016 10:12:43 GMT
If-None-Match: "69af74da0860cdc288ad309d058282f2"
Last-Modified: Wed, 27 Jan 2016 10:12:43 GMT
ETag: "69af74da0860cdc288ad309d058282f2"
Cache-Control: no-cache
Connection: close
• Persistent connection
Connection: keep-alive
Poorten en sockets
• Een poort is een "brievenbus" binnen het OS
• Een proces kan zich koppelen aan een poort
• Een socket is een eindpunt voor communicatie
• Lokaal IP adres en poortnummer
• Remote IP adres en poortnummer (bij TCP)
• Transport protocol (TCP, UDP, …)
• Een TCP verbinding wordt geïdentificeerd aan
de hand van een 4-tuple
• De transportlaag gebruikt deze informatie voor
(de)multiplexing
TCP verbindingen
Officiële IANA poorten voor HTTP:
80 – HTTP
443 – HTTPS
8008 – HTTP (alt)
Persistent connections
Close
Client
Server
Client
Server
Keep-Alive
t
3-way TCP
handshake
incl. request
3-way TCP
handshake
incl. request
> 2*RTT
Response
Response
TCP disconnect
2 requests
2 responses
3-way TCP
handshake
incl. request
4 requests
4 responses
Response
Etc.
TCP disconnect
TCP disconnect
Etc.
Ready!
Persistence versus state
• Verwar persistent connections niet met state
• Persistent connections betreffen state op TCP niveau
• Op HTTP niveau is er geen state
• Echt niet?
Later meer hierover!
• Nouja, stiekem toch wel ergens iets van…
Set-Cookie: UserID=darkhelmet; Max-Age=3600; Version=1
• Headers zijn een krachtig "mod" mechanisme
• Headers zijn in de regel bereikbaar vanuit je
scripting taal
HTTP/2
• Gebaseerd op de oudere Google SPDY standaard
• Gestandaardiseerd in mei 2015
• Ondersteund door meeste browsers en sommige sites
•
•
•
•
•
•
Multiplexing (> 1 asynchrone requests)
Server push (> 1 response voor 1 request)
Prioritering van requests
Header compressie
Binair protocol
Voor HTTP en HTTPS; compatible met HTTP/1.1
Zelf aan de slag?
• Eenvoudige webserver maken is niet moeilijk
• Beperkt aantal methods en headers
• Vaak ook libraries beschikbaar
1 proces/thread
per request
Hoofdproces/thread,
luistert op poort 80
Start
proces/
thread
Request
Request
Response
Response
(wacht op
volgende
request)
Start
proces/
thread
Voorbeeld webserver(tje)
void loop()
{
EthernetClient client = server.available();
if (client)
byte
mac[] = {{0xDE,0xAD,0xBE,0xEF,0xFE,0xED};
boolean ip(192,168,1,177);
currentLineIsBlank = true;
IPAddress
while (client.connected())
{
EthernetServer
server(80);
if (client.available()) {
char c = client.read();
void setup()
if (c == '\n' && currentLineIsBlank) {
{
client.println("HTTP/1.1
200 OK");
Ethernet.begin(mac,
ip);
client.println("Content-Type: text/html");
server.begin();
client.println();
}
//"Put
payload
goes
the fun back
intohere!
learning computing" –
Raspberry Pi Foundation
[…]
}
client.stop();
}
}
Request For Comments
• Details over protocollen zijn te vinden in RFCs
• RFC2616 – HTTP/1.1
• RFC3986 – URIs
• Maar ook: TCP, IP, DHCP, DNS, …
• Internet Engineering Task Force (IETF)
• Peer review; veel strikter dan het klinkt
• (X)HTML(5)?
• RFC2322 – peg-DHCP
The web programming environment
Scripting en integratie
Lennart
Herlaar
Webtechnologie
18
Scripting
• Scripts = korte programmaatjes, code snippets
• Scripting maakt websites dynamisch
• Volledig dynamische website = webapplicatie
• Zowel client als server side mogelijk
• In de regel in ieder geval server side
• In het "Modern Web" tijdperk echter niet meer
vanzelfsprekend
Client side scripting
• Client side scripts worden uitgevoerd in de
browser
• Client side scripts zijn onderdeel van de opgevraagde
pagina
<body>
<h1>My First JavaScript</h1>
<script type="text/javascript">
document.write("<p>" + Date() + "</p>");
</script>
</body>
• "Actief" zolang de pagina getoond wordt
Client side scripting
• In essentie gericht op het oplossen van
tekortkomingen in protocol en presentatie!
• Page based requests
• Conditionele GUI, validatie invoer, grafische effecten
• Ontbreken van state
• Fat clients, "desktop" applicaties in de browser
• JavaScript (ECMAScript)
• Maar…
• Server side JavaScript
Server side scripting
• Server side scripts worden uitgevoerd op de
webserver (of application server)
• Er bestaan verschillende integratiemethoden
• Veelal het "one resource at a time" paradigma
• Een request leidt tot de aanroep van een script
• Het script genereert HTML (vaak een form) en
stopt
• De invoer voor het script is een form
• Het draaien van een webapplicatie is een lange
reeks script aanroepen
Scripting talen: gemene deler
• Geïnterpreteerd, of just-in-time compilatie
• Geen (verplichte) declaraties
• Dynamisch getypeerd
• Goede voorzieningen voor tekstmanipulatie
• Reguliere expressies
• Veel libraries / modules beschikbaar
• Buitengewoon flexibel, high level
• Buitengewoon gevaarlijk
Scripting talen
• Belangrijke eigenschap voor het web
• "Executable source code"
• Voor server side is een scripting taal geen
vereiste
• PHP, Python, Perl, Ruby
• Maar ook Java, C#, C/C++, Pascal, …
• Afhankelijk van de integratiemethode
• En voor de client side (naast JavaScript)?
• Java Applets, Flash, ActiveX en andere objects
Architectuur diagram revisited
HTTP request
Form, parameters
Webserver
Applicatie
Files
Result set
DB access
SQL
Return
HTML
File
HTTP response
HTML
File access
Web
browser
Execute
Parameters, code
RDBMS
POST versus GET
• POST: form data in HTTP message body
• GET: form data in URI (HTTP resource veld)
• Query string
(URL encoded)
<form name="input" action="welcome.php" method="get">
First name: <input type="text" name="first" /><br />
Last name: <input type="text" name="last" /><br />
<input type="submit" value="Send" />
</form>
http://…/welcome.php?first=Willie&last=Wartaal
1. Common Gateway Interface
• Standaard voor de aanroep van externe
programma's via de webserver
• Perl, Python, shell scripts, executables (C++, …)
• Webserver start proces; geeft query string door
• Via environment variabele (GET)
• Via standaardinvoer (POST)
• Proces genereert headers en HTML
• Op standaarduitvoer
1. Common Gateway Interface
• Herkenbaar aan speciale cgi-bin directory
• Enkele environment variabelen
• QUERY_STRING (bij GET)
• CONTENT_LENGTH (bij POST)
• CONTENT_TYPE
• REMOTE_ADDR
• CGI is relatief zwaar voor de webserver
• FastCGI houdt het proces actief (state, anyone?)
• CGI is een beetje old-skool
2. Inlining code in document
• Code snippets die tussen de HTML code staan
• Van boven naar onderen uitgevoerd
• De code snippets worden vervangen door
hun uitvoer
• Geïmplementeerd in de vorm van webserver
modules of CGI
• Server Side Includes (SSI), PHP, ASP.NET, JSP
Server Side Includes
• Voorloper van latere HTML embedded code
• Preprocessing directives tussen de HTML code
• Herkenbaar aan extensie (.shtml) of exec bit
<h1><!--#echo var="DATE_LOCAL" --></h1>
<pre>
<!--#exec cmd="ls" -->
</pre>
<p>
Gewijzigd: <!--#flastmod file="index.html" -->
</p>
• Ook old-skool
PHP: Hypertext Preprocessor
<html>
<body>
<html>
<body>
<p>
<p>
Hello World<br/>
<?php
Lecture time!
</p>
echo "Hello World";
</body>
</html>
?><br/>
<?php
$d=date("D");
if ($d=="Wed" || $d=="Fri")
echo "Lecture time!";
?>
</p>
</body>
</html>
2. Inlining code in document
• Oorspronkelijk voor kleine stukjes code
• Dunne scheidslaag tussen code en structuur
• Steeds in en uit context springen
• De code wordt snel onleesbaar
• Modernere insteek
• Alle HTML gegenereerd vanuit de code
• Templates voor vaste onderdelen
• MVC frameworks waarbij de HTML pagina niet veel
meer is dan een aanroep van een generate functie
3. Integratie in webserver
• Uitbreiden van de functionaliteit van de server
• Vaak in de vorm van specifieke classes die specifieke
requests afhandelen
• Java Servlets, JSP
• javax.servlet en javax.servlet.http packages
•
•
•
•
•
JDBC voor database connectivity
Filters en filterchains
Java is een bekende serieuze programmeertaal
Minder overhead in afhandeling request
Sterke integratie kan gevaarlijk zijn
State revisited
• Waar kunnen we state onderbrengen?
• Query string / hidden input fields
• Client side cookies
• Client side scripts
Later meer hierover!
• Server side (database, file system, script)
• Als web developer maak je hierin keuzes
• Een deel ervan blijft ping-pongen
• Het blijft overhead en een security risico
• Je blijft ermee bezig…
Client side representation
Lennart
Herlaar
Webtechnologie
35
Inhoud
• Documentformaten
• Het einde van het web
• SGML, XML en HTML
• XHTML en HTML5
Documentformaten
• De mythe van het papierloze kantoor
• > 260 miljoen prints per dag in Nederland
• Merendeel gebruikt voor transport
• Papier als grootste gemene deler
• Paradigma shift noodzakelijk
• Belang van standaarden
• Open standaarden
Andere markup talen?
Soorten markup revisited
• Procedural markup versus descriptive markup
• Presentatie versus structuur & semantiek
• Toegankelijkheid: gebruiker bepaalt
• Onderhoudbaarheid: descriptive is duurzaam
• Verwerkbaarheid: indexering, eenduidigheid
• Onontkoombaarheid: kun je zonder?
HTML puur?
<html>
<head>
<title>Hello world</title>
</head>
<body>
<h1>My First Heading</h1>
<p>My <b>first</b> paragraph.</p>
<p>
Including a <a href="index.html">link</a>
</p>
</body>
</html>
Client side representation
Het einde van het web
Lennart
Herlaar
Webtechnologie
41
HTML puur!
• '91: HTML Tags
• '93: HTML Internet Draft, IETF
• Gedefinieerd als toepassing van SGML
• <IMG> tag
• Intentie was duidelijk
"It is required that HTML be a common language
between all platforms. This implies no devicespecific markup, or anything which requires
control over fonts or colors, for example. This is in
keeping with the SGML ideal."
Download