diff --git a/services/git-bridge/pom.xml b/services/git-bridge/pom.xml index e40e172d8c..fbe4058f03 100644 --- a/services/git-bridge/pom.xml +++ b/services/git-bridge/pom.xml @@ -16,10 +16,11 @@ 2.23 4.13.2 2.13.1 - 9.4.57.v20241219 + 12.1.5 + 6.1.0 2.13.2 3.0.3 - 6.10.1.202505221210-r + 7.5.0.202512021534-r 3.41.2.2 2.9.9 1.39.0 @@ -104,17 +105,23 @@ ${jmock.junit4.version} test - - - org.eclipse.jetty - jetty-servlet - ${jetty.servlet.version} - org.eclipse.jetty jetty-server - ${jetty.servlet.version} + ${jetty.version} + + + + org.eclipse.jetty.ee10 + jetty-ee10-servlet + ${jetty.version} + + + + jakarta.servlet + jakarta.servlet-api + ${jakarta.servlet.version} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/GitBridgeApp.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/GitBridgeApp.java index e3cb95226d..ddf5b2d9cd 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/GitBridgeApp.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/GitBridgeApp.java @@ -1,7 +1,7 @@ package uk.ac.ic.wlgitbridge.application; +import jakarta.servlet.ServletException; import java.io.IOException; -import javax.servlet.ServletException; import uk.ac.ic.wlgitbridge.application.config.Config; import uk.ac.ic.wlgitbridge.application.exception.ArgsException; import uk.ac.ic.wlgitbridge.application.exception.ConfigFileException; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/jetty/NullLogger.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/jetty/NullLogger.java deleted file mode 100644 index 4543a59ee0..0000000000 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/application/jetty/NullLogger.java +++ /dev/null @@ -1,60 +0,0 @@ -package uk.ac.ic.wlgitbridge.application.jetty; - -import org.eclipse.jetty.util.log.Logger; - -/* - * Created by Winston on 03/11/14. - */ -public class NullLogger implements Logger { - - @Override - public String getName() { - return "null_logger"; - } - - @Override - public void warn(String s, Object... objects) {} - - @Override - public void warn(Throwable throwable) {} - - @Override - public void warn(String s, Throwable throwable) {} - - @Override - public void info(String s, Object... objects) {} - - @Override - public void info(Throwable throwable) {} - - @Override - public void info(String s, Throwable throwable) {} - - @Override - public boolean isDebugEnabled() { - return false; - } - - @Override - public void setDebugEnabled(boolean b) {} - - @Override - public void debug(String s, Object... objects) {} - - @Override - public void debug(String s, long l) {} - - @Override - public void debug(Throwable throwable) {} - - @Override - public void debug(String s, Throwable throwable) {} - - @Override - public Logger getLogger(String s) { - return this; - } - - @Override - public void ignore(Throwable throwable) {} -} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLReceivePackFactory.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLReceivePackFactory.java index b8392cf1d7..91bd3a3264 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLReceivePackFactory.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLReceivePackFactory.java @@ -1,8 +1,8 @@ package uk.ac.ic.wlgitbridge.git.handler; import com.google.api.client.auth.oauth2.Credential; +import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.ReceivePack; import org.eclipse.jgit.transport.resolver.ReceivePackFactory; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLRepositoryResolver.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLRepositoryResolver.java index d9ddbda26b..99a86a2aa1 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLRepositoryResolver.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLRepositoryResolver.java @@ -1,9 +1,9 @@ package uk.ac.ic.wlgitbridge.git.handler; import com.google.api.client.auth.oauth2.Credential; +import jakarta.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Optional; -import javax.servlet.http.HttpServletRequest; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.ServiceMayNotContinueException; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLUploadPackFactory.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLUploadPackFactory.java index 646d08cd12..bfc30a3f5c 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLUploadPackFactory.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/handler/WLUploadPackFactory.java @@ -1,6 +1,6 @@ package uk.ac.ic.wlgitbridge.git.handler; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.transport.UploadPack; import org.eclipse.jgit.transport.resolver.UploadPackFactory; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServlet.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServlet.java index b29ad78cd6..023a1ee693 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServlet.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServlet.java @@ -1,7 +1,7 @@ package uk.ac.ic.wlgitbridge.git.servlet; -import javax.servlet.ServletException; -import org.eclipse.jetty.servlet.ServletContextHandler; +import jakarta.servlet.ServletException; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jgit.http.server.GitServlet; import uk.ac.ic.wlgitbridge.bridge.Bridge; import uk.ac.ic.wlgitbridge.bridge.repo.RepoStore; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServletConfig.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServletConfig.java index 022382acc7..d7da052be7 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServletConfig.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/servlet/WLGitServletConfig.java @@ -1,9 +1,9 @@ package uk.ac.ic.wlgitbridge.git.servlet; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletContext; import java.util.Enumeration; -import javax.servlet.ServletConfig; -import javax.servlet.ServletContext; -import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; /* * Created by Winston on 02/11/14. diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/util/RepositoryObjectTreeWalker.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/util/RepositoryObjectTreeWalker.java index bdd966166f..aed54610a9 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/util/RepositoryObjectTreeWalker.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/git/util/RepositoryObjectTreeWalker.java @@ -64,7 +64,7 @@ public class RepositoryObjectTreeWalker { String path = treeWalk.getPathString(); ObjectId objectId = treeWalk.getObjectId(0); - if (!repository.hasObject(objectId)) { + if (!repository.getObjectDatabase().has(objectId)) { throw new InvalidGitRepository(); } ObjectLoader obj = repository.open(objectId); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/CORSHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/CORSHandler.java index 10d978c352..372e8d15f0 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/CORSHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/CORSHandler.java @@ -1,14 +1,16 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; import java.util.Set; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.util.Log; -public class CORSHandler extends AbstractHandler { +public class CORSHandler extends Handler.Abstract { private final Set allowedCorsOrigins; public CORSHandler(String[] allowedCorsOrigins) { @@ -16,32 +18,34 @@ public class CORSHandler extends AbstractHandler { } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException { + public boolean handle(Request request, Response response, Callback callback) throws Exception { + HttpField originField = request.getHeaders().getField(HttpHeader.ORIGIN); + String origin = originField != null ? originField.getValue() : null; - String origin = request.getHeader("Origin"); if (origin == null) { - return; // Not a CORS request + return false; // Not a CORS request } final boolean ok = allowedCorsOrigins.contains(origin); if (ok) { - response.setHeader("Access-Control-Allow-Origin", origin); - response.setHeader("Access-Control-Allow-Credentials", "true"); - response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, PUT, POST, DELETE"); - response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type"); - response.setHeader("Access-Control-Max-Age", "86400"); // cache for 24h + response.getHeaders().put("Access-Control-Allow-Origin", origin); + response.getHeaders().put("Access-Control-Allow-Credentials", "true"); + response.getHeaders().put("Access-Control-Allow-Methods", "GET, HEAD, PUT, POST, DELETE"); + response.getHeaders().put("Access-Control-Allow-Headers", "Authorization, Content-Type"); + response.getHeaders().put("Access-Control-Max-Age", "86400"); // cache for 24h } - String method = baseRequest.getMethod(); + String method = request.getMethod(); if ("OPTIONS".equals(method)) { - Log.debug("OPTIONS <- {}", target); - baseRequest.setHandled(true); + String path = Request.getPathInContext(request); + Log.debug("OPTIONS <- {}", path); if (ok) { - response.setStatus(200); + response.setStatus(HttpStatus.OK_200); } else { - response.setStatus(403); + response.setStatus(HttpStatus.FORBIDDEN_403); } + callback.succeeded(); + return true; } + return false; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/DiagnosticsHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/DiagnosticsHandler.java index 064cae7bec..c1fcd61f9b 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/DiagnosticsHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/DiagnosticsHandler.java @@ -1,28 +1,28 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; +import java.io.BufferedWriter; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.lang.management.ManagementFactory; import javax.management.JMException; import javax.management.ObjectName; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.io.Content; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.util.Log; -public class DiagnosticsHandler extends AbstractHandler { +public class DiagnosticsHandler extends Handler.Abstract { public DiagnosticsHandler() {} @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - String method = baseRequest.getMethod(); - if (("GET".equals(method)) && target != null && target.matches("^/diags/?$")) { - baseRequest.setHandled(true); - + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String method = request.getMethod(); + String path = Request.getPathInContext(request); + if (("GET".equals(method)) && path != null && path.matches("^/diags/?$")) { Log.debug(method + " <- /diags"); String detail; @@ -33,18 +33,28 @@ public class DiagnosticsHandler extends AbstractHandler { summary = execute("vmNativeMemory", "summary"); } catch (JMException e) { Log.error("Failed to get native memory detail: " + e.getMessage()); - response.setStatus(500); - return; + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR_500); + callback.succeeded(); + return true; } - response.setContentType("text/plain"); - response.setStatus(200); + response.getHeaders().put("Content-Type", "text/plain"); + response.setStatus(HttpStatus.OK_200); - response.getWriter().write(summary); - response.getWriter().write("\n----------\n\n"); - response.getWriter().write(detail); - response.getWriter().flush(); + Writer writer = + new BufferedWriter(new OutputStreamWriter(Content.Sink.asOutputStream(response))); + try { + writer.write(summary); + writer.write("\n----------\n\n"); + writer.write(detail); + writer.flush(); + } finally { + writer.close(); + callback.succeeded(); + } + return true; } + return false; } public static String execute(String command, String... args) throws JMException { diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java index 20a3c94e0c..b2ce2d0e35 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/FileHandler.java @@ -1,13 +1,12 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.ic.wlgitbridge.bridge.Bridge; @@ -29,26 +28,26 @@ public class FileHandler extends ResourceHandler { } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - if (!"GET".equals(baseRequest.getMethod())) return; - LOG.debug("GET <- {}", baseRequest.getRequestURI()); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + if (!"GET".equals(request.getMethod())) return false; + String path = Request.getPathInContext(request); + LOG.debug("GET <- {}", request.getHttpURI()); - Matcher docKeyMatcher = DOC_KEY_PATTERN.matcher(target); - if (!docKeyMatcher.matches()) return; + Matcher docKeyMatcher = DOC_KEY_PATTERN.matcher(path); + if (!docKeyMatcher.matches()) return false; String docKey = docKeyMatcher.group(1); - String apiKey = request.getParameter("key"); - if (apiKey == null) return; + Fields parameters = Request.getParameters(request); + String apiKey = parameters != null ? parameters.getValue("key") : null; + if (apiKey == null) return false; try { bridge.checkPostbackKey(docKey, apiKey); } catch (InvalidPostbackKeyException e) { LOG.warn("INVALID POST BACK KEY: docKey={} apiKey={}", docKey, apiKey); - return; + return false; } - super.handle(target, baseRequest, request, response); + return super.handle(request, response, callback); } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java index 57d1b34a7b..53c6c62345 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitBridgeServer.java @@ -1,21 +1,23 @@ package uk.ac.ic.wlgitbridge.server; +import jakarta.servlet.DispatcherType; +import jakarta.servlet.Filter; +import jakarta.servlet.ServletException; import java.io.File; import java.net.BindException; import java.nio.file.Paths; import java.util.EnumSet; -import javax.servlet.DispatcherType; -import javax.servlet.Filter; -import javax.servlet.ServletException; +import org.eclipse.jetty.ee10.servlet.FilterHolder; +import org.eclipse.jetty.ee10.servlet.ServletContextHandler; +import org.eclipse.jetty.ee10.servlet.ServletHolder; +import org.eclipse.jetty.ee10.servlet.SessionHandler; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; -import org.eclipse.jetty.server.handler.*; -import org.eclipse.jetty.servlet.FilterHolder; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.eclipse.jetty.server.handler.DefaultHandler; +import org.eclipse.jetty.util.resource.ResourceFactory; import uk.ac.ic.wlgitbridge.application.config.Config; -import uk.ac.ic.wlgitbridge.application.jetty.NullLogger; import uk.ac.ic.wlgitbridge.bridge.Bridge; import uk.ac.ic.wlgitbridge.bridge.db.DBStore; import uk.ac.ic.wlgitbridge.bridge.db.sqlite.SqliteDBStore; @@ -48,7 +50,6 @@ public class GitBridgeServer { private String apiBaseURL; public GitBridgeServer(Config config) throws ServletException { - org.eclipse.jetty.util.log.Log.setLog(new NullLogger()); this.port = config.getPort(); this.rootGitDirectoryPath = config.getRootGitDirectory(); RepoStore repoStore = @@ -109,7 +110,7 @@ public class GitBridgeServer { connector.setIdleTimeout(config.getIdleTimeout()); this.jettyServer.addConnector(connector); - HandlerCollection handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(new CORSHandler(config.getAllowedCorsOrigins())); handlers.addHandler(initApiHandler()); handlers.addHandler(initBaseHandler()); @@ -120,7 +121,7 @@ public class GitBridgeServer { private Handler initBaseHandler() { ContextHandler base = new ContextHandler(); base.setContextPath("/"); - HandlerCollection handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(new StatusHandler(bridge)); handlers.addHandler(new HealthCheckHandler(bridge)); handlers.addHandler(new GitLfsHandler(bridge)); @@ -134,7 +135,7 @@ public class GitBridgeServer { ContextHandler api = new ContextHandler(); api.setContextPath("/api"); - HandlerCollection handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(initResourceHandler()); handlers.addHandler(new PostbackHandler(bridge)); handlers.addHandler(new ProjectDeletionHandler(bridge)); @@ -149,8 +150,8 @@ public class GitBridgeServer { private Handler initGitHandler(Config config, RepoStore repoStore, SnapshotApi snapshotApi) throws ServletException { - final ServletContextHandler servletContextHandler = - new ServletContextHandler(ServletContextHandler.SESSIONS); + final ServletContextHandler servletContextHandler = new ServletContextHandler(); + servletContextHandler.setSessionHandler(new SessionHandler()); if (config.getOauth2Server() != null) { Filter filter = new Oauth2Filter(snapshotApi, config.getOauth2Server(), config.isUserPasswordEnabled()); @@ -166,8 +167,10 @@ public class GitBridgeServer { } private Handler initResourceHandler() { - ResourceHandler resourceHandler = new FileHandler(bridge); - resourceHandler.setResourceBase(new File(rootGitDirectoryPath, ".wlgb/atts").getAbsolutePath()); + FileHandler resourceHandler = new FileHandler(bridge); + File attDir = new File(rootGitDirectoryPath, ".wlgb/atts"); + resourceHandler.setBaseResource( + ResourceFactory.of(resourceHandler).newResource(attDir.toPath())); return resourceHandler; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitLfsHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitLfsHandler.java index 67ab2b3593..bf54985c32 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitLfsHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/GitLfsHandler.java @@ -1,14 +1,16 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.bridge.Bridge; import uk.ac.ic.wlgitbridge.util.Log; -public class GitLfsHandler extends AbstractHandler { +public class GitLfsHandler extends Handler.Abstract { private final Bridge bridge; @@ -17,20 +19,22 @@ public class GitLfsHandler extends AbstractHandler { } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException { - String method = baseRequest.getMethod(); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String method = request.getMethod(); + String path = Request.getPathInContext(request); if (("POST".equals(method)) - && target != null - && target.matches("^/[0-9a-z]+\\.git/info/lfs/objects/batch/?$")) { + && path != null + && path.matches("^/[0-9a-z]+\\.git/info/lfs/objects/batch/?$")) { Log.debug(method + " <- /.git/info/lfs/objects/batch"); - response.setContentType("application/vnd.git-lfs+json"); - response.setStatus(422); - response - .getWriter() - .println("{\"message\": \"ERROR: Git LFS is not supported on Overleaf\"}"); - baseRequest.setHandled(true); + response.getHeaders().put("Content-Type", "application/vnd.git-lfs+json"); + response.setStatus(HttpStatus.UNPROCESSABLE_ENTITY_422); + ByteBuffer responseBuffer = + ByteBuffer.wrap( + "{\"message\": \"ERROR: Git LFS is not supported on Overleaf\"}\n" + .getBytes(StandardCharsets.UTF_8)); + response.write(true, responseBuffer, callback); + return true; } + return false; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java index fe2ad43d65..feff81bc78 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/HealthCheckHandler.java @@ -1,14 +1,16 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.bridge.Bridge; import uk.ac.ic.wlgitbridge.util.Log; -public class HealthCheckHandler extends AbstractHandler { +public class HealthCheckHandler extends Handler.Abstract { private final Bridge bridge; @@ -17,23 +19,24 @@ public class HealthCheckHandler extends AbstractHandler { } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException { - String method = baseRequest.getMethod(); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String method = request.getMethod(); + String path = Request.getPathInContext(request); if (("GET".equals(method) || "HEAD".equals(method)) - && target != null - && target.matches("^/health_check/?$")) { + && path != null + && path.matches("^/health_check/?$")) { Log.debug(method + " <- /health_check"); - baseRequest.setHandled(true); - response.setContentType("text/plain"); + response.getHeaders().put("Content-Type", "text/plain"); if (bridge.healthCheck()) { - response.setStatus(200); - response.getWriter().println("ok"); + response.setStatus(HttpStatus.OK_200); + response.write(true, ByteBuffer.wrap("ok\n".getBytes(StandardCharsets.UTF_8)), callback); } else { - response.setStatus(500); - response.getWriter().println("failed"); + response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR_500); + response.write( + true, ByteBuffer.wrap("failed\n".getBytes(StandardCharsets.UTF_8)), callback); } + return true; } + return false; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java index 586a21ab3f..6ab69fd413 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/Oauth2Filter.java @@ -5,13 +5,13 @@ import com.google.api.client.http.GenericUrl; import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpResponse; +import jakarta.servlet.*; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.*; -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.binary.Base64; import uk.ac.ic.wlgitbridge.bridge.snapshot.SnapshotApi; import uk.ac.ic.wlgitbridge.util.Instance; diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java index a121844ae1..b84839371b 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PostbackHandler.java @@ -2,21 +2,24 @@ package uk.ac.ic.wlgitbridge.server; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; +import jakarta.servlet.ServletException; import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.io.Content; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.bridge.Bridge; import uk.ac.ic.wlgitbridge.snapshot.push.exception.UnexpectedPostbackException; import uk.ac.ic.wlgitbridge.util.Log; -import uk.ac.ic.wlgitbridge.util.Util; /* * Created by Winston on 16/11/14. */ -public class PostbackHandler extends AbstractHandler { +public class PostbackHandler extends Handler.Abstract { private final Bridge bridge; @@ -25,14 +28,13 @@ public class PostbackHandler extends AbstractHandler { } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - Log.debug("PostbackHandler: " + baseRequest.getMethod() + " <- " + baseRequest.getHttpURI()); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String target = Request.getPathInContext(request); + Log.debug("PostbackHandler: " + request.getMethod() + " <- " + request.getHttpURI()); try { if (request.getMethod().equals("POST") && target.endsWith("postback")) { - response.setContentType("application/json"); - String contents = Util.getContentsOfReader(request.getReader()); + response.getHeaders().put("Content-Type", "application/json"); + String contents = Content.Source.asString(request); String[] parts = target.split("/"); if (parts.length < 4) { throw new ServletException(); @@ -46,16 +48,17 @@ public class PostbackHandler extends AbstractHandler { try { postbackContents.processPostback(); } catch (UnexpectedPostbackException e) { - response.setStatus(HttpServletResponse.SC_CONFLICT); + response.setStatus(HttpStatus.CONFLICT_409); body.add("code", new JsonPrimitive("unexpectedPostback")); - response.getWriter().println(body); - baseRequest.setHandled(true); - return; + response.write( + true, ByteBuffer.wrap((body + "\n").getBytes(StandardCharsets.UTF_8)), callback); + return true; } - response.setStatus(HttpServletResponse.SC_OK); + response.setStatus(HttpStatus.OK_200); body.add("code", new JsonPrimitive("success")); - response.getWriter().println(body); - baseRequest.setHandled(true); + response.write( + true, ByteBuffer.wrap((body + "\n").getBytes(StandardCharsets.UTF_8)), callback); + return true; } } catch (IOException e) { Log.warn("IOException when handling postback to target: " + target, e); @@ -67,5 +70,6 @@ public class PostbackHandler extends AbstractHandler { Log.warn("RuntimeException when handling postback to target: " + target, e); throw e; } + return false; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProductionErrorHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProductionErrorHandler.java index ca21a82b7a..e4ebb74106 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProductionErrorHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProductionErrorHandler.java @@ -1,22 +1,17 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.handler.ErrorHandler; +import org.eclipse.jetty.util.Callback; public class ProductionErrorHandler extends ErrorHandler { @Override - public void handle( - String target, - org.eclipse.jetty.server.Request baseRequest, - HttpServletRequest request, - HttpServletResponse response) - throws IOException { - response - .getWriter() - .append("{\"message\":\"HTTP error ") - .append(String.valueOf(response.getStatus())) - .append("\"}"); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String message = "{\"message\":\"HTTP error " + response.getStatus() + "\"}"; + response.write(true, ByteBuffer.wrap(message.getBytes(StandardCharsets.UTF_8)), callback); + return true; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProjectDeletionHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProjectDeletionHandler.java index 731a75ee2e..39a10bd722 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProjectDeletionHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/ProjectDeletionHandler.java @@ -1,15 +1,15 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.bridge.Bridge; -public class ProjectDeletionHandler extends AbstractHandler { +public class ProjectDeletionHandler extends Handler.Abstract { private final Bridge bridge; private final Pattern routePattern = Pattern.compile("^/projects/([0-9a-f]{24})$"); @@ -19,17 +19,18 @@ public class ProjectDeletionHandler extends AbstractHandler { } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException { - String method = baseRequest.getMethod(); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String method = request.getMethod(); + String target = Request.getPathInContext(request); Matcher matcher = routePattern.matcher(target); if (method.equals("DELETE") && target != null && matcher.matches()) { String projectName = matcher.group(1); - response.setContentType("text/plain"); - response.setStatus(204); + response.getHeaders().put("Content-Type", "text/plain"); + response.setStatus(HttpStatus.NO_CONTENT_204); this.bridge.deleteProject(projectName); - baseRequest.setHandled(true); + callback.succeeded(); + return true; } + return false; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PrometheusHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PrometheusHandler.java index 315b458d73..4e57e7f0d9 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PrometheusHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/PrometheusHandler.java @@ -4,44 +4,48 @@ import io.prometheus.client.CollectorRegistry; import io.prometheus.client.exporter.common.TextFormat; import io.prometheus.client.hotspot.DefaultExports; import java.io.BufferedWriter; -import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.Writer; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.util.*; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.http.HttpHeader; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.io.Content; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; +import org.eclipse.jetty.util.Fields; import uk.ac.ic.wlgitbridge.util.Log; -public class PrometheusHandler extends AbstractHandler { +public class PrometheusHandler extends Handler.Abstract { public PrometheusHandler() { DefaultExports.initialize(); } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - String method = baseRequest.getMethod(); - if (("GET".equals(method)) && target != null && target.matches("^/metrics/?$")) { + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String method = request.getMethod(); + String path = Request.getPathInContext(request); + if (("GET".equals(method)) && path != null && path.matches("^/metrics/?$")) { Log.debug(method + " <- /metrics"); - this.printMetrics(request, response); - baseRequest.setHandled(true); + this.printMetrics(request, response, callback); + return true; } + return false; } - private void printMetrics(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { - response.setStatus(200); - String contentType = TextFormat.chooseContentType(request.getHeader("Accept")); - response.setContentType(contentType); + private void printMetrics(Request request, Response response, Callback callback) + throws Exception { + response.setStatus(HttpStatus.OK_200); + HttpField acceptField = request.getHeaders().getField(HttpHeader.ACCEPT); + String accept = acceptField != null ? acceptField.getValue() : null; + String contentType = TextFormat.chooseContentType(accept); + response.getHeaders().put("Content-Type", contentType); - Writer writer = new BufferedWriter(response.getWriter()); + Writer writer = + new BufferedWriter(new OutputStreamWriter(Content.Sink.asOutputStream(response))); try { TextFormat.writeFormat( @@ -51,15 +55,24 @@ public class PrometheusHandler extends AbstractHandler { writer.flush(); } finally { writer.close(); + callback.succeeded(); } } - private Set parse(HttpServletRequest req) { - String[] includedParam = req.getParameterValues("name[]"); - if (includedParam == null) { - return Collections.emptySet(); - } else { + private Set parse(Request req) { + try { + Fields parameters = Request.getParameters(req); + if (parameters == null) { + return Collections.emptySet(); + } + List values = parameters.getValues("name[]"); + if (values == null || values.isEmpty()) { + return Collections.emptySet(); + } + String[] includedParam = values.toArray(new String[0]); return new HashSet(Arrays.asList(includedParam)); + } catch (Exception e) { + return Collections.emptySet(); } } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java index 6750fa0735..5d0ddada5f 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/server/StatusHandler.java @@ -1,14 +1,15 @@ package uk.ac.ic.wlgitbridge.server; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.bridge.Bridge; import uk.ac.ic.wlgitbridge.util.Log; -public class StatusHandler extends AbstractHandler { +public class StatusHandler extends Handler.Abstract { private final Bridge bridge; @@ -17,18 +18,19 @@ public class StatusHandler extends AbstractHandler { } @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException { - String method = baseRequest.getMethod(); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String method = request.getMethod(); + String target = Request.getPathInContext(request); if (("GET".equals(method) || "HEAD".equals(method)) && target != null && target.matches("^/status/?$")) { Log.debug(method + " <- /status"); - baseRequest.setHandled(true); - response.setContentType("text/plain"); - response.setStatus(200); - response.getWriter().println("ok"); + response.setStatus(HttpStatus.OK_200); + response.getHeaders().put("Content-Type", "text/plain"); + response.write( + true, java.nio.ByteBuffer.wrap("ok\n".getBytes(StandardCharsets.UTF_8)), callback); + return true; } + return false; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/base/Request.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/base/Request.java index 4c5f31860a..8471b64793 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/base/Request.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/base/Request.java @@ -8,8 +8,8 @@ import com.google.gson.JsonObject; import java.io.IOException; import java.util.Arrays; import java.util.concurrent.*; -import javax.servlet.http.HttpServletResponse; import org.asynchttpclient.AsyncHttpClient; +import org.eclipse.jetty.http.HttpStatus; import uk.ac.ic.wlgitbridge.snapshot.exception.FailedConnectionException; import uk.ac.ic.wlgitbridge.util.Instance; import uk.ac.ic.wlgitbridge.util.Log; @@ -72,17 +72,16 @@ public abstract class Request { if (cause instanceof HttpResponseException) { HttpResponseException httpCause = (HttpResponseException) cause; int sc = httpCause.getStatusCode(); - if (sc == HttpServletResponse.SC_UNAUTHORIZED - || sc == HttpServletResponse.SC_FORBIDDEN) { // 401, 403 + if (sc == HttpStatus.UNAUTHORIZED_401 || sc == HttpStatus.FORBIDDEN_403) { throw new ForbiddenException(); - } else if (sc == 429) { // Too many requests + } else if (sc == HttpStatus.TOO_MANY_REQUESTS_429) { throw new MissingRepositoryException( Arrays.asList( "Rate-limit exceeded. Please wait a while and try again.", "", "If this is unexpected, please contact us at support@overleaf.com, or", "see https://www.overleaf.com/learn/how-to/Git_integration for more information.")); - } else if (sc == HttpServletResponse.SC_CONFLICT) { // 409 + } else if (sc == HttpStatus.CONFLICT_409) { try { JsonObject json = Instance.gson.fromJson(httpCause.getContent(), JsonObject.class); String code = json.get("code").getAsString(); @@ -105,7 +104,7 @@ public abstract class Request { | NullPointerException _e) { // json parse errors throw new MissingRepositoryException(Arrays.asList("Conflict: 409")); } - } else if (sc == HttpServletResponse.SC_NOT_FOUND) { // 404 + } else if (sc == HttpStatus.NOT_FOUND_404) { try { JsonObject json = Instance.gson.fromJson(httpCause.getContent(), JsonObject.class); String message = json.get("message").getAsString(); diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockOAuthRequestHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockOAuthRequestHandler.java index 278e15f16f..2ef7954206 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockOAuthRequestHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockOAuthRequestHandler.java @@ -1,23 +1,25 @@ package uk.ac.ic.wlgitbridge.snapshot.servermock.server; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; -public class MockOAuthRequestHandler extends AbstractHandler { +public class MockOAuthRequestHandler extends Handler.Abstract { @Override - public void handle( - String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException { - String method = baseRequest.getMethod(); - if (method.equals("GET") && target.equals("/oauth/token/info")) { - response.setContentType("application/json"); - response.setStatus(HttpServletResponse.SC_OK); - response.getWriter().println("{}"); - baseRequest.setHandled(true); + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String method = request.getMethod(); + String path = Request.getPathInContext(request); + if (method.equals("GET") && path.equals("/oauth/token/info")) { + response.getHeaders().put("Content-Type", "application/json"); + response.setStatus(HttpStatus.OK_200); + response.write(true, ByteBuffer.wrap("{}\n".getBytes(StandardCharsets.UTF_8)), callback); + return true; } + return false; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotRequestHandler.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotRequestHandler.java index 53727cf2ab..de6f6a2906 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotRequestHandler.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotRequestHandler.java @@ -1,11 +1,12 @@ package uk.ac.ic.wlgitbridge.snapshot.servermock.server; -import java.io.IOException; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import org.eclipse.jetty.io.Content; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; +import org.eclipse.jetty.server.Response; +import org.eclipse.jetty.util.Callback; import uk.ac.ic.wlgitbridge.snapshot.servermock.exception.InvalidAPICallException; import uk.ac.ic.wlgitbridge.snapshot.servermock.response.*; import uk.ac.ic.wlgitbridge.util.Log; @@ -13,7 +14,7 @@ import uk.ac.ic.wlgitbridge.util.Log; /* * Created by Winston on 09/01/15. */ -public class MockSnapshotRequestHandler extends AbstractHandler { +public class MockSnapshotRequestHandler extends Handler.Abstract { private final SnapshotResponseBuilder responseBuilder; @@ -22,25 +23,25 @@ public class MockSnapshotRequestHandler extends AbstractHandler { } @Override - public void handle( - String target, - final Request baseRequest, - HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException { + public boolean handle(Request request, Response response, Callback callback) throws Exception { + String path = Request.getPathInContext(request); boolean handled; try { + String requestBody = Content.Source.asString(request); final SnapshotResponse snapshotResponse = - responseBuilder.buildWithTarget(target, baseRequest.getMethod()); - response.getWriter().println(snapshotResponse.respond()); - new PostbackThread(baseRequest.getReader(), snapshotResponse.postback()).startIfNotNull(); + responseBuilder.buildWithTarget(path, request.getMethod()); + String responseText = snapshotResponse.respond() + "\n"; + response.write( + true, ByteBuffer.wrap(responseText.getBytes(StandardCharsets.UTF_8)), callback); + new PostbackThread(requestBody, snapshotResponse.postback()).startIfNotNull(); handled = true; } catch (InvalidAPICallException e) { handled = false; } catch (RuntimeException e) { Log.warn("Runtime exception when handling request", e); + callback.succeeded(); handled = true; } - baseRequest.setHandled(handled); + return handled; } } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotServer.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotServer.java index 2f1c0d5886..e9f5ef92b1 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotServer.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/MockSnapshotServer.java @@ -1,11 +1,11 @@ package uk.ac.ic.wlgitbridge.snapshot.servermock.server; import java.io.File; +import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.NetworkConnector; import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.HandlerCollection; -import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; +import org.eclipse.jetty.util.resource.ResourceFactory; import uk.ac.ic.wlgitbridge.snapshot.servermock.response.SnapshotResponseBuilder; import uk.ac.ic.wlgitbridge.snapshot.servermock.state.SnapshotAPIState; import uk.ac.ic.wlgitbridge.util.Log; @@ -23,14 +23,14 @@ public class MockSnapshotServer { server = new Server(port); responseBuilder = new SnapshotResponseBuilder(); - HandlerList handlers = new HandlerList(); + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(new MockOAuthRequestHandler()); handlers.addHandler(getHandlerForResourceBase(resourceBase)); server.setHandler(handlers); } - private HandlerCollection getHandlerForResourceBase(File resourceBase) { - HandlerCollection handlers = new HandlerCollection(); + private Handler.Sequence getHandlerForResourceBase(File resourceBase) { + Handler.Sequence handlers = new Handler.Sequence(); handlers.addHandler(new MockSnapshotRequestHandler(responseBuilder)); handlers.addHandler(resourceHandlerWithBase(resourceBase)); return handlers; @@ -38,7 +38,8 @@ public class MockSnapshotServer { private ResourceHandler resourceHandlerWithBase(File resourceBase) { ResourceHandler resourceHandler = new ResourceHandler(); - resourceHandler.setResourceBase(resourceBase.getAbsolutePath()); + resourceHandler.setBaseResource( + ResourceFactory.of(resourceHandler).newResource(resourceBase.toPath())); return resourceHandler; } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/PostbackThread.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/PostbackThread.java index 0e105ef90a..c3a05a04d9 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/PostbackThread.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/snapshot/servermock/server/PostbackThread.java @@ -4,7 +4,6 @@ import static org.asynchttpclient.Dsl.*; import com.google.gson.Gson; import com.google.gson.JsonObject; -import java.io.Reader; import java.util.concurrent.ExecutionException; import uk.ac.ic.wlgitbridge.util.Log; @@ -16,9 +15,9 @@ public class PostbackThread extends Thread { private String url; private String postback; - public PostbackThread(Reader reader, String postback) { - if (postback != null) { - url = new Gson().fromJson(reader, JsonObject.class).get("postbackUrl").getAsString(); + public PostbackThread(String requestBody, String postback) { + if (postback != null && requestBody != null && !requestBody.isEmpty()) { + url = new Gson().fromJson(requestBody, JsonObject.class).get("postbackUrl").getAsString(); this.postback = postback; } }