diff --git a/.classpath b/.classpath index 3f0bc57..49a1664 100644 --- a/.classpath +++ b/.classpath @@ -5,6 +5,7 @@ - + + diff --git a/javax.servlet-api-4.0.1.jar b/javax.servlet-api-4.0.1.jar new file mode 100644 index 0000000..844ec7f Binary files /dev/null and b/javax.servlet-api-4.0.1.jar differ diff --git a/src/dev/peerat/framework/Client.java b/src/dev/peerat/framework/Client.java index 58806f9..b587b83 100644 --- a/src/dev/peerat/framework/Client.java +++ b/src/dev/peerat/framework/Client.java @@ -26,7 +26,7 @@ public class Client extends Thread{ reader.readHeaders(); RequestType type = RequestType.valueOf(headers[0]); - context = new Context(type, headers[1], isLogin(router, type, reader), writer, router.getDefaultHeaders(type)); + context = new Context(type, headers[1], isLogin(type, reader), writer, router.getDefaultHeaders(type)); router.exec(context, reader, writer); writer.flush(); writer.close(); @@ -44,12 +44,12 @@ public class Client extends Thread{ if(context != null) logger.setValue(context); } - private User isLogin(Router router, RequestType type, HttpReader reader) throws InvalidJwtException{ + private User isLogin(RequestType type, HttpReader reader) throws InvalidJwtException{ String auth = reader.getHeader("Authorization"); if(auth == null) return null; auth = auth.substring(7); try{ - return this.router.getUser(auth); + return router.getUser(auth); }catch(InvalidJwtException e){ try{ writer.response(401, router.getDefaultHeaders(type)); diff --git a/src/dev/peerat/framework/HttpReader.java b/src/dev/peerat/framework/HttpReader.java index dee1cdd..fd9c81b 100644 --- a/src/dev/peerat/framework/HttpReader.java +++ b/src/dev/peerat/framework/HttpReader.java @@ -39,6 +39,11 @@ public class HttpReader{ this.reader = origin.reader; } + HttpReader(InputStream in, BufferedReader reader){ + this.in = in; + this.reader = reader; + } + public boolean isClosed(){ return this.socket.isClosed(); } diff --git a/src/dev/peerat/framework/HttpWriter.java b/src/dev/peerat/framework/HttpWriter.java index 3616336..08f999f 100644 --- a/src/dev/peerat/framework/HttpWriter.java +++ b/src/dev/peerat/framework/HttpWriter.java @@ -21,6 +21,11 @@ public class HttpWriter{ this.out = origin.out; this.writer = origin.writer; } + + public HttpWriter(OutputStream out, BufferedWriter writer){ + this.out = out; + this.writer = writer; + } public void write(byte[] buffer) throws IOException{ this.out.write(buffer); diff --git a/src/dev/peerat/framework/Router.java b/src/dev/peerat/framework/Router.java index a222eca..5f27295 100644 --- a/src/dev/peerat/framework/Router.java +++ b/src/dev/peerat/framework/Router.java @@ -9,6 +9,8 @@ import java.util.regex.Pattern; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLServerSocketFactory; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.jose4j.jwa.AlgorithmConstraints.ConstraintType; import org.jose4j.jwk.RsaJsonWebKey; @@ -101,7 +103,7 @@ public class Router{ if(this.mappers[context.getType().ordinal()].exec(context, reader, writer)) return; if(noFileFound != null) noFileFound.exec(null, context, reader, writer); } - + public Router configureSSL(String keyStore, String keyStorePassword){ System.setProperty("javax.net.ssl.keyStore", keyStore); System.setProperty("javax.net.ssl.keyStorePassword", keyStorePassword); @@ -133,6 +135,10 @@ public class Router{ return this.logger; } + public void useTomcat(){ + TomcatServlet.setRouter(this); + } + public void listen(int port, boolean ssl) throws Exception{ if (ssl) { // Not needed with the use of a proxy try { diff --git a/src/dev/peerat/framework/TomcatHttpReader.java b/src/dev/peerat/framework/TomcatHttpReader.java new file mode 100644 index 0000000..fa661fb --- /dev/null +++ b/src/dev/peerat/framework/TomcatHttpReader.java @@ -0,0 +1,27 @@ +package dev.peerat.framework; + +import javax.servlet.http.HttpServletRequest; + +public class TomcatHttpReader extends HttpReader{ + + private HttpServletRequest request; + + public TomcatHttpReader(HttpServletRequest request) throws Exception{ + super(request.getInputStream(), request.getReader()); + this.request = request; + } + + @Override + public boolean isClosed(){ + return false; + } + + @Override + void readHeaders() throws Exception{} + + @Override + public String getHeader(String key){ + return request.getHeader(key); + } + +} diff --git a/src/dev/peerat/framework/TomcatHttpWriter.java b/src/dev/peerat/framework/TomcatHttpWriter.java new file mode 100644 index 0000000..c909ae4 --- /dev/null +++ b/src/dev/peerat/framework/TomcatHttpWriter.java @@ -0,0 +1,24 @@ +package dev.peerat.framework; + +import java.io.BufferedWriter; + +import javax.servlet.http.HttpServletResponse; + +public class TomcatHttpWriter extends HttpWriter{ + + private HttpServletResponse response; + + public TomcatHttpWriter(HttpServletResponse response) throws Exception{ + super(response.getOutputStream(), new BufferedWriter(response.getWriter())); + this.response = response; + } + + @Override + void response(int code, String... headers) throws Exception { + response.setStatus(code); + for(String header : headers){ + String[] split = header.split("\\s*:\\s*"); + response.setHeader(split[0], split[1]); + } + } +} diff --git a/src/dev/peerat/framework/TomcatServlet.java b/src/dev/peerat/framework/TomcatServlet.java new file mode 100644 index 0000000..b8c4f20 --- /dev/null +++ b/src/dev/peerat/framework/TomcatServlet.java @@ -0,0 +1,75 @@ +package dev.peerat.framework; + +import java.io.IOException; +import java.lang.reflect.Method; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jose4j.jwt.consumer.InvalidJwtException; + +public class TomcatServlet extends HttpServlet{ + + private static Router router; + + static void setRouter(Router router){ + TomcatServlet.router = router; + } + + @Override + public void init(ServletConfig config) throws ServletException{ + try{ + String value = config.getInitParameter("router"); + Class clazz = Class.forName(value); + for(Method method : clazz.getDeclaredMethods()){ + if(method.getName().equals("main")) method.invoke(null, new Object[] {null}); + } + }catch(Exception ex){ + throw new RuntimeException(ex); + } + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + Context context = null; + HttpReader reader = null; + HttpWriter writer = null; + try{ + reader = new TomcatHttpReader(request); + writer = new TomcatHttpWriter(response); + context = new Context(RequestType.GET, request.getPathInfo(), isLogin(router, RequestType.GET, reader, writer), writer); + router.exec(context, reader, writer); + writer.flush(); + writer.close(); + }catch(InvalidJwtException e){ + }catch(Exception e){ + if(context != null && context.getResponseCode() == 0){ + try{ + context.response(500); + writer.flush(); + writer.close(); + }catch(Exception ex){} + } + } + if(context != null) router.getLogger().setValue(context); + } + + private User isLogin(Router router, RequestType type, HttpReader reader, HttpWriter writer) throws Exception{ + String auth = reader.getHeader("Authorization"); + if(auth == null) return null; + auth = auth.substring(7); + try{ + return router.getUser(auth); + }catch(InvalidJwtException e){ + try{ + writer.response(401, router.getDefaultHeaders(type)); + writer.flush(); + writer.close(); + }catch(Exception ex){} + throw e; + } + } + +} diff --git a/src/dev/peerat/framework/utils/json/JsonParser.java b/src/dev/peerat/framework/utils/json/JsonParser.java index d51783c..d69a14b 100644 --- a/src/dev/peerat/framework/utils/json/JsonParser.java +++ b/src/dev/peerat/framework/utils/json/JsonParser.java @@ -6,11 +6,11 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import be.jeffcheasey88.peeratcode.parser.Parser; -import be.jeffcheasey88.peeratcode.parser.Token; -import be.jeffcheasey88.peeratcode.parser.TokenType; -import be.jeffcheasey88.peeratcode.parser.state.RedirectStateTree; -import be.jeffcheasey88.peeratcode.parser.state.StateTree; +import dev.peerat.parser.Parser; +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.state.RedirectStateTree; +import dev.peerat.parser.state.StateTree; public class JsonParser extends Parser{ diff --git a/src/dev/peerat/framework/utils/json/JsonTokenizer.java b/src/dev/peerat/framework/utils/json/JsonTokenizer.java index 4271358..c28a08e 100644 --- a/src/dev/peerat/framework/utils/json/JsonTokenizer.java +++ b/src/dev/peerat/framework/utils/json/JsonTokenizer.java @@ -1,8 +1,8 @@ package dev.peerat.framework.utils.json; -import be.jeffcheasey88.peeratcode.parser.Token; -import be.jeffcheasey88.peeratcode.parser.TokenType; -import be.jeffcheasey88.peeratcode.parser.Tokenizer; +import dev.peerat.parser.Token; +import dev.peerat.parser.TokenType; +import dev.peerat.parser.Tokenizer; public class JsonTokenizer extends Tokenizer{