diff src/luan/webserver/Connection.java @ 1137:c123ee15f99b

add webserver
author Franklin Schmidt <fschmidt@gmail.com>
date Mon, 29 Jan 2018 18:49:59 -0700
parents
children 4189027691b7
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/luan/webserver/Connection.java	Mon Jan 29 18:49:59 2018 -0700
@@ -0,0 +1,82 @@
+package luan.webserver;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import luan.lib.parser.ParseException;
+
+
+final class Connection {
+	private static final Logger logger = LoggerFactory.getLogger(Connection.class);
+
+	private final Server server;
+	private final Socket socket;
+
+	Connection(Server server,Socket socket) {
+		this.server = server;
+		this.socket = socket;
+		handle();
+	}
+
+	private void handle() {
+		try {
+			InputStream in = socket.getInputStream();
+			byte[] a = new byte[8192];
+			int endOfHeader;
+			int size = 0;
+			int left = a.length;
+			outer: while(true) {
+				int n = in.read(a,size,left);
+				if( n == -1 )
+					throw new IOException("unexpected end of input at "+size);
+				size += n;
+				for( int i=0; i<=size-4; i++ ) {
+					if( a[i]=='\r' && a[i+1]=='\n' && a[i+2]=='\r' && a[i+3]=='\n' ) {
+						endOfHeader = i + 4;
+						break outer;
+					}
+				}
+				left -= n;
+				if( left == 0 ) {
+					byte[] a2 = new byte[2*a.length];
+					System.arraycopy(a,0,a2,0,size);
+					a = a2;
+					left = a.length - size;
+				}
+			}
+			String rawRequest = new String(a,0,endOfHeader);
+//System.out.println(rawRequest);
+			Request request = RequestHeadParser.parse(rawRequest);
+//System.out.println(request.headers);
+
+			Response response = server.handler.handle(request);
+			response.headers.put("Connection","close");
+			response.headers.put("Content-Length",Long.toString(response.body.length));
+			byte[] header = response.toHeaderString().getBytes();
+	
+			OutputStream out = socket.getOutputStream();
+			out.write(header);
+			copyAll(response.body.content,out);
+			out.close();
+			socket.close();
+		} catch(IOException e) {
+			logger.info("",e);
+		} catch(ParseException e) {
+			logger.info("",e);
+		}
+	}
+
+	private static void copyAll(InputStream in,OutputStream out)
+		throws IOException
+	{
+		byte[] a = new byte[8192];
+		int n;
+		while( (n=in.read(a)) != -1 ) {
+			out.write(a,0,n);
+		}
+	}
+
+}