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