package nodebox.versioncheck; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; import java.util.StringTokenizer; public class MockAppcastServer implements Runnable { private static final File mediaRoot; private final int port; private boolean running; private ServerSocket server; static { mediaRoot = new File("src/test/java/nodebox/versioncheck"); } public MockAppcastServer(int port) { this.port = port; } public void run() { running = true; try { server = new ServerSocket(port); while (running) { Socket socket = server.accept(); handleRequest(socket); } } catch (IOException ignored) { } } public boolean isRunning() { return running; } public void stop() { if (!running) return; running = false; if (server != null) { try { server.close(); } catch (IOException e) { e.printStackTrace(); } } server = null; } private void handleRequest(Socket socket) throws IOException { PrintStream os = new PrintStream(new BufferedOutputStream(socket.getOutputStream())); BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = is.readLine(); if (line == null) return; String version = ""; StringTokenizer st = new StringTokenizer(line); String method = st.nextToken(); String fileName = st.nextToken(); if (st.hasMoreTokens()) { version = st.nextToken(); } //read header but ignore while ((line = is.readLine()) != null) { if (line.trim().equals("")) break; } //we only do GET if (method.equals("GET") || method.equals("HEAD")) { boolean headOnly = false; if (method.equals("HEAD")) { headOnly = true; } byte[] data; File f = new File(mediaRoot, fileName); try { data = readFileAsString(f).getBytes(); String header = "HTTP/1.0 200 OK\r\n"; header += standardHeaders(); header += "Content-length: " + data.length + "\r\n"; header += "Content-type: text/xml\r\n\r\n"; os.print(header); if (!headOnly) { os.write(data); } } catch (IOException e) { String header = "HTTP/1.0 404 Not Found\r\n"; header += standardHeaders(); os.print(header); } os.flush(); os.close(); } else { //not a get/head so output error if (version.startsWith("HTTP/")) { //send headers String header = "HTTP/1.0 501 Not Implemented\r\n"; header += standardHeaders(); header += "Content-type: text/html\r\n\r\n"; os.print(header); } os.println("<HTML><HEAD><TITLE>Not Implemented</TITLE><HEAD>"); os.println("<BODY><H1>HTTP Error 501: Not Implemented</H1></BODY></HTML>"); } os.close(); socket.close(); } /** * Send standard HTTP headers. * * @return String with standard headers. */ private String standardHeaders() { //Date now = LazyDate.getDate(); Date now = new Date(); return "Date: " + now + "\r\nServer: MockAppcastServer http 1.0\r\n"; } /** * Read in a file at the given path and return its contents as a string. * * @param f the file to open. * @return the contents of the file as a string. * @throws java.io.IOException if the file could not be read. */ private static String readFileAsString(File f) throws java.io.IOException { StringBuilder fileData = new StringBuilder(1000); BufferedReader reader = new BufferedReader( new FileReader(f)); char[] buf = new char[1024]; int numRead; while ((numRead = reader.read(buf)) != -1) { String readData = String.valueOf(buf, 0, numRead); fileData.append(readData); buf = new char[1024]; } reader.close(); return fileData.toString(); } public static void main(String[] args) { MockAppcastServer server = new MockAppcastServer(8080); server.run(); } }