001 package org.shiftone.jrat.core.command; 002 003 import org.shiftone.jrat.core.spi.Commandlet; 004 import org.shiftone.jrat.util.io.IOUtil; 005 import org.shiftone.jrat.util.log.Logger; 006 007 import java.io.*; 008 import java.net.ServerSocket; 009 import java.net.Socket; 010 011 /** 012 * @author jeff@shiftone.org (Jeff Drost) 013 */ 014 public class TinyWebServer extends Thread { 015 016 private static final Logger LOG = Logger.getLogger(TinyWebServer.class); 017 018 private ServerSocket serverSocket = null; 019 private int flushNumber; 020 private final CommandletRegistry registry; 021 private final int port; 022 023 public TinyWebServer(CommandletRegistry registry, int port) { 024 this.registry = registry; 025 this.port = port; 026 setDaemon(true); 027 setName("HTTP"); 028 } 029 030 031 private Commandlet readRequest(Socket socket) throws IOException { 032 033 boolean doRefresh = false; 034 InputStream inputStream = null; 035 LineNumberReader reader = null; 036 037 inputStream = socket.getInputStream(); 038 reader = new LineNumberReader(new InputStreamReader(inputStream)); 039 040 String line; 041 042 line = reader.readLine(); 043 044 String commandletKey = null; 045 int a = line.indexOf(' '); 046 int b = line.lastIndexOf(' '); 047 String uri = line.substring(a + 1, b); 048 LOG.info("LINE = " + line + ">" + uri + "<"); 049 int commandletIndex = uri.indexOf("commandlet="); 050 051 if (commandletIndex != -1) { 052 053 commandletKey = uri.substring(commandletIndex + 11); 054 LOG.info("commandletKey = " + commandletKey); 055 056 } 057 058 while ((line != null) && (line.length() > 0)) { 059 line = reader.readLine(); 060 } 061 062 // the following code is kinda crapy 063 064 Commandlet commandlet = null; 065 066 if (commandletKey != null) { 067 commandlet = (Commandlet) registry.getCommandlets().get(commandletKey); 068 } 069 070 if (commandlet == null) { 071 LOG.warn("line(" + line + ") using default key"); 072 commandlet = registry.getDefaultCommandlet(); 073 } 074 075 return commandlet; 076 } 077 078 079 public void run() { 080 081 Socket socket = null; 082 OutputStream outputStream = null; 083 Writer writer = null; 084 long start; 085 086 try { 087 088 LOG.info("starting on port " + port + "..."); 089 090 serverSocket = new ServerSocket(port); 091 092 while (true) { 093 socket = serverSocket.accept(); 094 095 LOG.info("accept"); 096 097 try { 098 099 outputStream = socket.getOutputStream(); 100 writer = new OutputStreamWriter(outputStream); 101 start = System.currentTimeMillis(); 102 103 flushNumber++; 104 105 Commandlet commandlet = readRequest(socket); 106 107 writer.write("HTTP/1.1 200 OK\n"); 108 writer.write("Content-Type: " + commandlet.getContentType() + "\n"); 109 writer.write("Cache-Control: no-store, no-cache, must-revalidate\n"); // normal 110 writer.write("Cache-Control: post-check=0, pre-check=0"); // IE 111 writer.write("Pragma: no-cache\n"); // good luck 112 writer.write("Expires: Sat, 6 May 1995 12:00:00 GMT\n"); // more lock 113 writer.write("\n"); 114 writer.flush(); 115 116 commandlet.execute(outputStream); 117 118 outputStream.flush(); 119 120 } catch (Exception e) { 121 122 LOG.error("Flush error", e); 123 124 } finally { 125 126 IOUtil.close(writer); 127 IOUtil.close(outputStream); 128 IOUtil.close(socket); 129 130 } 131 } 132 } 133 catch (Exception e) { 134 135 LOG.error("unable to listen on port : " + port, e); 136 137 } 138 } 139 140 }