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    }