/* Vernetzte Systeme, WS 2001/2002, Uebung 5, Aufgabe 21 c * * Demonstration des HTTP/1.1-Protokolls: * Benutze HEAD um den Datentyp zu erkennen * falls Text, lade Daten und gib die Nutzdaten aus (ohne Header) */ import java.net.*; import java.io.*; public class UserAgent21c_http11 { public static void load(String host, String document) throws IOException { Socket s = new Socket(host, 80); PrintWriter out = new PrintWriter(s.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); // HTTP HEAD-Request, Protokollversion 1.1 out.println("HEAD " + document + " HTTP/1.1"); out.println("Host: " + host); // notwendig fuer 1.1 out.println(); // Leerzeile, signalisiert Ende des (mehrzeiligen) Headers out.flush(); // Header (noch im Ausgabepuffer) jetzt übers Netz senden String line; String contentType = null; while (true) { line = in.readLine(); // Abschluss der Header-Daten wird durch Leerzeile angezeigt if (line == null || line.length() == 0) { break; } if (line.startsWith("Content-Type:")) { contentType = line.substring("Content-Type: ".length()); } } // Falls Text, sende zweiten Request, um Daten zu holen if (contentType != null && contentType.startsWith("text/")) { /* HTTP 1.1 erlaubt standardmässig das Senden weiterer * Requests über die gleiche TCP-Verbindung (RFC 2068, * 8.1, Persistent Connections). Daher müssen wir für das * Senden des zweiten Requests keine neue Verbindung * aufmachen, sondern können die bestehende auch zum * Senden des nachfolgenden GET-Requests verwenden. */ /* HTTP GET-Request, Protokollversion 1.1 * Die Header-Zeile "Connection: Close" signalisiert, dass * der Client die Verbindung unmittelbar nach Empfang der * Antwort abbrechen wird (RFC 2068, 14.10, Connection). */ out.println("GET " + document + " HTTP/1.1"); out.println("Host: " + host); out.println("Connection: Close"); out.println(); out.flush(); /* Header lesen und ignorieren * Ende der Uebertragung: line == null * Ende der Header-Daten durch Leerzeile */ while ((line = in.readLine()) != null && line.length() > 0) { // Header ignorieren } /* Nutzdaten lesen und ausgeben * Ende der Uebertragung: line == null */ while ((line = in.readLine()) != null) { System.out.println(line); } } else { System.out.println("[Kann Daten vom Typ '" + contentType + "' nicht anzeigen]"); } in.close(); out.close(); s.close(); } public static void main(String[] args) throws IOException { if (args.length == 2) { load(args[0], args[1]); } else { System.out.println("Bitte zwei Parameter angeben: "); System.out.println("Beispiel: java UserAgent21c_http11 www.inf.ethz.ch /index.html"); } } }