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 }