001 package org.shiftone.jrat.http; 002 003 import org.shiftone.jrat.util.io.IOUtil; 004 import org.shiftone.jrat.util.log.Logger; 005 006 import java.io.*; 007 import java.net.ServerSocket; 008 import java.net.Socket; 009 010 /** 011 * @author jeff@shiftone.org (Jeff Drost) 012 */ 013 public class Server extends Thread { 014 015 private static final Logger LOG = Logger.getLogger(Server.class); 016 private final int port; 017 private ServerSocket serverSocket; 018 private Handler handler; 019 020 public Server(int port) { 021 this.port = port; 022 setDaemon(true); 023 setName("HTTP Server"); 024 } 025 026 027 public Handler getHandler() { 028 return handler; 029 } 030 031 public void setHandler(Handler handler) { 032 this.handler = handler; 033 } 034 035 private void initialize() { 036 037 try { 038 039 LOG.info("starting on port " + port + "..."); 040 serverSocket = new ServerSocket(port); 041 042 } catch (Throwable e) { 043 044 throw new RuntimeException(e); 045 046 } 047 } 048 049 private void processRequest(Socket socket) throws Exception { 050 051 InputStream inputStream = null; 052 OutputStream outputStream = null; 053 054 try { 055 056 inputStream = socket.getInputStream(); 057 outputStream = socket.getOutputStream(); 058 059 Request request = new Request(inputStream); 060 Response response = new Response(outputStream); 061 062 try { 063 handler.handle(request, response); 064 } catch (HttpException e) { 065 handleException(response, e); 066 } 067 068 response.flush(); 069 070 } finally { 071 072 IOUtil.close(inputStream); 073 IOUtil.close(outputStream); 074 075 } 076 077 } 078 079 private void handleException(Response response, HttpException e) throws IOException { 080 response.setStatus(e.getStatus()); 081 Writer out = response.getWriter(); 082 out.write("<h1>HTTP "); 083 out.write(String.valueOf(e.getStatus().getCode())); 084 out.write(" - "); 085 out.write(e.getStatus().getMessage()); 086 out.write("</h1>"); 087 StringWriter stringWriter = new StringWriter(); 088 PrintWriter printWriter = new PrintWriter(stringWriter); 089 e.printStackTrace(printWriter); 090 printWriter.flush(); 091 out.write("<pre>"); 092 out.write(stringWriter.toString()); 093 out.write("</pre>"); 094 } 095 096 public void run() { 097 098 initialize(); 099 100 while (true) { 101 102 try { 103 processRequest(serverSocket.accept()); 104 } catch (Throwable e) { 105 LOG.error("failed to processRequest request", e); 106 } 107 108 } // while 109 110 } 111 112 public static void main(String[] args) { 113 Dispatcher dispatcher = new Dispatcher("Root Dispatcher"); 114 Server server = new Server(8008); 115 server.setHandler(dispatcher); 116 server.setDaemon(false); 117 server.start(); 118 119 Dispatcher dispatcher2 = new Dispatcher("dispatcher2"); 120 dispatcher.addRoute("1", dispatcher2); 121 dispatcher.addRoute("2", dispatcher2); 122 dispatcher.addRoute("3", dispatcher2); 123 dispatcher.addRoute("4", dispatcher2); 124 dispatcher.addRoute("5", dispatcher2); 125 126 dispatcher.addRoute("fs", new FsBrowseHandler()); 127 128 Dispatcher dispatcher3 = new Dispatcher("dispatcher3"); 129 dispatcher2.addRoute("a", dispatcher3); 130 dispatcher2.addRoute("b", dispatcher3); 131 dispatcher2.addRoute("c", dispatcher3); 132 dispatcher2.addRoute("d", dispatcher3); 133 134 } 135 136 137 }