// Vernetzte Systeme, WS00/01, Serie 5 // // this version uses HEAD to determine the type of the data // and decides upon that whether to download the data import java.net.*; import java.io.*; public class UserAgent22c_http11 { public static void load(String host, String url) throws IOException { Socket s = new Socket(host, 80); PrintWriter s_out = new PrintWriter(s.getOutputStream()); BufferedReader s_in = new BufferedReader(new InputStreamReader(s.getInputStream())); s_out.println("HEAD /"+url+" HTTP/1.1"); s_out.println("Host: "+host); // eigentlich notwendig fuer 1.1, aber manche Server akzeptieren es auch ohne s_out.println(); s_out.println(); s_out.flush(); String line; String typeStr = ""; while (true) { line = s_in.readLine(); // Abschluss der Header-Daten wird durch Leerzeile angezeigt if (line.length() == 0) { break; } // Suche nach Header "Content-Type" int pos = line.indexOf(":"); if (pos > -1) { String left = line.substring(0, pos); String right = line.substring(pos+2); // skip ": " if (left.startsWith("Content-Type")) { typeStr = right; } } } // Falls Text, sende zweiten Request, um Daten zu holen if (typeStr.startsWith("text/")) { // Trick 17: benutze nun HTTP/1.0, damit der Server nach // dem Ende der Uebertragung die Verbindung schliesst // Sonst muesste man evtl. bytes zählen. s_out.println("GET /"+url+" HTTP/1.0"); //s_out.println("Host: "+host); // in 1.0 nicht notwendig s_out.println(); s_out.println(); s_out.flush(); boolean inHeader = true; // Ende der Uebertragung: line == null // Ende der Header-Daten durch Leerzeile while ((line = s_in.readLine()) != null) { if (inHeader && line.length() == 0) { inHeader = false; } else if (!inHeader) { System.out.println(line); } } } else { System.out.println("[Kann Daten vom Typ '"+typeStr+"' nicht anzeigen]"); } s.close(); } public static void main(String[] args) throws IOException { if (args.length < 2) { System.err.println("Please give 2 parameters: "); System.exit(1); } load(args[0], args[1]); } }