diff options
Diffstat (limited to 'simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatApplication.java')
-rw-r--r-- | simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatApplication.java | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatApplication.java b/simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatApplication.java new file mode 100644 index 0000000..7d27b9f --- /dev/null +++ b/simple/simple-http/src/test/java/org/simpleframework/http/socket/WebSocketChatApplication.java @@ -0,0 +1,170 @@ +package org.simpleframework.http.socket; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.Map; + +import javax.net.ssl.SSLContext; + +import org.simpleframework.common.buffer.Allocator; +import org.simpleframework.common.buffer.ArrayAllocator; +import org.simpleframework.http.Cookie; +import org.simpleframework.http.Request; +import org.simpleframework.http.Response; +import org.simpleframework.http.Status; +import org.simpleframework.http.core.Container; +import org.simpleframework.http.core.ContainerTransportProcessor; +import org.simpleframework.http.socket.service.Router; +import org.simpleframework.http.socket.service.RouterContainer; +import org.simpleframework.http.socket.service.DirectRouter; +import org.simpleframework.transport.TransportProcessor; +import org.simpleframework.transport.TransportSocketProcessor; +import org.simpleframework.transport.SocketProcessor; +import org.simpleframework.transport.Transport; +import org.simpleframework.transport.connect.Connection; +import org.simpleframework.transport.connect.SocketConnection; +import org.simpleframework.transport.trace.TraceAnalyzer; + +public class WebSocketChatApplication implements Container, TransportProcessor { + + private final WebSocketCertificate certificate; + private final Router negotiator; + private final RouterContainer container; + private final SocketAddress address; + private final Connection connection; + private final TransportProcessor processor; + private final Allocator allocator; + private final SocketProcessor server; + + public WebSocketChatApplication(WebSocketChatRoom service, WebSocketCertificate certificate, TraceAnalyzer agent, int port) throws Exception { + this.negotiator = new DirectRouter(service); + this.container = new RouterContainer(this, negotiator, 10); + this.allocator = new ArrayAllocator(); + this.processor = new ContainerTransportProcessor(container, allocator, 1); + this.server = new TransportSocketProcessor(this); + this.connection = new SocketConnection(server, agent); + this.address = new InetSocketAddress(port); + this.certificate = certificate; + } + + public void connect() throws Exception { + // if(certificate != null) { + // SSLContext context = certificate.getContext(); + // + // connection.connect(address, context); + // container.start(); + // } else { + connection.connect(address); + // } + } + + public void handle(Request req, Response resp) { + System.err.println(req); + + if(req.getTarget().equals("/")) { + long time = System.currentTimeMillis(); + + try { + resp.setDate("Date", time); + resp.setValue("Server", "WebSocketChatApplication/1.0"); + resp.setContentType("text/html"); + String page = loadPage("WebSocketChatLogin.html"); + + resp.setDate("Date", time); + resp.setValue("Server", "WebSocketChatApplication/1.0"); + resp.setContentType("text/html"); + + PrintStream out = resp.getPrintStream(); + out.println(page); + out.close(); + }catch(Exception e) { + e.printStackTrace(); + } + } else if(req.getTarget().equals("/login")) { + String user = req.getParameter("user"); + long time = System.currentTimeMillis(); + + try { + resp.setStatus(Status.FOUND); + resp.setValue("Location", "/chat"); + resp.setCookie("user", user); + resp.setDate("Date", time); + resp.setValue("Server", "WebSocketChatApplication/1.0"); + resp.setContentType("text/html"); + resp.close(); + }catch(Exception e) { + e.printStackTrace(); + } + } else if(req.getTarget().equals("/chat")) { + long time = System.currentTimeMillis(); + + try { + Cookie user = req.getCookie("user"); + String name = user.getValue(); + String page = loadPage("WebSocketChatRoom.html"); + + resp.setDate("Date", time); + resp.setValue("Server", "WebSocketChatApplication/1.0"); + resp.setContentType("text/html"); + + PrintStream out = resp.getPrintStream(); + page = page.replaceAll("%1", name); + out.println(page); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + } + } else if(req.getTarget().equals("/talk")){ + long time = System.currentTimeMillis(); + try { + container.handle(req, resp); + } catch(Exception e) { + e.printStackTrace(); + } + } else { + long time = System.currentTimeMillis(); + + try { + resp.setCode(404); + resp.setDescription("Not Found"); + resp.setDate("Date", time); + resp.setValue("Server", "WebSocketChatApplication/1.0"); + resp.setContentType("text/plain"); + + PrintStream out = resp.getPrintStream(); + + out.println("Not Found"); + out.close(); + } catch(Exception e) { + e.printStackTrace(); + } + } + } + + public String loadPage(String name) throws IOException { + InputStream loginPage = WebSocketChatApplication.class.getResourceAsStream(name); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] chunk = new byte[1024]; + int count = 0; + + while((count = loginPage.read(chunk)) != -1) { + out.write(chunk, 0, count); + } + out.close(); + return out.toString(); + } + + public void process(Transport transport) throws IOException { + Map map = transport.getAttributes(); + map.put(Transport.class, transport); + processor.process(transport); + } + + public void stop() throws IOException { + processor.stop(); + } +} |