/* ** This file is part of Filius, a network construction and simulation software. ** ** Originally created at the University of Siegen, Institute "Didactics of ** Informatics and E-Learning" by a students' project group: ** members (2006-2007): ** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding, ** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer ** supervisors: ** Stefan Freischlad (maintainer until 2009), Peer Stechert ** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de> ** and Stefan Freischlad ** Filius is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 2 of the License, or ** (at your option) version 3. ** ** Filius is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ** PURPOSE. See the GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with Filius. If not, see <http://www.gnu.org/licenses/>. */ package filius.software.www; import java.util.StringTokenizer; import filius.Main; import filius.rahmenprogramm.I18n; public class HTTPNachricht implements I18n { public static final int SERVER = 0, CLIENT = 1; public static final String GET = "GET", POST = "POST"; public static final String TEXT_HTML = "text/html", IMAGE_PNG = "image/png", IMAGE_BMP = "image/bmp", IMAGE_GIF = "image/gif", IMAGE_JPG = "image/jpg"; private String contentType = null; private String host = null; private String protocolVersion = "HTTP/1.1"; private String method = null; private int statusCode = 0; private int mode = CLIENT; private StringBuffer daten = null; private String pfad = null; /** * Zur Erzeugung einer neuen HTTP-Nachricht. Unterschieden werden Server- * und Client-Nachrichten. Danach richtet sich, welche Attribute des * Kopfteils (Header) verwendet werden. * * @param mode * ob es sich um eine SERVER- oder CLIENT-Nachricht handelt. */ public HTTPNachricht(int mode) { this.mode = mode; } /** * Methode zur Rekonstruktion einer HTTP-Nachricht aus einem String, der * durch Aufruf der Methode toString() erzeugt wurde. * * @param nachricht */ public HTTPNachricht(String nachricht) { Main.debug.println("INVOKED ("+this.hashCode()+") "+getClass()+" (HTTPNachricht), constr: HTTPNachricht("+nachricht+")"); StringTokenizer tokenizer; String token; String[] zeilen; zeilen = nachricht.split("\n"); if (zeilen.length > 0) { tokenizer = new StringTokenizer(zeilen[0], " "); if (tokenizer.hasMoreTokens()) { token = tokenizer.nextToken().trim(); if (token.equalsIgnoreCase(GET) || token.equalsIgnoreCase(POST)) { method = token; // Main.debug.println("Method: " + method); token = tokenizer.nextToken().trim(); pfad = token; // Main.debug.println("Pfad: " + pfad); token = tokenizer.nextToken().trim(); protocolVersion = token; // Main.debug.println("Protokoll-Version: " + protocolVersion); for (int i = 1; i < zeilen.length; i++) { if (zeilen[i].equals("") && method.equalsIgnoreCase(POST)) { daten = new StringBuffer(); for (int j = i; j < zeilen.length; j++) { daten.append(zeilen[j]); if (j < zeilen.length - 1) daten.append("\n"); } i = zeilen.length; } else { tokenizer = new StringTokenizer(zeilen[i], " "); token = tokenizer.nextToken().trim(); if (token.equalsIgnoreCase("host:")) { host = tokenizer.nextToken().trim(); } } } } else { protocolVersion = token; //Main.debug.println("Protokoll-Version: " + protocolVersion); token = tokenizer.nextToken().trim(); statusCode = Integer.parseInt(token); // Main.debug.println("Status-Code: " + statusCode); for (int i = 1; i < zeilen.length; i++) { if (zeilen[i].equals("")) { daten = new StringBuffer(); for (int j = i+1; j < zeilen.length; j++) { daten.append(zeilen[j]); if (j < zeilen.length - 1) daten.append("\n"); } i = zeilen.length; // Main.debug.println("Daten: " + daten.toString()); } else { tokenizer = new StringTokenizer(zeilen[i], " "); token = tokenizer.nextToken().trim(); if (token.equalsIgnoreCase("content-type:")) { contentType = tokenizer.nextToken().trim(); } } } } } } } public String toString() { StringBuffer buffer = new StringBuffer(); if (mode == CLIENT && method != null && pfad != null && protocolVersion != null) { buffer.append(method + " " + getPfad() + " " + protocolVersion + "\n"); if (host != null) { buffer.append("Host: " + host + "\n"); } if (method.equals(POST) && daten != null) { buffer.append("\n" + daten); } } else if (mode == SERVER && protocolVersion != null) { buffer.append(protocolVersion + " " + statusCode + " " + holeStatusNachricht(statusCode) + "\n"); if (contentType != null) { buffer.append("Content-type: " + contentType + "\n"); } if (daten != null) { buffer.append("\n" + daten); } } return buffer.toString(); } public static String holeStatusNachricht(int code) { Main.debug.println("INVOKED (static) filius.software.www.HTTPNachricht, holeStatusNachricht("+code+")"); if (code == 100) return "Continue"; if (code == 101) return "Switching Protocols"; if (code == 102) return "Processing"; if (code == 200) return "OK"; if (code == 201) return "Created"; if (code == 202) return "Accepted"; if (code == 203) return "Non-Authoritative Information"; if (code == 204) return "No Content"; if (code == 205) return "Reset Content"; if (code == 206) return "Partial Content"; if (code == 207) return "Multi-Status"; if (code == 300) return "Multiple Choice"; if (code == 301) return "Moved Permanently"; if (code == 302) return "Found"; if (code == 303) return "See Other"; if (code == 304) return "Not Modified"; if (code == 305) return "Use Proxy"; if (code == 307) return "Temporary Redirect"; if (code == 400) return "Bad Request"; if (code == 401) return "Unauthorized"; if (code == 402) return "Payment Required"; if (code == 403) return "Forbidden"; if (code == 404) return "Not Found"; if (code == 405) return "Method Not Allowed"; if (code == 406) return "Not Acceptable"; if (code == 407) return "Proxy Authentication Required"; if (code == 408) return "Request Time-out"; if (code == 409) return "Conflict"; if (code == 410) return "Gone"; if (code == 411) return "Length Required"; if (code == 412) return "Precondition Failed"; if (code == 413) return "Request Entity Too Large"; if (code == 414) return "Request-URI Too Long"; if (code == 415) return "Unsupported Media Type"; if (code == 416) return "Requested range not satisfiable"; if (code == 417) return "Expectation Failed"; if (code == 422) return "Unprocessable Entity"; if (code == 423) return "Locked"; if (code == 424) return "Failed Dependency"; if (code == 500) return "Internal Server Error"; if (code == 501) return "Not Implemented"; if (code == 502) return "Bad Gateway"; if (code == 503) return "Service Unavailable"; if (code == 504) return "Gateway Time-out"; if (code == 505) return "HTTP Version not supported"; if (code == 507) return "Insufficient Storage"; if (code == 509) return "Bandwidth Limit Exceeded"; if (code >= 100 && code < 200) return messages.getString("sw_httpnachricht_msg1"); if (code >= 200 && code < 300) return messages.getString("sw_httpnachricht_msg2"); if (code >= 300 && code < 400) return messages.getString("sw_httpnachricht_msg3"); if (code >= 400 && code < 500) return messages.getString("sw_httpnachricht_msg4"); if (code >= 500 && code < 600) return messages.getString("sw_httpnachricht_msg5"); return null; } /** * @return the contentType */ public String getContentType() { return contentType; } /** * @param contentType * the contentType to set */ public void setContentType(String contentType) { this.contentType = contentType; } /** * @return the daten */ public String getDaten() { if (daten == null) return null; else return daten.toString(); } /** * @param daten * the daten to set */ public void setDaten(String data) { if (data == null) daten = null; else daten = new StringBuffer(data); } /** * @return the host */ public String getHost() { return host; } /** * @param host * the host to set */ public void setHost(String host) { this.host = host; } /** * @return the method */ public String getMethod() { return method; } /** * @param method * the method to set */ public void setMethod(String method) { this.method = method; } /** * @return the pfad */ public String getPfad() { if (pfad.trim().equals("")) return "/"; else return pfad; } /** * @param pfad * the pfad to set */ public void setPfad(String pfad) { this.pfad = pfad; } /** * @return the protocolVersion */ public String getProtocolVersion() { return protocolVersion; } /** * @param protocolVersion * the protocolVersion to set */ public void setProtocolVersion(String protocolVersion) { this.protocolVersion = protocolVersion; } /** * @return the statusCode */ public int getStatusCode() { return statusCode; } /** * @param statusCode * the statusCode to set */ public void setStatusCode(int statusCode) { this.statusCode = statusCode; } }