5 Hypertext Transfer Protocol (HTTP)

5 Hypertext Transfer Protocol (HTTP) Aus der Definition von HTTP/1.1 (RFC 2616): The Hypertext Transfer Protocol (HTTP) is an application-level prot...
Author: Martina Beltz
4 downloads 2 Views 192KB Size
5

Hypertext Transfer Protocol (HTTP)

Aus der Definition von HTTP/1.1 (RFC 2616): The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. It is a generic, stateless, protocol which can be used for many tasks beyond its use for hypertext, such as name servers and distributed object management systems, through extension of its request methods, error codes and headers. A feature of HTTP is the typing and negotiation of data representation, allowing systems to be built independently of the data being transferred. Vorl¨ aufige Version

236

c 2003 Peter Thiemann

Beispiel fu ¨r HTTP Kommunikation Aufbau der Verbindung zum WWW-Server [hanauma] 107 > telnet localhost www TCP/IP Verbindung zum Rechner localhost an den Port www (80) Antwort von Telnet Trying 127.0.0.1... Connected to localhost. Escape character is ’^]’. Anfrage (Request) an den WWW-Server 1|GET / HTTP/1.1 2|Host: localhost 3| Request besteht nur aus Kopf (Header), der Rumpf (Body) ist leer

Vorl¨ aufige Version

237

c 2003 Peter Thiemann

Kopf (Header) der Antwort 1|HTTP/1.1 200 OK 2|Date: Wed, 03 May 2000 19:41:20 GMT 3|Server: Apache/1.3.9 (Unix) 4|Last-Modified: Wed, 20 May 1998 14:59:42 GMT 5|ETag: "4405-656-3562efde" 6|Accept-Ranges: bytes 7|Content-Length: 1622 8|Content-Type: text/html 9| Leerzeile signalisiert das Ende des Headers Rumpf (Body) der Antwort in diesem Fall ein HTML-Dokument Test Page for Apache Installation on Web Site Vorl¨ aufige Version

238

c 2003 Peter Thiemann

Nach kurzer Wartezeit beendet der Server die Verbindung. Connection closed by foreign host. Alternativ: weitere Requests u¨ber die gleiche Verbindung

Vorl¨ aufige Version

239

c 2003 Peter Thiemann

Format einer Anfrage hRequest i ::= hRequest-Line i  ∗  hgeneral-header i | hrequest-header i | hentity-header i hCRLF i hCRLF i [hmessage-body i] Jede Zeile wird durch hCRLF i,

CR (ASCII-Kode 13) gefolgt von LF (ASCII-Kode 10), abgeschlossen.

Vgl. Methodenaufruf • erste Zeile (hRequest-Line i): Name der Methode und vorgeschriebene Parameter • Headerzeilen: weitere (optionale) Parameter, durch Schlu ¨sselworte identifiziert • Rumpf: optionaler Inhalt der Anfrage (Parameter)

Vorl¨ aufige Version

240

c 2003 Peter Thiemann

Erste Zeile einer Anfrage hRequest-Line i hMethod i

::=

hMethod i hRequest-URI i hHTTP-Version ihCRLF i

::= GET

*

Anfordern eines Dokuments

| HEAD

*

Anfordern der Header eines Dokuments

| POST

Senden einer Anfrage

| PUT

Ablegen eines Dokuments

| DELETE

Lo ¨schen eines Dokuments

| TRACE

Anfordern der empfangenen Anfrage

| OPTIONS *

Vorl¨ aufige Version

erforderliche Methoden

241

c 2003 Peter Thiemann

Vorl¨ aufige Version

hRequest-URI i

::=

habs path i | habsoluteURI i | . . .

hHTTP-Version i

::=

HTTP/1.1

habs path i

::=

/ [hpath i] [;hparams i] [?hquery i]

hparams i

::=

...

hquery i

::=

...

242

c 2003 Peter Thiemann

Beispiel (Minimalanfrage) 1|GET / HTTP/1.1 2|Host: www.informatik.uni-freiburg.de 3|

Vorl¨ aufige Version

243

c 2003 Peter Thiemann

Format einer Header-Zeile hheader i ::= hkey-token i:hvalue i

Beispiel hHost i

Vorl¨ aufige Version

::= Host: hhost i [ : hport i ]

244

c 2003 Peter Thiemann

Anfragespezifische Header hrequest-header i

::=

hAccept i

media types

| hAccept-Language i | hHost i

*

Hostname des Servers

| hReferer i

URL

| hUser-Agent i .. . *

Vorl¨ aufige Version

in jeder direkten Anfrage erforderlich

245

c 2003 Peter Thiemann

Allgemeine Header K¨ onnen in Anfragen und Antworten benutzt werden, meist optional hgeneral-header i

::=

hConnection i | hDate i | hTransfer-Encoding i

+

persistent/one-shot

+! +

+

h¨ aufig in Antworten benutzt

+!

in jeder Antwort erforderlich

Entity Header Information u ¨ber den hmessage-body i, falls vorhanden: Content -Encoding, -Language, -Length, -Location, . . .

Vorl¨ aufige Version

246

c 2003 Peter Thiemann

Format einer Antwort hResponse i ::= hStatus-Line i  ∗  hgeneral-header i | hresponse-header i | hentity-header i hCRLF i hCRLF i [hmessage-body i] Beispiel 1|HTTP/1.1 200 OK 2|Date: Wed, 03 May 2000 19:41:20 GMT 3|Server: Apache/1.3.9 (Unix) 4|Last-Modified: Wed, 20 May 1998 14:59:42 GMT 5|ETag: "4405-656-3562efde" 6|Accept-Ranges: bytes 7|Content-Length: 1622 8|Content-Type: text/html 9|

Vorl¨ aufige Version

247

c 2003 Peter Thiemann

Statuszeile hStatus-Line i

::=

hHTTP-Version i hStatus-Code i hReason-Phrase ihCRLF i

hHTTP-Version i

::=

HTTP/1.1

hStatus-Code i

::=

hdigit ihdigit ihdigit i

hReason-Phrase i

::=

Text ohne hCRLF i

Interpretation des Status-Code 1xx Informational – Request received, continuing process 2xx Success – The action was successfully received, understood, and accepted 3xx Redirection – Further action must be taken in order to complete the request 4xx Client Error – The request contains bad syntax or cannot be fulfilled 5xx Server Error – The server failed to fulfill an apparently valid request • Siehe RFC 1700 fu ¨r alle reservierten hStatus-Code is und hReason-Phrase is • hReason-Phrase is sind nur Empfehlungen, k¨ onnen von Server und Client ignoriert und/oder ge¨ andert werden • Im Fehlerfall enth¨ alt hmessage-body i oft weitere Erkl¨ arung Vorl¨ aufige Version

248

c 2003 Peter Thiemann

Inhalt der Nachricht • beliebige Folge von Oktetts • falls hContent-Type i nicht vorhanden – Client darf aufgrund der URI raten – falls erfolglos application/octetstream • hContent-Encoding i: gzip, compress, deflate beschreiben Kodierungseigenschaften des urspru ¨nglichen Objekts ¨ • hTransfer-Encoding i definiert Ubertragungskodierung: chunked, gzip, compress, deflate, identity

Vorl¨ aufige Version

249

c 2003 Peter Thiemann

Transfer-Encoding: identity and chunked identity hContent-Length i Header definiert die L¨ ange des hmessage-body i in octets; hmessage-body i ist Folge von octets dieser L¨ ange (danach folgt unvermittelt die n¨ achste Antwort bzw Verbindungsabbruch) chunked wird verwendet, wenn die L¨ ange nicht a-priori feststeht. hmessage-body i wird in chunks u ¨bertragen (verku ¨rzt): Chunked-Body = *chunk last-chunk CRLF chunk chunk-size last-chunk chunk-data

Vorl¨ aufige Version

= chunk-size CRLF chunk-data CRLF = 1*HEX = 1*("0") CRLF = chunk-size(OCTET)

250

c 2003 Peter Thiemann

6

Common Gateway Interface (CGI)

CGI (Common Gateway Interface) Skripte erlauben die dynamische Erzeugung von Dokumenten auf dem Server. Typische Anwendung: CGI-Skripte verarbeiten Eingaben aus Formularen und erzeugen in Abh¨ angigkeit von den Eingaben ein Antwortdokument. Eigenschaften von CGI: Einfachheit Sprachunabh¨ angigkeit Sicherheit durch separaten Prozess Offener Standard Architekturunabh¨ angigkeit

Vorl¨ aufige Version

251

c 2003 Peter Thiemann

HTTP−Request HTTP−Client (Browser)

HTTP−Response

HTTP−Server

stdout

stdin, env CGI Prozeß

Vorl¨ aufige Version

252

c 2003 Peter Thiemann

Ausfu ¨hrung eines CGI-Skripts • Server erkennt CGI-Skripte an der URL – spezielles Element im Pfad (z.B. cgi-bin), dann n¨ achstes Pfadelement = Name eines ausfu ¨hrbaren Programms in konfigurierbarem Verzeichnis – spezielle Extension am Dateinamen (z.B. .cgi) = Name eines ausfu ¨hrbaren Programms • Server verarbeitet den Header des HTTP-Requests • Legt Request-Information in Environment ab (Prozessumgebung) • Generiert die Statuszeile und einige Response-Header (Date, Server, Connection) • Schliesst den Headerteil der Response NICHT ab • Startet das CGI-Programm mit – Standardausgabe ⇔ Versenden an Client/Browser – Standardeingabe ⇔ ggf. Lesen vom Client/Browser – Argumente ⇔ Pfadelemente nach dem Namen des CGI-Programms – Umgebung definiert weitere Parameter der Anfrage Vorl¨ aufige Version

253

c 2003 Peter Thiemann

Pflichten eines CGI-Programms • Interpretation der Parameter und der Anfrage • Drucken weiterer Headerzeilen (Content-Length, Content-Type, Content-Encoding, . . .) • Abschliessen des Headerteils der Response durch Leerzeile • Generieren des Inhaltes Sprachen zur CGI-Programmierung • Jede geeignet, die Standardeingabe und Umgebungsvariable lesen kann, sowie Standardausgabe schreiben kann • Fu ¨r Java ist ein wrapper Programm zum Lesen der Umgebungsvariablen erforderlich • Manche Webserver beinhalten Interpreter fu ¨r Skriptsprachen (perl, php, etc), um die Startzeit fu ¨r einen externen Interpreter zu sparen Beispiel: Apache Module mod perl, mod php, mod python, mod ruby, . . .

Vorl¨ aufige Version

254

c 2003 Peter Thiemann

6.1

Parameter fu ¨r ein CGI-Programm

Die Einsendung eines XHTML Formulars liefert Feldname1 =Wert1 Feldname2 =Wert2 ... Feldnamek =Wertk wobei Feldnamen wiederholt auftreten k¨ onnen. ¨ Feldnamen und Werte werden vor Ubertragung vom Browser kodiert Standardkodierung: URL Kodierung application/x-www-form-urlencoded • Buchstaben und Zahlen bleiben erhalten • Leerzeichen werden durch + ersetzt • Alle weiteren Zeichen werden durch %hASCII-code i ersetzt (in zweistelliger Hexadezimaldarstellung) vgl. public static String java.net.URLEncoder.encode(String s)

Vorl¨ aufige Version

255

c 2003 Peter Thiemann

6.2

Zugriffsmethoden

GET Kodierung der Anfrage in der URL durch Anh¨ angen eines hQuerystring i der Form ?hFeld-Wert-Liste i an die action URL hFeld-Wert-Liste i

::=

hkodierter-Feldname i=hkodierter-Wert i  ∗ &hkodierter-Feldname i=hkodierter-Wert i

Der Webserver legt den hQuerystring i in der Umgebungsvariable QUERY STRING ab. POST verschickt die hFeld-Wert-Liste i im hmessage-body i der Anfrage. Der Webserver speichert die L¨ ange (in Octets) des hmessage-body i in der Umgebungsvariable CONTENT LENGTH. Das CGI-Programm muss genau so viele Octets lesen und interpretieren (nicht bis Dateiende lesen!) Durch URL Kodierung werden • unerlaubte Zeichen in URLs vermieden • die Zeichen = und & in Feldnamen und Werten verwendbar Rationale fu andert ggf. Zustand des Servers ¨r Methoden: GET beobachtet, POST ¨ Vorl¨ aufige Version

256

c 2003 Peter Thiemann

Ein Shellskript als CGI-Skript: date Abspeichern als date.cgi oder als /cgi-bin/date. #!/bin/sh echo Content-type: text/html echo cat CGIProgram -> IO ()

Vorl¨ aufige Version

260

c 2003 Peter Thiemann

Simple Use of RawCGI import RawCGI main = start [] mycgi -- |display all form parameters mycgi info params = do putStrLn "Content-Type: text/plain" putStrLn "" putStrLn "My parameters are:" mapM_ oneBinding params oneBinding (name, value) = do putStr name putStr " = " putStrLn value

Vorl¨ aufige Version

261

c 2003 Peter Thiemann

6.3

Umgebungsvariablen im CGI-Skript: test-cgi

#!/bin/sh # disable filename globbing set -f echo Content-type: text/plain echo echo CGI/1.0 test script report: echo echo argc is $#. argv is "$*". echo echo SERVER_SOFTWARE = $SERVER_SOFTWARE echo SERVER_NAME = $SERVER_NAME echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE echo SERVER_PROTOCOL = $SERVER_PROTOCOL echo SERVER_PORT = $SERVER_PORT echo REQUEST_METHOD = $REQUEST_METHOD echo HTTP_ACCEPT = "$HTTP_ACCEPT" echo PATH_INFO = "$PATH_INFO" Vorl¨ aufige Version

262

c 2003 Peter Thiemann

echo echo echo echo echo echo echo echo echo

PATH_TRANSLATED = "$PATH_TRANSLATED" SCRIPT_NAME = "$SCRIPT_NAME" QUERY_STRING = "$QUERY_STRING" REMOTE_HOST = $REMOTE_HOST REMOTE_ADDR = $REMOTE_ADDR REMOTE_USER = $REMOTE_USER AUTH_TYPE = $AUTH_TYPE CONTENT_TYPE = $CONTENT_TYPE CONTENT_LENGTH = $CONTENT_LENGTH

Aufrufendes Formular

Vorl¨ aufige Version

263

c 2003 Peter Thiemann

Ausgabe von test-cgi CGI/1.0 test script report: argc is 0. argv is . SERVER_SOFTWARE = Apache/1.3.9 (Unix) SERVER_NAME = hanauma.informatik.uni-freiburg.de GATEWAY_INTERFACE = CGI/1.1 SERVER_PROTOCOL = HTTP/1.0 SERVER_PORT = 80 REQUEST_METHOD = GET HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */* PATH_INFO = extra/parameters PATH_TRANSLATED = /usr/local/www/data/extra/parameters SCRIPT_NAME = /cgi-bin/test-cgi QUERY_STRING = text%3D1=value+for+text%3D1&text%3D2=nothing+really%2B%26%21 REMOTE_HOST = REMOTE_ADDR = 127.0.0.1 REMOTE_USER = AUTH_TYPE = CONTENT_TYPE = CONTENT_LENGTH =

Vorl¨ aufige Version

264

c 2003 Peter Thiemann

6.4

File Upload

Wert eines Eingabefeldes ist Inhalt einer Datei Probleme: • Dateigr¨ oße macht Anh¨ angen an URL unm¨ oglich • Dateiinhalt u oße ¨berwiegend nicht-ASCII: URL Kodierung expandiert die Gr¨ um Faktor 3 ¨ • Ubertragung von Metadaten, wie Dateiname, content type, etc L¨ osung: Verwendung von (Attributen von ) • method="POST" • enctype="multipart/form-data" (neuer MIME-Typ RFC 1521)

Vorl¨ aufige Version

265

c 2003 Peter Thiemann

Beispiel File to process: Verschickt Anfrage mit Header Content-type: multipart/form-data; boundary=hboundary-string i hboundary-string i soll nicht in den Felddaten vorkommen Der hmessage-body i wiederholt --hboundary-string i Content-Disposition: form-data; name="hFeldname i"[; filename="hDateiname i"] Content-Type: hcontent type i hInhalt des Feldes i und endet mit --hboundary-string i-Vorl¨ aufige Version

266

c 2003 Peter Thiemann

Mehrere Selektionen in einem Feld (Feld Header) hboundary-string i Content-Disposition: form-data; name="hFeldname i" Content-Type: multipart/mixed; boundary=hinterner boundary-string i hInhalt i Inhalt eines multipart/mixed Feldes • Wiederholung von --hinterner boundary-string i Content-disposition: attachment; filename="file1.txt" Content-Type: hcontent-type i h... Inhalt von file1.txt ... i • Beenden mit --hinterner boundary-string i--

Vorl¨ aufige Version

267

c 2003 Peter Thiemann

Kodierung von Nicht-ASCII Zeichen (RFC 1522) in Feldnamen hencoded-word i

::=

=?hcharset i?hencoding i?hencoded-text i?=

hcharset i

::=

ISO-8859-1 | . . .

hencoding i

::=

B|Q

• Falls hencoding i = B, so ist hencoded-text i mit base64 (RFC 1521) kodiert. • Falls hencoding i = Q, so ist hencoded-text i mit quoted-printable (RFC 1521) kodiert.

Vorl¨ aufige Version

268

c 2003 Peter Thiemann