package de.tudarmstadt.informatik.hostage.protocol; import java.security.SecureRandom; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import java.util.Locale; import java.util.TimeZone; /** * HTTP protocol * @author Wulf Pfeiffer */ public class HTTP implements Protocol { public int getPort() { return 80; } public TALK_FIRST whoTalksFirst() { return TALK_FIRST.CLIENT; } public List processMessage(String message) { List response = new ArrayList(); request = message + request; if(!message.contains(version)){ response.add(buildPacket(c505, "")); } else if(message.contains(get)) { response.add(buildPacket(c200, get)); } else if(message.contains(head)) { response.add(buildPacket(c200, head)); } else if(message.contains(trace)){ response.add(buildPacket(c200, trace)); } else if(message.contains(options)){ response.add(buildPacket(c400, options)); } else if(message.contains(post)){ response.add(buildPacket(c200, post)); } else if(message.contains(put)){ response.add(buildPacket(c400, put)); } else if(message.contains(delete)){ response.add(buildPacket(c200, delete)); } else if(message.contains(connect)){ response.add(buildPacket(c400, connect)); } else { response.add(buildPacket(c400, "")); } return response; } public boolean isClosed() { return true; } public boolean isSecure() { return false; } public Class getType() { return String.class; } public String toString() { return "HTTP"; } /** * Builds a html response that can be sent * @param code response code that was determined * @param type request type that was sent by the client * @return the html response */ private String buildPacket(String code, String type) { String doc = ""; if(type.equals(get)) doc = htmlDoc; else if(type.equals(head) || type.equals(delete)) doc = ""; else if(type.equals(trace)) doc = request; else doc = errorHtmlPrefix + " " + code + errorHtmlSuffix; return version + " " + code + headerPrefix + doc.length() + headerSuffix + doc; } /** * Get the current time in html header format. * @return the formatted server time. */ private String getServerTime() { Calendar calendar = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat( "EEE, dd MMM yyyy HH:mm:ss z", Locale.US); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); return dateFormat.format(calendar.getTime()); } private String getQuote() { // String[] sources = new String[]{"djxmmx.net", "ota.iambic.com", "alpha.mike-r.com", "electricbiscuit.org"}; // SecureRandom rndm = new SecureRandom(); // StringBuffer sb = new StringBuffer(); // try { // Socket client = new Socket(sources[rndm.nextInt(4)], 17); // BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); // while(!in.ready()); // while(in.ready()) { // sb.append(in.readLine()); // } // in.close(); // client.close(); // } catch (Exception e) { // e.printStackTrace(); // } // return sb.toString(); return ""; } private String[][][] possibleVersions = { {{"Apache/2.0."},{"28","32","35","36","39","40","42","43","44","45","46","47","48","49","50","51","52","53","54","55","58","59","61","63","64","65"}}, {{"Apache/2.2."},{"0","2","3","4","6","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25"}}, {{"Apache/2.3."},{"4","5","6","8","10","11","12","14","15","16"}}, {{"Apache/2.4."},{"1","2","3","4","6"}} }; private SecureRandom rndm = new SecureRandom(); private int majorVersion = rndm.nextInt(3); private final String serverVersion = possibleVersions[majorVersion][0][0] + possibleVersions[majorVersion][1][rndm.nextInt(possibleVersions[majorVersion][1].length)]; //html header pre and suffix private final String headerPrefix = "Date: " + getServerTime() + "\r\n" + "Server: " + serverVersion + " \r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: "; private String headerSuffix = "\r\n" + "Keep-Alive: timeout=5, max=100\r\n" + "Connection: Keep-Alive\r\n" + "Content-Type: text/html\r\n" + "\r\n"; //html website private String htmlDoc = "\n" + "\n" + "\n" + "\n" + "" + getQuote() + "\n" + "\n" + ""; //html error pre and suffix private String errorHtmlPrefix = "\n" + "\n" + "\n" + "\n" + ""; private String errorHtmlSuffix = "\n" + "\n" + ""; /** Whole request that was sent by the client */ private String request = ""; private String version = "HTTP/1.1"; //request codes private String options = "OPTIONS"; private String get = "GET"; private String head = "HEAD"; private String post = "POST"; private String put = "PUT"; private String delete = "DELETE"; private String trace = "TRACE"; private String connect = "CONNECT"; private String c200 = "200 OK\r\n"; private String c400 = "400 Bad Request\r\n"; private String c505 = "505 HTTP Version not supported\r\n"; }