Mercurial Hosting > luan
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); + } + } + +}