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{