/* Vernetzte Systeme, WS 2001/2002, Uebung 5, Aufgabe 21 c * * Demonstration des HTTP/1.0-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_http10 { 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.0 out.println("HEAD " + document + " HTTP/1.0"); out.println(); // Leerzeile, signalisiert Ende des 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()); } } /* Bei HTTP 1.0 kann nur jeweils ein Request (hier ein * HEAD-Request) über eine TCP-Verbindung gesendet * werden. Daher wird die Verbindung nun geschlossen. */ in.close(); out.close(); s.close(); // Falls Text, sende zweiten Request, um Daten zu holen if (contentType != null && contentType.startsWith("text/")) { /* Bei HTTP 1.0 kann nur jeweils ein Request über eine * TCP-Verbindung geschickt werden. Daher wird hier zum * Senden des GET-Requests eine zweite Verbindung * aufgemacht. */ s = new Socket(host, 80); out = new PrintWriter(s.getOutputStream()); in = new BufferedReader(new InputStreamReader(s.getInputStream())); // HTTP GET-Request, Protokollversion 1.0 out.println("GET " + document + " HTTP/1.0"); 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); } in.close(); out.close(); s.close(); } else { System.out.println("[Kann Daten vom Typ '" + contentType + "' nicht anzeigen]"); } } 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"); } } }